diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-06-15 17:48:17 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-06-15 18:03:20 +0200 |
commit | 42e41ea6d6ec40977cc339af529b2306840d31cb (patch) | |
tree | 6cc0d842d20e96ea37c39a4d7ff40472467f8935 /filter | |
parent | 6c14d15dbbdc8920e1695b5fdc32b6519508815d (diff) |
move DTTM2DateTime and DateTimeToOString to msfilter to avoid copy&paste
Diffstat (limited to 'filter')
-rw-r--r-- | filter/inc/filter/msfilter/util.hxx | 16 | ||||
-rw-r--r-- | filter/source/msfilter/util.cxx | 78 |
2 files changed, 94 insertions, 0 deletions
diff --git a/filter/inc/filter/msfilter/util.hxx b/filter/inc/filter/msfilter/util.hxx index 2dc5fa7f3966..ff5220900748 100644 --- a/filter/inc/filter/msfilter/util.hxx +++ b/filter/inc/filter/msfilter/util.hxx @@ -30,6 +30,7 @@ #define INCLUDED_MSFILTER_UTIL_HXX #include <rtl/textenc.h> +#include <tools/datetime.hxx> #include <com/sun/star/lang/Locale.hpp> #include "filter/msfilter/msfilterdllapi.h" @@ -43,6 +44,21 @@ MSFILTER_DLLPUBLIC rtl_TextEncoding getBestTextEncodingFromLocale(const ::com::s /// Convert a color in BGR format to RGB. MSFILTER_DLLPUBLIC sal_uInt32 BGRToRGB(sal_uInt32 nColour); + +/** Convert from DTTM to Writer's DateTime + + @author + <a href="mailto:mmaher@openoffice.org">Martin Maher</a + */ +MSFILTER_DLLPUBLIC DateTime DTTM2DateTime( long lDTTM ); + +/** Convert DateTime to xsd::dateTime string. + +I guess there must be an implementation of this somewhere in LO, but I failed +to find it, unfortunately :-( +*/ +MSFILTER_DLLPUBLIC rtl::OString DateTimeToOString( const DateTime& rDateTime ); + } } diff --git a/filter/source/msfilter/util.cxx b/filter/source/msfilter/util.cxx index 03df8afb583a..adfe49222955 100644 --- a/filter/source/msfilter/util.cxx +++ b/filter/source/msfilter/util.cxx @@ -27,6 +27,7 @@ */ #include <rtl/ustring.hxx> +#include <rtl/strbuf.hxx> #include <vcl/svapp.hxx> #include <filter/msfilter/util.hxx> @@ -62,6 +63,83 @@ sal_uInt32 BGRToRGB(sal_uInt32 nColor) return nColor; } +DateTime DTTM2DateTime( long lDTTM ) +{ + /* + mint short :6 0000003F minutes (0-59) + hr short :5 000007C0 hours (0-23) + dom short :5 0000F800 days of month (1-31) + mon short :4 000F0000 months (1-12) + yr short :9 1FF00000 years (1900-2411)-1900 + wdy short :3 E0000000 weekday(Sunday=0 + Monday=1 + ( wdy can be ignored ) Tuesday=2 + Wednesday=3 + Thursday=4 + Friday=5 + Saturday=6) + */ + DateTime aDateTime(Date( 0 ), Time( 0 )); + if( lDTTM ) + { + sal_uInt16 lMin = (sal_uInt16)(lDTTM & 0x0000003F); + lDTTM >>= 6; + sal_uInt16 lHour= (sal_uInt16)(lDTTM & 0x0000001F); + lDTTM >>= 5; + sal_uInt16 lDay = (sal_uInt16)(lDTTM & 0x0000001F); + lDTTM >>= 5; + sal_uInt16 lMon = (sal_uInt16)(lDTTM & 0x0000000F); + lDTTM >>= 4; + sal_uInt16 lYear= (sal_uInt16)(lDTTM & 0x000001FF) + 1900; + aDateTime = DateTime(Date(lDay, lMon, lYear), Time(lHour, lMin)); + } + return aDateTime; +} + +/// Append the number as 2-digit when less than 10. +static void lcl_AppendTwoDigits( rtl::OStringBuffer &rBuffer, sal_Int32 nNum ) +{ + if ( nNum < 0 || nNum > 99 ) + { + rBuffer.append( "00" ); + return; + } + + if ( nNum < 10 ) + rBuffer.append( '0' ); + + rBuffer.append( nNum ); +} + +rtl::OString DateTimeToOString( const DateTime& rDateTime ) +{ + DateTime aInUTC( rDateTime ); +// HACK: this is correct according to the spec, but MSOffice believes everybody lives +// in UTC+0 when reading it back +// aInUTC.ConvertToUTC(); + + rtl::OStringBuffer aBuffer( 25 ); + aBuffer.append( sal_Int32( aInUTC.GetYear() ) ); + aBuffer.append( '-' ); + + lcl_AppendTwoDigits( aBuffer, aInUTC.GetMonth() ); + aBuffer.append( '-' ); + + lcl_AppendTwoDigits( aBuffer, aInUTC.GetDay() ); + aBuffer.append( 'T' ); + + lcl_AppendTwoDigits( aBuffer, aInUTC.GetHour() ); + aBuffer.append( ':' ); + + lcl_AppendTwoDigits( aBuffer, aInUTC.GetMin() ); + aBuffer.append( ':' ); + + lcl_AppendTwoDigits( aBuffer, aInUTC.GetSec() ); + aBuffer.append( 'Z' ); // we are in UTC + + return aBuffer.makeStringAndClear(); +} + } } |