Blame SOURCES/0041-bnc-885548-Adjust-xlsx-export-of-revisions-to-get-it.patch

f085be
From 766d54154f5225c9dc91ed8e4863d3fca1bd2b90 Mon Sep 17 00:00:00 2001
f085be
From: Kohei Yoshida <kohei.yoshida@collabora.com>
f085be
Date: Thu, 17 Jul 2014 20:20:16 -0400
f085be
Subject: [PATCH 041/137] bnc#885548: Adjust xlsx export of revisions to get it
f085be
 to work in Excel.
f085be
f085be
(cherry picked from commit fa44673e154ed4fb0b518b8850e2f6e4b9069531)
f085be
Signed-off-by: Andras Timar <andras.timar@collabora.com>
f085be
f085be
Conflicts:
f085be
	sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
	sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
	sc/inc/cellvalue.hxx
f085be
	sc/source/core/data/cellvalue.cxx
f085be
f085be
Change-Id: I0058d9ddfea545390e615a3030171a366e333c85
f085be
(cherry picked from commit ca20a53315eaea218c693e0de2026eb6f957331f)
f085be
Signed-off-by: Andras Timar <andras.timar@collabora.com>
f085be
---
f085be
 sc/inc/cellvalue.hxx                         |   1 +
f085be
 sc/source/core/data/cellvalue.cxx            |   7 +
f085be
 sc/source/filter/excel/xestream.cxx          |   7 +
f085be
 sc/source/filter/inc/XclExpChangeTrack.hxx   |  84 ++++---
f085be
 sc/source/filter/inc/xestream.hxx            |  10 +
f085be
 sc/source/filter/xcl97/XclExpChangeTrack.cxx | 346 +++++++++++++++++----------
f085be
 6 files changed, 299 insertions(+), 156 deletions(-)
f085be
f085be
diff --git a/sc/inc/cellvalue.hxx b/sc/inc/cellvalue.hxx
f085be
index c2606b5..8e2e64a 100644
f085be
--- a/sc/inc/cellvalue.hxx
f085be
+++ b/sc/inc/cellvalue.hxx
f085be
@@ -53,6 +53,7 @@ struct SC_DLLPUBLIC ScCellValue
f085be
     void set( double fValue );
f085be
     void set( const svl::SharedString& rStr );
f085be
     void set( const EditTextObject& rEditText );
f085be
+    void set( EditTextObject* pEditText );
f085be
     void set( const ScFormulaCell& rFormula );
f085be
     void set( ScFormulaCell* pFormula );
f085be
 
f085be
diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx
f085be
index 12ef302..92298cf 100644
f085be
--- a/sc/source/core/data/cellvalue.cxx
f085be
+++ b/sc/source/core/data/cellvalue.cxx
f085be
@@ -248,6 +248,13 @@ void ScCellValue::set( const EditTextObject& rEditText )
f085be
     mpEditText = rEditText.Clone();
f085be
 }
f085be
 
f085be
+void ScCellValue::set( EditTextObject* pEditText )
f085be
+{
f085be
+    clear();
f085be
+    meType = CELLTYPE_EDIT;
f085be
+    mpEditText = pEditText;
f085be
+}
f085be
+
f085be
 void ScCellValue::set( const ScFormulaCell& rFormula )
f085be
 {
f085be
     clear();
f085be
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
f085be
index df08d2c..47dba9e 100644
f085be
--- a/sc/source/filter/excel/xestream.cxx
f085be
+++ b/sc/source/filter/excel/xestream.cxx
f085be
@@ -842,6 +842,13 @@ const char* XclXmlUtils::ToPsz( bool b )
f085be
     return b ? "true" : "false";
f085be
 }
f085be
 
f085be
+const char* XclXmlUtils::ToPsz10( bool b )
f085be
+{
f085be
+    // xlsx seems to use "1" or "0" for boolean values.  I wonder it ever uses
f085be
+    // the "true" "false" variant.
f085be
+    return b ? "1" : "0";
f085be
+}
f085be
+
f085be
 sax_fastparser::FSHelperPtr XclXmlUtils::WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int32 nValue )
f085be
 {
f085be
     pStream->startElement( nElement, FSEND );
f085be
diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
index 6651a75..72b7066 100644
f085be
--- a/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
+++ b/sc/source/filter/inc/XclExpChangeTrack.hxx
f085be
@@ -29,7 +29,16 @@
f085be
 #include "ftools.hxx"
f085be
 #include "excrecds.hxx"
f085be
 
f085be
-//___________________________________________________________________
f085be
+#include <boost/ptr_container/ptr_vector.hpp>
f085be
+
f085be
+class ExcXmlRecord : public ExcRecord
f085be
+{
f085be
+public:
f085be
+    virtual sal_Size    GetLen() const SAL_OVERRIDE;
f085be
+    virtual sal_uInt16  GetNum() const SAL_OVERRIDE;
f085be
+    virtual void        Save( XclExpStream& rStrm ) SAL_OVERRIDE;
f085be
+};
f085be
+
f085be
 // XclExpUserBView - one UserBView record for each user
f085be
 
f085be
 class XclExpUserBView : public ExcRecord
f085be
@@ -238,42 +247,61 @@ public:
f085be
     virtual void                SaveXml( XclExpXmlStream& rStrm );
f085be
 };
f085be
 
f085be
-//___________________________________________________________________
f085be
+class XclExpXmlChTrHeaders : public ExcXmlRecord
f085be
+{
f085be
+    sal_uInt8 maGUID[16];
f085be
+public:
f085be
+    void SetGUID( const sal_uInt8* pGUID );
f085be
+
f085be
+    virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
f085be
+};
f085be
+
f085be
+class XclExpChTrTabIdBuffer;
f085be
+class XclExpChTrAction;
f085be
+
f085be
+class XclExpXmlChTrHeader : public ExcXmlRecord
f085be
+{
f085be
+    OUString maUserName;
f085be
+    DateTime maDateTime;
f085be
+    sal_uInt8 maGUID[16];
f085be
+    sal_Int32 mnLogNumber;
f085be
+    sal_uInt32 mnMinAction;
f085be
+    sal_uInt32 mnMaxAction;
f085be
+
f085be
+    std::vector<sal_uInt16> maTabBuffer;
f085be
+    std::vector<XclExpChTrAction*> maActions;
f085be
+
f085be
+public:
f085be
+    XclExpXmlChTrHeader(
f085be
+        const OUString& rUserName, const DateTime& rDateTime, const sal_uInt8* pGUID,
f085be
+        sal_Int32 nLogNumber, const XclExpChTrTabIdBuffer& rBuf );
f085be
+
f085be
+    virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
f085be
+
f085be
+    void AppendAction( XclExpChTrAction* pAction );
f085be
+};
f085be
+
f085be
 // XclExpChTrInfo - header of action group of a user
f085be
 
f085be
 class XclExpChTrInfo : public ExcRecord
f085be
 {
f085be
 private:
f085be
     XclExpString                sUsername;
f085be
-    sal_Int32                   mnLogNumber;
f085be
     DateTime                    aDateTime;
f085be
     sal_uInt8                   aGUID[ 16 ];
f085be
 
f085be
     virtual void                SaveCont( XclExpStream& rStrm );
f085be
 
f085be
 public:
f085be
-    inline                      XclExpChTrInfo(
f085be
-                                    const OUString& rUsername,
f085be
-                                    const DateTime& rDateTime,
f085be
-                                    const sal_uInt8* pGUID,
f085be
-                                    sal_Int32 nLogNumber );
f085be
+    XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime,
f085be
+                    const sal_uInt8* pGUID );
f085be
+
f085be
     virtual                     ~XclExpChTrInfo();
f085be
 
f085be
     virtual sal_uInt16              GetNum() const;
f085be
     virtual sal_Size            GetLen() const;
f085be
-
f085be
-    virtual void                SaveXml( XclExpXmlStream& rStrm );
f085be
 };
f085be
 
f085be
-inline XclExpChTrInfo::XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID, sal_Int32 nLogNumber ) :
f085be
-    sUsername( rUsername ),
f085be
-    mnLogNumber( nLogNumber ),
f085be
-    aDateTime( rDateTime )
f085be
-{
f085be
-    memcpy( aGUID, pGUID, 16 );
f085be
-}
f085be
-
f085be
-//___________________________________________________________________
f085be
 // XclExpChTrTabIdBuffer - buffer for tab id's
f085be
 
f085be
 class XclExpChTrTabIdBuffer
f085be
@@ -309,7 +337,6 @@ class XclExpChTrTabId : public ExcRecord
f085be
 private:
f085be
     sal_uInt16*                 pBuffer;
f085be
     sal_uInt16                  nTabCount;
f085be
-    bool                        mbInRevisionHeaders;
f085be
 
f085be
     inline void                 Clear() { if( pBuffer ) delete[] pBuffer; pBuffer = NULL; }
f085be
 
f085be
@@ -317,16 +344,14 @@ private:
f085be
 
f085be
 public:
f085be
     inline                      XclExpChTrTabId( sal_uInt16 nCount ) :
f085be
-                                    pBuffer( NULL ), nTabCount( nCount ), mbInRevisionHeaders( false ) {}
f085be
-                                XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders = false );
f085be
+                                    pBuffer( NULL ), nTabCount( nCount ) {}
f085be
+                                XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer );
f085be
     virtual                     ~XclExpChTrTabId();
f085be
 
f085be
     void                        Copy( const XclExpChTrTabIdBuffer& rBuffer );
f085be
 
f085be
     virtual sal_uInt16              GetNum() const;
f085be
     virtual sal_Size            GetLen() const;
f085be
-
f085be
-    virtual void                SaveXml( XclExpXmlStream& rStrm );
f085be
 };
f085be
 
f085be
 //___________________________________________________________________
f085be
@@ -375,8 +400,7 @@ protected:
f085be
                                 // do something after writing the record
f085be
     virtual void                CompleteSaveAction( XclExpStream& rStrm ) const;
f085be
 
f085be
-    inline sal_uInt32           GetActionNumber() const { return nIndex; }
f085be
-    inline sal_Bool             GetAccepted() const { return bAccepted; }
f085be
+    inline bool                 GetAccepted() const { return bAccepted; }
f085be
 
f085be
 public:
f085be
                                 XclExpChTrAction(
f085be
@@ -399,6 +423,7 @@ public:
f085be
     virtual sal_Size            GetLen() const;
f085be
 
f085be
     inline XclExpChTrAction*    GetAddAction() { return pAddAction; }
f085be
+    inline sal_uInt32           GetActionNumber() const { return nIndex; }
f085be
 };
f085be
 
f085be
 inline void XclExpChTrAction::Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const
f085be
@@ -589,11 +614,12 @@ public:
f085be
 
f085be
 class XclExpChangeTrack : protected XclExpRoot
f085be
 {
f085be
-private:
f085be
-    std::vector<ExcRecord*>       aRecList;           // list of "Revision Log" stream records
f085be
+    typedef boost::ptr_vector<ExcRecord> RecListType;
f085be
+    typedef boost::ptr_vector<XclExpChTrTabIdBuffer> TabIdBufferType;
f085be
+    RecListType maRecList;           // list of "Revision Log" stream records
f085be
     std::stack<XclExpChTrAction*> aActionStack;
f085be
     XclExpChTrTabIdBuffer*        pTabIdBuffer;
f085be
-    std::vector<XclExpChTrTabIdBuffer*> maBuffers;
f085be
+    TabIdBufferType maBuffers;
f085be
 
f085be
     ScDocument*                 pTempDoc;           // empty document
f085be
 
f085be
diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx
f085be
index e29ed1a..f33f0c0 100644
f085be
--- a/sc/source/filter/inc/xestream.hxx
f085be
+++ b/sc/source/filter/inc/xestream.hxx
f085be
@@ -286,8 +286,18 @@ public:
f085be
     static OUString ToOUString( const ScfUInt16Vec& rBuffer, sal_Int32 nStart = 0, sal_Int32 nLength = -1 );
f085be
     static OUString ToOUString( ScDocument& rDocument, const ScAddress& rAddress, const ScTokenArray* pTokenArray );
f085be
     static OUString ToOUString( const XclExpString& s );
f085be
+
f085be
+    /**
f085be
+     * @return const char* literal "true" for true value, or literal "false"
f085be
+     *         for false value.
f085be
+     */
f085be
     static const char* ToPsz( bool b );
f085be
 
f085be
+    /**
f085be
+     * @return literal "1" for true value, or literal "0" for false value.
f085be
+     */
f085be
+    static const char* ToPsz10( bool b );
f085be
+
f085be
     static sax_fastparser::FSHelperPtr  WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int32 nValue );
f085be
     static sax_fastparser::FSHelperPtr  WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int64 nValue );
f085be
     static sax_fastparser::FSHelperPtr  WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, const char* sValue );
f085be
diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
index 4589aea..aed0322 100644
f085be
--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
+++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
f085be
@@ -40,7 +40,7 @@ static OString lcl_GuidToOString( sal_uInt8 aGuid[ 16 ] )
f085be
 {
f085be
     char sBuf[ 40 ];
f085be
     snprintf( sBuf, sizeof( sBuf ),
f085be
-            "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
f085be
+            "{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
f085be
             aGuid[ 0 ], aGuid[ 1 ], aGuid[ 2 ], aGuid[ 3 ], aGuid[ 4 ], aGuid[ 5 ], aGuid[ 6 ], aGuid[ 7 ],
f085be
             aGuid[ 8 ], aGuid[ 9 ], aGuid[ 10 ], aGuid[ 11 ], aGuid[ 12 ], aGuid[ 13 ], aGuid[ 14 ], aGuid[ 15 ] );
f085be
     return OString( sBuf );
f085be
@@ -394,7 +394,149 @@ void XclExpChTrHeader::SaveXml( XclExpXmlStream& rRevisionHeadersStrm )
f085be
     pHeaders->write( ">" );
f085be
 }
f085be
 
f085be
-//___________________________________________________________________
f085be
+void XclExpXmlChTrHeaders::SetGUID( const sal_uInt8* pGUID )
f085be
+{
f085be
+    memcpy(maGUID, pGUID, 16);
f085be
+}
f085be
+
f085be
+void XclExpXmlChTrHeaders::SaveXml( XclExpXmlStream& rStrm )
f085be
+{
f085be
+    sax_fastparser::FSHelperPtr pHeaders = rStrm.GetCurrentStream();
f085be
+
f085be
+    pHeaders->write("<")->writeId(XML_headers);
f085be
+
f085be
+    rStrm.WriteAttributes(
f085be
+        XML_xmlns,              "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
f085be
+        FSNS(XML_xmlns, XML_r), "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
f085be
+        XML_guid,               lcl_GuidToOString(maGUID).getStr(),
f085be
+        XML_lastGuid,           NULL,   // OOXTODO
f085be
+        XML_shared,             NULL,   // OOXTODO
f085be
+        XML_diskRevisions,      NULL,   // OOXTODO
f085be
+        XML_history,            NULL,   // OOXTODO
f085be
+        XML_trackRevisions,     NULL,   // OOXTODO
f085be
+        XML_exclusive,          NULL,   // OOXTODO
f085be
+        XML_revisionId,         NULL,   // OOXTODO
f085be
+        XML_version,            NULL,   // OOXTODO
f085be
+        XML_keepChangeHistory,  NULL,   // OOXTODO
f085be
+        XML_protected,          NULL,   // OOXTODO
f085be
+        XML_preserveHistory,    NULL,   // OOXTODO
f085be
+        FSEND);
f085be
+
f085be
+    pHeaders->write(">");
f085be
+}
f085be
+
f085be
+XclExpXmlChTrHeader::XclExpXmlChTrHeader(
f085be
+    const OUString& rUserName, const DateTime& rDateTime, const sal_uInt8* pGUID,
f085be
+    sal_Int32 nLogNumber, const XclExpChTrTabIdBuffer& rBuf ) :
f085be
+    maUserName(rUserName), maDateTime(rDateTime), mnLogNumber(nLogNumber),
f085be
+    mnMinAction(0), mnMaxAction(0)
f085be
+{
f085be
+    memcpy(maGUID, pGUID, 16);
f085be
+    if (rBuf.GetBufferCount())
f085be
+    {
f085be
+        maTabBuffer.resize(rBuf.GetBufferCount());
f085be
+        rBuf.GetBufferCopy(&maTabBuffer[0]);
f085be
+    }
f085be
+}
f085be
+
f085be
+void XclExpXmlChTrHeader::SaveXml( XclExpXmlStream& rStrm )
f085be
+{
f085be
+    sax_fastparser::FSHelperPtr pHeader = rStrm.GetCurrentStream();
f085be
+
f085be
+    pHeader->write("<")->writeId(XML_header);
f085be
+
f085be
+    OUString aRelId;
f085be
+    sax_fastparser::FSHelperPtr pRevLogStrm = rStrm.CreateOutputStream(
f085be
+            XclXmlUtils::GetStreamName("xl/revisions/", "revisionLog", mnLogNumber),
f085be
+            XclXmlUtils::GetStreamName(NULL, "revisionLog", mnLogNumber),
f085be
+            rStrm.GetCurrentStream()->getOutputStream(),
f085be
+            "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml",
f085be
+            CREATE_OFFICEDOC_RELATION_TYPE("revisionLog"),
f085be
+            &aRelId);
f085be
+
f085be
+    rStrm.WriteAttributes(
f085be
+        XML_guid, lcl_GuidToOString(maGUID).getStr(),
f085be
+        XML_dateTime, lcl_DateTimeToOString(maDateTime).getStr(),
f085be
+        XML_userName, XclXmlUtils::ToOString(maUserName).getStr(),
f085be
+        FSNS(XML_r, XML_id),  XclXmlUtils::ToOString(aRelId).getStr(),
f085be
+        FSEND);
f085be
+
f085be
+    if (mnMinAction)
f085be
+        rStrm.WriteAttributes(XML_minRId, OString::number(mnMinAction).getStr(), FSEND);
f085be
+
f085be
+    if (mnMaxAction)
f085be
+        rStrm.WriteAttributes(XML_maxRId, OString::number(mnMaxAction).getStr(), FSEND);
f085be
+
f085be
+    if (!maTabBuffer.empty())
f085be
+        // next available sheet index.
f085be
+        rStrm.WriteAttributes(XML_maxSheetId, OString::number(maTabBuffer.back()+1).getStr(), FSEND);
f085be
+
f085be
+    pHeader->write(">");
f085be
+
f085be
+    if (!maTabBuffer.empty())
f085be
+    {
f085be
+        // Write sheet index map.
f085be
+        size_t n = maTabBuffer.size();
f085be
+        pHeader->startElement(
f085be
+            XML_sheetIdMap,
f085be
+            XML_count, OString::number(n).getStr(),
f085be
+            FSEND);
f085be
+
f085be
+        for (size_t i = 0; i < n; ++i)
f085be
+        {
f085be
+            pHeader->singleElement(
f085be
+                XML_sheetId,
f085be
+                XML_val, OString::number(maTabBuffer[i]).getStr(),
f085be
+                FSEND);
f085be
+        }
f085be
+        pHeader->endElement(XML_sheetIdMap);
f085be
+    }
f085be
+
f085be
+    // Write all revision logs in a separate stream.
f085be
+
f085be
+    rStrm.PushStream(pRevLogStrm);
f085be
+
f085be
+    pRevLogStrm->write("<")->writeId(XML_revisions);
f085be
+
f085be
+    rStrm.WriteAttributes(
f085be
+        XML_xmlns,              "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
f085be
+        FSNS(XML_xmlns, XML_r), "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
f085be
+        FSEND);
f085be
+
f085be
+    pRevLogStrm->write(">");
f085be
+
f085be
+    std::vector<XclExpChTrAction*>::iterator it = maActions.begin(), itEnd = maActions.end();
f085be
+    for (; it != itEnd; ++it)
f085be
+    {
f085be
+        XclExpChTrAction* p = *it;
f085be
+        p->SaveXml(rStrm);
f085be
+    }
f085be
+
f085be
+    pRevLogStrm->write("</")->writeId(XML_revisions)->write(">");
f085be
+
f085be
+    rStrm.PopStream();
f085be
+
f085be
+    pHeader->write("</")->writeId(XML_header)->write(">");
f085be
+}
f085be
+
f085be
+void XclExpXmlChTrHeader::AppendAction( XclExpChTrAction* pAction )
f085be
+{
f085be
+    sal_uInt32 nActionNum = pAction->GetActionNumber();
f085be
+    if (!mnMinAction || mnMinAction > nActionNum)
f085be
+        mnMinAction = nActionNum;
f085be
+
f085be
+    if (!mnMaxAction || mnMaxAction < nActionNum)
f085be
+        mnMaxAction = nActionNum;
f085be
+
f085be
+    maActions.push_back(pAction);
f085be
+}
f085be
+
f085be
+XclExpChTrInfo::XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID ) :
f085be
+    sUsername( rUsername ),
f085be
+    aDateTime( rDateTime )
f085be
+{
f085be
+    memcpy( aGUID, pGUID, 16 );
f085be
+}
f085be
 
f085be
 XclExpChTrInfo::~XclExpChTrInfo()
f085be
 {
f085be
@@ -424,35 +566,6 @@ sal_Size XclExpChTrInfo::GetLen() const
f085be
     return 158;
f085be
 }
f085be
 
f085be
-void XclExpChTrInfo::SaveXml( XclExpXmlStream& rRevisionHeadersStrm )
f085be
-{
f085be
-    sax_fastparser::FSHelperPtr pHeader = rRevisionHeadersStrm.GetCurrentStream();
f085be
-
f085be
-    OUString sRelationshipId;
f085be
-    sax_fastparser::FSHelperPtr pRevisionLog = rRevisionHeadersStrm.CreateOutputStream(
f085be
-            XclXmlUtils::GetStreamName( "xl/revisions/", "revisionLog", mnLogNumber ),
f085be
-            XclXmlUtils::GetStreamName( NULL, "revisionLog", mnLogNumber ),
f085be
-            rRevisionHeadersStrm.GetCurrentStream()->getOutputStream(),
f085be
-            "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml",
f085be
-            "http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog",
f085be
-            &sRelationshipId );
f085be
-
f085be
-    rRevisionHeadersStrm.WriteAttributes(
f085be
-            XML_guid,               lcl_GuidToOString( aGUID ).getStr(),
f085be
-            XML_dateTime,           lcl_DateTimeToOString( aDateTime ).getStr(),
f085be
-            XML_maxSheetId,         NULL,   // OOXTODO
f085be
-            XML_userName,           XclXmlUtils::ToOString( sUsername ).getStr(),
f085be
-            FSNS( XML_r, XML_id ),  XclXmlUtils::ToOString( sRelationshipId ).getStr(),
f085be
-            XML_minRId,             NULL,   // OOXTODO
f085be
-            XML_maxRId,             NULL,   // OOXTODO
f085be
-            FSEND );
f085be
-    pHeader->write( ">" );
f085be
-
f085be
-    rRevisionHeadersStrm.PushStream( pRevisionLog );
f085be
-}
f085be
-
f085be
-//___________________________________________________________________
f085be
-
f085be
 XclExpChTrTabIdBuffer::XclExpChTrTabIdBuffer( sal_uInt16 nCount ) :
f085be
     nBufSize( nCount ),
f085be
     nLastId( nCount )
f085be
@@ -523,11 +636,8 @@ void XclExpChTrTabIdBuffer::Remove()
f085be
     nLastId--;
f085be
 }
f085be
 
f085be
-//___________________________________________________________________
f085be
-
f085be
-XclExpChTrTabId::XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders )
f085be
+XclExpChTrTabId::XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer )
f085be
     : nTabCount( rBuffer.GetBufferCount() )
f085be
-    , mbInRevisionHeaders( bInRevisionHeaders )
f085be
 {
f085be
     pBuffer = new sal_uInt16[ nTabCount ];
f085be
     rBuffer.GetBufferCopy( pBuffer );
f085be
@@ -567,31 +677,6 @@ sal_Size XclExpChTrTabId::GetLen() const
f085be
     return nTabCount << 1;
f085be
 }
f085be
 
f085be
-void XclExpChTrTabId::SaveXml( XclExpXmlStream& rRevisionLogStrm )
f085be
-{
f085be
-    if( !mbInRevisionHeaders )
f085be
-        return;
f085be
-
f085be
-    sax_fastparser::FSHelperPtr pRevisionLog = rRevisionLogStrm.GetCurrentStream();
f085be
-    rRevisionLogStrm.PopStream();
f085be
-
f085be
-    sax_fastparser::FSHelperPtr pHeader = rRevisionLogStrm.GetCurrentStream();
f085be
-    pHeader->startElement( XML_sheetIdMap,
f085be
-            XML_count,  OString::number( nTabCount ).getStr(),
f085be
-            FSEND );
f085be
-    for( int i = 0; i < nTabCount; ++i )
f085be
-    {
f085be
-        pHeader->singleElement( XML_sheetId,
f085be
-                XML_val,    OString::number( pBuffer[ i ] ).getStr(),
f085be
-                FSEND );
f085be
-    }
f085be
-    pHeader->endElement( XML_sheetIdMap );
f085be
-
f085be
-    rRevisionLogStrm.PushStream( pRevisionLog );
f085be
-}
f085be
-
f085be
-//___________________________________________________________________
f085be
-
f085be
 // ! does not copy additional actions
f085be
 XclExpChTrAction::XclExpChTrAction( const XclExpChTrAction& rCopy ) :
f085be
     ExcRecord( rCopy ),
f085be
@@ -1126,11 +1211,12 @@ void XclExpChTrInsert::SaveXml( XclExpXmlStream& rRevisionLogStrm )
f085be
             XML_ua,     XclXmlUtils::ToPsz( GetAccepted () ),   // OOXTODO? bAccepted == ua or ra; not sure.
f085be
             XML_ra,     NULL,       // OOXTODO: RRD.fUndoAction?  Or RRD.fAccepted?
f085be
             XML_sId,    OString::number(  GetTabId( aRange.aStart.Tab() ) ).getStr(),
f085be
-            XML_eol,    NULL,       // OOXTODO: not supported?
f085be
+            XML_eol,    XclXmlUtils::ToPsz10(mbEndOfList),
f085be
             XML_ref,    XclXmlUtils::ToOString( aRange ).getStr(),
f085be
             XML_action, lcl_GetAction( nOpCode ),
f085be
             XML_edge,   NULL,       // OOXTODO: ???
f085be
             FSEND );
f085be
+
f085be
     // OOXTODO: does this handle XML_rfmt, XML_undo?
f085be
     XclExpChTrAction* pAction = GetAddAction();
f085be
     while( pAction != NULL )
f085be
@@ -1318,17 +1404,6 @@ void XclExpChTr0x014A::SaveXml( XclExpXmlStream& rStrm )
f085be
     pStream->endElement( XML_rfmt );
f085be
 }
f085be
 
f085be
-//___________________________________________________________________
f085be
-
f085be
-class ExcXmlRecord : public ExcRecord
f085be
-{
f085be
-public:
f085be
-    virtual sal_Size    GetLen() const;
f085be
-    virtual sal_uInt16  GetNum() const;
f085be
-    virtual void        Save( XclExpStream& rStrm );
f085be
-    virtual void        SaveXml( XclExpXmlStream& rStrm ) = 0;
f085be
-};
f085be
-
f085be
 sal_Size ExcXmlRecord::GetLen() const
f085be
 {
f085be
     return 0;
f085be
@@ -1447,66 +1522,83 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) :
f085be
     }
f085be
 
f085be
     // build record list
f085be
-    pHeader = new XclExpChTrHeader;
f085be
-    aRecList.push_back( new StartXmlElement( XML_headers, StartXmlElement::WRITE_NAMESPACES ) );
f085be
-    aRecList.push_back( pHeader );
f085be
-    aRecList.push_back( new XclExpChTr0x0195 );
f085be
-    aRecList.push_back( new XclExpChTr0x0194( *pTempChangeTrack ) );
f085be
-
f085be
-    OUString sLastUsername;
f085be
-    DateTime aLastDateTime( DateTime::EMPTY );
f085be
-    sal_uInt32 nIndex = 1;
f085be
-    sal_Int32 nLogNumber = 1;
f085be
-    while( !aActionStack.empty() )
f085be
+    if (GetOutput() == EXC_OUTPUT_BINARY)
f085be
     {
f085be
-        XclExpChTrAction* pAction = aActionStack.top();
f085be
-        aActionStack.pop();
f085be
-
f085be
-        if( (nIndex == 1) || pAction->ForceInfoRecord() ||
f085be
-            (pAction->GetUsername() != sLastUsername) ||
f085be
-            (pAction->GetDateTime() != aLastDateTime) )
f085be
+        pHeader = new XclExpChTrHeader;
f085be
+        maRecList.push_back( pHeader );
f085be
+        maRecList.push_back( new XclExpChTr0x0195 );
f085be
+        maRecList.push_back( new XclExpChTr0x0194( *pTempChangeTrack ) );
f085be
+
f085be
+        OUString sLastUsername;
f085be
+        DateTime aLastDateTime( DateTime::EMPTY );
f085be
+        sal_uInt32 nIndex = 1;
f085be
+        sal_Int32 nLogNumber = 1;
f085be
+        while( !aActionStack.empty() )
f085be
         {
f085be
-            if( nIndex != 1 )
f085be
+            XclExpChTrAction* pAction = aActionStack.top();
f085be
+            aActionStack.pop();
f085be
+
f085be
+            if( (nIndex == 1) || pAction->ForceInfoRecord() ||
f085be
+                (pAction->GetUsername() != sLastUsername) ||
f085be
+                (pAction->GetDateTime() != aLastDateTime) )
f085be
             {
f085be
-                aRecList.push_back( new EndXmlElement( XML_revisions ) );
f085be
-                aRecList.push_back( new EndHeaderElement() );
f085be
+                lcl_GenerateGUID( aGUID, bValidGUID );
f085be
+                sLastUsername = pAction->GetUsername();
f085be
+                aLastDateTime = pAction->GetDateTime();
f085be
+
f085be
+                nLogNumber++;
f085be
+                maRecList.push_back( new XclExpChTrInfo(sLastUsername, aLastDateTime, aGUID) );
f085be
+                maRecList.push_back( new XclExpChTrTabId(pAction->GetTabIdBuffer()) );
f085be
+                pHeader->SetGUID( aGUID );
f085be
             }
f085be
+            pAction->SetIndex( nIndex );
f085be
+            maRecList.push_back( pAction );
f085be
+        }
f085be
 
f085be
-            lcl_GenerateGUID( aGUID, bValidGUID );
f085be
-            sLastUsername = pAction->GetUsername();
f085be
-            aLastDateTime = pAction->GetDateTime();
f085be
+        pHeader->SetGUID( aGUID );
f085be
+        pHeader->SetCount( nIndex - 1 );
f085be
+        maRecList.push_back( new ExcEof );
f085be
+    }
f085be
+    else
f085be
+    {
f085be
+        XclExpXmlChTrHeaders* pHeaders = new XclExpXmlChTrHeaders;
f085be
+        maRecList.push_back(pHeaders);
f085be
+
f085be
+        OUString sLastUsername;
f085be
+        DateTime aLastDateTime(DateTime::EMPTY);
f085be
+        sal_uInt32 nIndex = 1;
f085be
+        sal_Int32 nLogNumber = 1;
f085be
+        XclExpXmlChTrHeader* pCurHeader = NULL;
f085be
+
f085be
+        while (!aActionStack.empty())
f085be
+        {
f085be
+            XclExpChTrAction* pAction = aActionStack.top();
f085be
+            aActionStack.pop();
f085be
 
f085be
-            aRecList.push_back( new StartXmlElement( XML_header, 0 ) );
f085be
-            aRecList.push_back( new XclExpChTrInfo( sLastUsername, aLastDateTime, aGUID, nLogNumber++ ) );
f085be
-            aRecList.push_back( new XclExpChTrTabId( pAction->GetTabIdBuffer(), true ) );
f085be
-            aRecList.push_back( new StartXmlElement( XML_revisions, StartXmlElement::WRITE_NAMESPACES | StartXmlElement::CLOSE_ELEMENT ) );
f085be
-            pHeader->SetGUID( aGUID );
f085be
+            if( (nIndex == 1) || pAction->ForceInfoRecord() ||
f085be
+                (pAction->GetUsername() != sLastUsername) ||
f085be
+                (pAction->GetDateTime() != aLastDateTime) )
f085be
+            {
f085be
+                lcl_GenerateGUID( aGUID, bValidGUID );
f085be
+                sLastUsername = pAction->GetUsername();
f085be
+                aLastDateTime = pAction->GetDateTime();
f085be
+
f085be
+                pCurHeader = new XclExpXmlChTrHeader(sLastUsername, aLastDateTime, aGUID, nLogNumber, pAction->GetTabIdBuffer());
f085be
+                maRecList.push_back(pCurHeader);
f085be
+                nLogNumber++;
f085be
+                pHeaders->SetGUID(aGUID);
f085be
+            }
f085be
+            pAction->SetIndex(nIndex);
f085be
+            pCurHeader->AppendAction(pAction);
f085be
         }
f085be
-        pAction->SetIndex( nIndex );
f085be
-        aRecList.push_back( pAction );
f085be
-    }
f085be
 
f085be
-    pHeader->SetGUID( aGUID );
f085be
-    pHeader->SetCount( nIndex - 1 );
f085be
-    if( nLogNumber > 1 )
f085be
-    {
f085be
-        aRecList.push_back( new EndXmlElement( XML_revisions ) );
f085be
-        aRecList.push_back( new EndHeaderElement() );
f085be
+        pHeaders->SetGUID(aGUID);
f085be
+        maRecList.push_back(new EndXmlElement(XML_headers));
f085be
     }
f085be
-    aRecList.push_back( new EndXmlElement( XML_headers ) );
f085be
-    aRecList.push_back( new ExcEof );
f085be
 }
f085be
 
f085be
 XclExpChangeTrack::~XclExpChangeTrack()
f085be
 {
f085be
-    std::vector<ExcRecord*>::iterator prIter;
f085be
-    for ( prIter = aRecList.begin(); prIter != aRecList.end(); ++prIter )
f085be
-        delete *prIter;
f085be
-
f085be
-    std::vector<XclExpChTrTabIdBuffer*>::iterator pIter;
f085be
-    for ( pIter = maBuffers.begin(); pIter != maBuffers.end(); ++pIter )
f085be
-        delete *pIter;
f085be
-
f085be
     while( !aActionStack.empty() )
f085be
     {
f085be
         delete aActionStack.top();
f085be
@@ -1602,7 +1694,7 @@ sal_Bool XclExpChangeTrack::WriteUserNamesStream()
f085be
 
f085be
 void XclExpChangeTrack::Write()
f085be
 {
f085be
-    if( aRecList.empty() )
f085be
+    if (maRecList.empty())
f085be
         return;
f085be
 
f085be
     if( WriteUserNamesStream() )
f085be
@@ -1613,9 +1705,9 @@ void XclExpChangeTrack::Write()
f085be
         {
f085be
             XclExpStream aXclStrm( *xSvStrm, GetRoot(), EXC_MAXRECSIZE_BIFF8 + 8 );
f085be
 
f085be
-            std::vector<ExcRecord*>::iterator pIter;
f085be
-            for ( pIter = aRecList.begin(); pIter != aRecList.end(); ++pIter )
f085be
-                (*pIter)->Save(aXclStrm);
f085be
+            RecListType::iterator pIter;
f085be
+            for (pIter = maRecList.begin(); pIter != maRecList.end(); ++pIter)
f085be
+                pIter->Save(aXclStrm);
f085be
 
f085be
             xSvStrm->Commit();
f085be
         }
f085be
@@ -1643,7 +1735,7 @@ static void lcl_WriteUserNamesXml( XclExpXmlStream& rWorkbookStrm )
f085be
 
f085be
 void XclExpChangeTrack::WriteXml( XclExpXmlStream& rWorkbookStrm )
f085be
 {
f085be
-    if( aRecList.empty() )
f085be
+    if (maRecList.empty())
f085be
         return;
f085be
 
f085be
     lcl_WriteUserNamesXml( rWorkbookStrm );
f085be
@@ -1659,9 +1751,9 @@ void XclExpChangeTrack::WriteXml( XclExpXmlStream& rWorkbookStrm )
f085be
     //          contents of XclExpChangeTrack::WriteUserNamesStream()).
f085be
     rWorkbookStrm.PushStream( pRevisionHeaders );
f085be
 
f085be
-    std::vector<ExcRecord*>::iterator pIter;
f085be
-    for ( pIter = aRecList.begin(); pIter != aRecList.end(); ++pIter )
f085be
-        (*pIter)->SaveXml(rWorkbookStrm);
f085be
+    RecListType::iterator pIter;
f085be
+    for (pIter = maRecList.begin(); pIter != maRecList.end(); ++pIter)
f085be
+        pIter->SaveXml(rWorkbookStrm);
f085be
 
f085be
     rWorkbookStrm.PopStream();
f085be
 }
f085be
-- 
f085be
1.9.3
f085be