[Libreoffice-commits] .: sfx2/source

Caolán McNamara caolan at kemper.freedesktop.org
Tue Aug 9 07:48:42 PDT 2011


 sfx2/source/doc/oleprops.cxx |   99 ++++++++++++++++++++++++++++++++++++++++++-
 sfx2/source/doc/oleprops.hxx |    8 +++
 2 files changed, 104 insertions(+), 3 deletions(-)

New commits:
commit 708f8c2373df89e6d267abe23d18e95f77e0036f
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Aug 9 15:46:57 2011 +0100

    Resolves: fdo#38981 implement saving/loading PROPVARIANT::DATE ole2 property

diff --git a/sfx2/source/doc/oleprops.cxx b/sfx2/source/doc/oleprops.cxx
index 6170d91..3168c12 100644
--- a/sfx2/source/doc/oleprops.cxx
+++ b/sfx2/source/doc/oleprops.cxx
@@ -54,6 +54,7 @@ using namespace ::com::sun::star;
 
 #define TIMESTAMP_INVALID_DATETIME      ( DateTime ( Date ( 1, 1, 1601 ), Time ( 0, 0, 0 ) ) )  /// Invalid value for date and time to create invalid instance of TimeStamp.
 #define TIMESTAMP_INVALID_UTILDATETIME  ( util::DateTime ( 0, 0, 0, 0, 1, 1, 1601 ) )   /// Invalid value for date and time to create invalid instance of TimeStamp.
+#define TIMESTAMP_INVALID_UTILDATE  ( util::Date ( 1, 1, 1601 ) )   /// Invalid value for date to create invalid instance of TimeStamp.
 
 static
 bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight)
@@ -67,6 +68,14 @@ bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight)
         && i_rLeft.HundredthSeconds == i_rRight.HundredthSeconds;
 }
 
+static
+bool operator==(const util::Date &i_rLeft, const util::Date &i_rRight)
+{
+    return i_rLeft.Year             == i_rRight.Year
+        && i_rLeft.Month            == i_rRight.Month
+        && i_rLeft.Day              == i_rRight.Day;
+}
+
 // ============================================================================
 
 /** Property representing a signed 32-bit integer value. */
@@ -204,6 +213,27 @@ private:
     util::DateTime      maDateTime;
 };
 
+/** Property representing a filetime value as defined by the Windows API. */
+class SfxOleDateProperty : public SfxOlePropertyBase
+{
+public:
+    explicit            SfxOleDateProperty( sal_Int32 nPropId );
+    /** @param rDate  Date as LOCAL time. */
+    explicit            SfxOleDateProperty( sal_Int32 nPropId, const util::Date& rDate );
+
+    /** Returns the date value as LOCAL time. */
+    inline const util::Date& GetValue() const { return maDate; }
+    /** @param rDate  Date as LOCAL time. */
+    inline void         SetValue( const util::Date& rDate ) { maDate = rDate; }
+
+private:
+    virtual void        ImplLoad( SvStream& rStrm );
+    virtual void        ImplSave( SvStream& rStrm );
+
+private:
+    util::Date      maDate;
+};
+
 // ============================================================================
 
 /** Property representing a thumbnail picture.
@@ -615,6 +645,39 @@ void SfxOleFileTimeProperty::ImplSave( SvStream& rStrm )
     rStrm << nLower << nUpper;
 }
 
+SfxOleDateProperty::SfxOleDateProperty( sal_Int32 nPropId ) :
+    SfxOlePropertyBase( nPropId, PROPTYPE_DATE )
+{
+}
+
+SfxOleDateProperty::SfxOleDateProperty( sal_Int32 nPropId, const util::Date& rDate ) :
+    SfxOlePropertyBase( nPropId, PROPTYPE_DATE ),
+    maDate( rDate )
+{
+}
+
+void SfxOleDateProperty::ImplLoad( SvStream& rStrm )
+{
+    double fValue(0.0);
+    rStrm >> fValue;
+    //stored as number of days (not seconds) since December 31, 1899
+    ::Date aDate(31, 12, 1899);
+    long nDays = fValue;
+    aDate += nDays;
+    maDate.Day = aDate.GetDay();
+    maDate.Month = aDate.GetMonth();
+    maDate.Year = aDate.GetYear();
+}
+
+void SfxOleDateProperty::ImplSave( SvStream& rStrm )
+{
+    long nDays = ::Date::DateToDays(maDate.Day, maDate.Month, maDate.Year);
+    //number of days (not seconds) since December 31, 1899
+    long nStartDays = ::Date::DateToDays(31, 12, 1899);
+    double fValue = nDays-nStartDays;
+    rStrm << fValue;
+}
+
 // ----------------------------------------------------------------------------
 
 SfxOleThumbnailProperty::SfxOleThumbnailProperty(
@@ -810,6 +873,21 @@ bool SfxOleSection::GetFileTimeValue( util::DateTime& rValue, sal_Int32 nPropId
     return pProp != 0;
 }
 
+bool SfxOleSection::GetDateValue( util::Date& rValue, sal_Int32 nPropId ) const
+{
+    SfxOlePropertyRef xProp = GetProperty( nPropId );
+    const SfxOleDateProperty* pProp =
+        dynamic_cast< const SfxOleDateProperty* >( xProp.get() );
+    if( pProp )
+    {
+        if ( pProp->GetValue() == TIMESTAMP_INVALID_UTILDATE )
+            rValue = util::Date();
+        else
+            rValue = pProp->GetValue();
+    }
+    return pProp != 0;
+}
+
 void SfxOleSection::SetProperty( SfxOlePropertyRef xProp )
 {
     if( xProp.get() )
@@ -847,6 +925,14 @@ void SfxOleSection::SetFileTimeValue( sal_Int32 nPropId, const util::DateTime& r
         SetProperty( SfxOlePropertyRef( new SfxOleFileTimeProperty( nPropId, rValue ) ) );
 }
 
+void SfxOleSection::SetDateValue( sal_Int32 nPropId, const util::Date& rValue )
+{
+    if ( rValue.Year == 0 || rValue.Month == 0 || rValue.Day == 0 )
+        SetProperty( SfxOlePropertyRef( new SfxOleDateProperty( nPropId, TIMESTAMP_INVALID_UTILDATE ) ) );
+    else
+        SetProperty( SfxOlePropertyRef( new SfxOleDateProperty( nPropId, rValue ) ) );
+}
+
 void SfxOleSection::SetThumbnailValue( sal_Int32 nPropId,
     const uno::Sequence<sal_uInt8> & i_rData)
 {
@@ -874,6 +960,7 @@ Any SfxOleSection::GetAnyValue( sal_Int32 nPropId ) const
     bool bBool = false;
     String aString;
     ::com::sun::star::util::DateTime aApiDateTime;
+    ::com::sun::star::util::Date aApiDate;
 
     if( GetInt32Value( nInt32, nPropId ) )
         aValue <<= nInt32;
@@ -887,6 +974,10 @@ Any SfxOleSection::GetAnyValue( sal_Int32 nPropId ) const
     {
         aValue <<= aApiDateTime;
     }
+    else if( GetDateValue( aApiDate, nPropId ) )
+    {
+        aValue <<= aApiDate;
+    }
     return aValue;
 }
 
@@ -897,6 +988,7 @@ bool SfxOleSection::SetAnyValue( sal_Int32 nPropId, const Any& rValue )
     double fDouble = 0.0;
     OUString aString;
     ::com::sun::star::util::DateTime aApiDateTime;
+    ::com::sun::star::util::Date aApiDate;
 
     if( rValue.getValueType() == ::getBooleanCppuType() )
         SetBoolValue( nPropId, ::comphelper::getBOOL( rValue ) == sal_True );
@@ -907,9 +999,9 @@ bool SfxOleSection::SetAnyValue( sal_Int32 nPropId, const Any& rValue )
     else if( rValue >>= aString )
         bInserted = SetStringValue( nPropId, aString );
     else if( rValue >>= aApiDateTime )
-    {
         SetFileTimeValue( nPropId, aApiDateTime );
-    }
+    else if( rValue >>= aApiDate )
+        SetDateValue( nPropId, aApiDate );
     else
         bInserted = false;
     return bInserted;
@@ -1059,6 +1151,9 @@ void SfxOleSection::LoadProperty( SvStream& rStrm, sal_Int32 nPropId )
         case PROPTYPE_FILETIME:
             xProp.reset( new SfxOleFileTimeProperty( nPropId ) );
         break;
+        case PROPTYPE_DATE:
+            xProp.reset( new SfxOleDateProperty( nPropId ) );
+        break;
     }
     // load property contents
     if( xProp.get() )
diff --git a/sfx2/source/doc/oleprops.hxx b/sfx2/source/doc/oleprops.hxx
index 7e441a7..8533732 100644
--- a/sfx2/source/doc/oleprops.hxx
+++ b/sfx2/source/doc/oleprops.hxx
@@ -32,6 +32,7 @@
 #include <vcl/bitmapex.hxx>
 
 #include <com/sun/star/util/DateTime.hpp>
+#include <com/sun/star/util/Date.hpp>
 
 
 // ============================================================================
@@ -299,12 +300,15 @@ public:
     /** Returns the value of a time stamp property with the passed ID in rValue.
         @return  true = Property found, rValue is valid; false = Property not found. */
     bool                GetFileTimeValue( ::com::sun::star::util::DateTime& rValue, sal_Int32 nPropId ) const;
+    /** Returns the value of a date property with the passed ID in rValue.
+        @return  true = Property found, rValue is valid; false = Property not found. */
+    bool                GetDateValue( ::com::sun::star::util::Date& rValue, sal_Int32 nPropId ) const;
 
     /** Adds the passed property to the property set. Drops an existing old property. */
     void                SetProperty( SfxOlePropertyRef xProp );
     /** Inserts a signed int32 property with the passed value. */
     void                SetInt32Value( sal_Int32 nPropId, sal_Int32 nValue );
-    /** Inserts a foating-point property with the passed value. */
+    /** Inserts a floating-point property with the passed value. */
     void                SetDoubleValue( sal_Int32 nPropId, double fValue );
     /** Inserts a boolean property with the passed value. */
     void                SetBoolValue( sal_Int32 nPropId, bool bValue );
@@ -313,6 +317,8 @@ public:
     bool                SetStringValue( sal_Int32 nPropId, const String& rValue, bool bSkipEmpty = true );
     /** Inserts a time stamp property with the passed value. */
     void                SetFileTimeValue( sal_Int32 nPropId, const ::com::sun::star::util::DateTime& rValue );
+    /** Inserts a date property with the passed value. */
+    void                SetDateValue( sal_Int32 nPropId, const ::com::sun::star::util::Date& rValue );
     /** Inserts a thumbnail property from the passed meta file. */
     void                SetThumbnailValue( sal_Int32 nPropId,
                             const ::com::sun::star::uno::Sequence<sal_uInt8> & i_rData);


More information about the Libreoffice-commits mailing list