Compare commits

...

2 Commits

Author SHA1 Message Date
a4e2fcad31 [x2t] Generate comments Guids if they are absent 2019-07-11 19:45:35 +03:00
7e23508e06 DocxFormat - add altChunk 2019-07-11 19:17:39 +03:00
19 changed files with 323 additions and 151 deletions

View File

@ -35,6 +35,7 @@
#include "WrapperFile.h"
#include "FileContainer.h"
#include "../../Common/DocxFormat/Source/XML/Utils.h"
namespace PPTX
{
@ -57,8 +58,7 @@ namespace PPTX
nullable_int parentAuthorId;
nullable_int parentCommentId;
nullable_string userId;
nullable_string providerId;
nullable_string additional_data; // teamlab editor information!!!
virtual void fromXML(XmlUtils::CXmlNode& node)
{
@ -112,17 +112,28 @@ namespace PPTX
if (oNodeAU.IsValid())
{
std::wstring strData = oNodeAU.GetAttribute(_T("userId"));
if (!strData.empty())
userId = strData;
strData = oNodeAU.GetAttribute(_T("providerId"));
if (!strData.empty())
providerId = strData;
additional_data = XmlUtils::EncodeXmlString(strData);
bIsFound2 = true;
}
}
}
}
//check comment guid
if(!(additional_data.IsInit() && 0 == additional_data->compare(0, 13, L"teamlab_data:") && std::wstring::npos != additional_data->find(L"4;38;")))
{
if(!additional_data.IsInit())
{
additional_data = L"teamlab_data:";
}
if(':' != additional_data->back() && ';' != additional_data->back())
{
additional_data->append(L";");
}
additional_data->append(L"4;38;{" + XmlUtils::GenerateGuid() + L"}");
}
XmlUtils::CXmlNode oNodeExt = oNodeExtLst.ReadNode(_T("p:ext"));
if (oNodeExt.IsValid())
@ -167,7 +178,7 @@ namespace PPTX
}
bool bIsExtLst = false;
if ((parentAuthorId.is_init() && parentCommentId.is_init()) || (userId.is_init() && providerId.is_init()))
if ((parentAuthorId.is_init() && parentCommentId.is_init()) || additional_data.is_init())
bIsExtLst = true;
if (bIsExtLst)
@ -184,14 +195,16 @@ namespace PPTX
pWriter->WriteString(_T("</p15:threadingInfo></p:ext>"));
}
if (userId.is_init() && providerId.is_init())
if (additional_data.is_init())
{
pWriter->WriteString(_T("<p:ext uri=\"{19B8F6BF-5375-455C-9EA6-DF929625EA0E}\">\
<p15:presenceInfo xmlns:p15=\"http://schemas.microsoft.com/office/powerpoint/2012/main\" userId=\""));
pWriter->WriteString(XmlUtils::EncodeXmlString(userId.get()));
pWriter->WriteString(_T("\" providerId=\""));
pWriter->WriteString(XmlUtils::EncodeXmlString(providerId.get()));
pWriter->WriteString(_T("\"/></p:ext>"));
std::wstring strData = XmlUtils::EncodeXmlString(additional_data.get());
pWriter->WriteString(strData);
pWriter->WriteString(_T("\" providerId=\"AD\"/></p:ext>"));
}
if (bIsExtLst)
@ -215,15 +228,9 @@ namespace PPTX
pWriter->WriteInt2(6, parentAuthorId);
pWriter->WriteInt2(7, parentCommentId);
pWriter->WriteString2(8, userId);
pWriter->WriteString2(8, additional_data);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->StartRecord(0);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
pWriter->WriteString2(9, providerId);
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
pWriter->EndRecord();
}
virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
{
@ -264,47 +271,12 @@ namespace PPTX
parentCommentId = pReader->GetLong();
break;
case 8:
userId = pReader->GetString2();
additional_data = pReader->GetString2();
default:
break;
}
}
while (pReader->GetPos() < _end_rec)
{
BYTE _at = pReader->GetUChar();
switch (_at)
{
case 0:
{
LONG _end_rec2 = pReader->GetPos() + pReader->GetLong() + 4;
pReader->Skip(1); // start attributes
while (true)
{
BYTE _at = pReader->GetUChar_TypeNode();
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
break;
switch (_at)
{
case 9: providerId = pReader->GetString2(); break;
default: break;
}
}
pReader->Seek(_end_rec2);
}
break;
default:
{
pReader->SkipRecord();
break;
}
}
}
pReader->Seek(_end_rec);
}

View File

@ -647,7 +647,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -694,7 +693,6 @@ namespace ComplexTypes
}
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -1114,7 +1112,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -1201,7 +1198,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -1253,7 +1249,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("r:id"), m_oId )
WritingElement_ReadAttributes_End( oReader )
@ -1306,7 +1301,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -1360,7 +1354,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
@ -1510,7 +1503,6 @@ namespace ComplexTypes
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:evenHBand"), m_oEvenHBand )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:evenVBand"), m_oEvenVBand )
@ -1855,7 +1847,57 @@ namespace ComplexTypes
return _T("");
}
};
//--------------------------------------------------------------------------------
// MatchSrc 17.17.2.3 (Part 1)
//--------------------------------------------------------------------------------
class CMatchSrc : public ComplexType
{
public:
ComplexTypes_AdditionConstructors(CMatchSrc)
CMatchSrc()
{
}
virtual ~CMatchSrc()
{
}
virtual void FromXML(XmlUtils::CXmlNode& oNode)
{
XmlMacroReadAttributeBase( oNode, _T("w:val"), m_oVal );
}
virtual void FromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes(oReader);
if ( !oReader.IsEmptyNode() )
oReader.ReadTillEnd();
}
virtual std::wstring ToString() const
{
std::wstring sResult;
if ( m_oVal.IsInit() )
{
sResult += _T("w:val=\"");
sResult += m_oVal->ToString();
sResult += _T("\" ");
}
return sResult;
}
private:
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("w:val"), m_oVal )
WritingElement_ReadAttributes_End( oReader )
}
public:
nullable<SimpleTypes::COnOff<>> m_oVal;
};
//--------------------------------------------------------------------------------
// EdnPos 17.11.22 (Part 1)
//--------------------------------------------------------------------------------

View File

@ -54,9 +54,9 @@ void CComment::fromXML(XmlUtils::CXmlLiteReader& oReader)
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
/*if ( L"w:altChunk" ==sName )
pItem = new Logic::AltChunk( oItem );
else */if ( L"w:bookmarkEnd" ==sName )
if ( L"w:altChunk" ==sName )
pItem = new Logic::CAltChunk( oReader );
else if ( L"w:bookmarkEnd" ==sName )
pItem = new Logic::CBookmarkEnd( oReader );
else if ( L"w:bookmarkStart" ==sName )
pItem = new Logic::CBookmarkStart( oReader );

View File

@ -185,7 +185,6 @@ namespace OOX
{
// TO DO: Нехватающие классы:
// <w:altChunk>
// <w:customXml>
// <w:moveFrom>
// <w:moveTo>
@ -232,9 +231,9 @@ namespace OOX
WritingElement *pItem = NULL;
/*if ( _T("w:altChunk") == sName )
pItem = new Logic::CAltChunk( oReader );
else*/ if ( _T("w:bookmarkEnd") == sName )
if ( _T("w:altChunk") == sName )
pItem = new Logic::CAltChunk( oReader );
else if ( _T("w:bookmarkEnd") == sName )
pItem = new Logic::CBookmarkEnd( oReader );
else if ( _T("w:bookmarkStart") == sName )
pItem = new Logic::CBookmarkStart( oReader );

View File

@ -236,6 +236,10 @@ namespace OOX
L"",
L"http://schemas.onlyoffice.com/jsaProject");
const FileType ImportedExternalContent(L"embeddings", L"",
L"",
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk");
const FileType MicrosoftOfficeUnknown(L"embeddings", L"",
L"",
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package");

View File

@ -45,7 +45,6 @@
#include "Math/OMath.h"
// TO DO: Нехватающие классы:
// <w:altChunk>
// <w:customXml>
// <w:del>
// <w:ins>
@ -100,9 +99,9 @@ namespace OOX
std::wstring sName = oItem.GetName();
WritingElement *pItem = NULL;
/*if ( _T("w:altChunk") == sName )
pItem = new Logic::AltChunk( oItem );
else */if ( _T("w:bookmarkEnd") == sName )
if ( _T("w:altChunk") == sName )
pItem = new Logic::CAltChunk( oItem );
else if ( _T("w:bookmarkEnd") == sName )
pItem = new Logic::CBookmarkEnd( oItem );
else if ( _T("w:bookmarkStart") == sName )
pItem = new Logic::CBookmarkStart( oItem );
@ -188,9 +187,9 @@ namespace OOX
sName = oReader.GetName();
WritingElement *pItem = NULL;
/*if ( _T("w:altChunk") == sName )
if ( _T("w:altChunk") == sName )
pItem = new Logic::CAltChunk( oReader );
else */if ( _T("w:bookmarkEnd") == sName )
else if ( _T("w:bookmarkEnd") == sName )
pItem = new Logic::CBookmarkEnd( oReader );
else if ( _T("w:bookmarkStart") == sName )
pItem = new Logic::CBookmarkStart( oReader );

View File

@ -46,7 +46,6 @@
#include "Math/OMath.h"
// TO DO: Нехватающие классы:
// <w:altChunk>
// <w:customXml>
// <w:moveFrom>
// <w:moveTo>
@ -114,9 +113,9 @@ namespace OOX
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
/*if ( _T("w:altChunk") == sName )
pItem = new Logic::AltChunk( oItem );
else */if ( _T("w:bookmarkEnd") == sName )
if ( _T("w:altChunk") == sName )
pItem = new Logic::CAltChunk( oReader );
else if ( _T("w:bookmarkEnd") == sName )
pItem = new Logic::CBookmarkEnd( oReader );
else if ( _T("w:bookmarkStart") == sName )
pItem = new Logic::CBookmarkStart( oReader );

View File

@ -55,11 +55,7 @@ namespace OOX
{
namespace Logic
{
//--------------------------------------------------------------------------------
// CHyperlink
//--------------------------------------------------------------------------------
void CHyperlink::fromXML(XmlUtils::CXmlNode& oNode)
void CHyperlink::fromXML(XmlUtils::CXmlNode& oNode)
{
XmlMacroReadAttributeBase( oNode, _T("w:anchor"), m_sAnchor );
XmlMacroReadAttributeBase( oNode, _T("w:docLocation"), m_sDocLocation );
@ -69,7 +65,7 @@ namespace OOX
XmlMacroReadAttributeBase( oNode, _T("w:tooltip"), m_sTooltip );
XmlUtils::CXmlNodes oChilds;
if ( oNode.GetNodes( _T("*"), oChilds ) )
if ( oNode.GetNodes( L"*", oChilds ) )
{
XmlUtils::CXmlNode oItem;
for ( int nIndex = 0; nIndex < oChilds.GetCount(); nIndex++ )
@ -156,7 +152,7 @@ namespace OOX
}
void CHyperlink::fromXML(XmlUtils::CXmlLiteReader& oReader)
void CHyperlink::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes( oReader );
@ -305,5 +301,116 @@ namespace OOX
return sResult;
}
void CAltChunkPr::fromXML(XmlUtils::CXmlNode& oNode)
{
XmlUtils::CXmlNodes oChilds;
if ( oNode.GetNodes( L"*", oChilds ) )
{
XmlUtils::CXmlNode oItem;
for ( int nIndex = 0; nIndex < oChilds.GetCount(); nIndex++ )
{
if ( oChilds.GetAt( nIndex, oItem ) )
{
std::wstring sName = oItem.GetName();
WritingElement *pItem = NULL;
if ( L"w:matchSrc" == sName )
m_oMatchSrc = new ComplexTypes::Word::CMatchSrc( oItem );
}
}
}
}
void CAltChunkPr::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
if ( oReader.IsEmptyNode() )
return;
int nParentDepth = oReader.GetDepth();
while( oReader.ReadNextSiblingNode( nParentDepth ) )
{
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
if ( L"w:matchSrc" == sName )
m_oMatchSrc = oReader ;
}
}
std::wstring CAltChunkPr::toXML() const
{
std::wstring sResult = L"<w:altChunkPr>";
if (m_oMatchSrc.IsInit())
{
sResult += L"<w:matchSrc ";
sResult += m_oMatchSrc->ToString();
sResult += L"/>";
}
sResult += L"</w:altChunkPr>";
return sResult;
}
void CAltChunk::fromXML(XmlUtils::CXmlNode& oNode)
{
XmlMacroReadAttributeBase( oNode, L"r:id", m_oId );
XmlUtils::CXmlNodes oChilds;
if ( oNode.GetNodes( L"*", oChilds ) )
{
XmlUtils::CXmlNode oItem;
for ( int nIndex = 0; nIndex < oChilds.GetCount(); nIndex++ )
{
if ( oChilds.GetAt( nIndex, oItem ) )
{
std::wstring sName = oItem.GetName();
WritingElement *pItem = NULL;
if ( L"w:altChunkPr" == sName )
m_oAltChunkPr = new CAltChunkPr( oItem );
}
}
}
}
void CAltChunk::fromXML(XmlUtils::CXmlLiteReader& oReader)
{
ReadAttributes( oReader );
if ( oReader.IsEmptyNode() )
return;
int nParentDepth = oReader.GetDepth();
while( oReader.ReadNextSiblingNode( nParentDepth ) )
{
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
if ( L"w:altChunkPr" == sName )
m_oAltChunkPr = oReader ;
}
}
std::wstring CAltChunk::toXML() const
{
std::wstring sResult = L"<w:altChunk ";
if ( m_oId.IsInit() )
{
sResult += L"r:id=\"";
sResult += m_oId->ToString();
sResult += L"\" ";
}
sResult += L">";
if (m_oAltChunkPr.IsInit())
sResult += m_oAltChunkPr->toXML();
sResult += L"</w:altChunk>";
return sResult;
}
} // namespace Logic
} // namespace OOX

View File

@ -38,13 +38,14 @@
#include "../WritingElement.h"
#include "../../Common/SimpleTypes_Word.h"
#include "../../Common/SimpleTypes_Shared.h"
#include "../../Common/ComplexTypes.h"
namespace OOX
{
namespace Logic
{
//--------------------------------------------------------------------------------
// CHyperlink 17.16.22 (Part 1)
// Hyperlink 17.16.22 (Part 1)
//--------------------------------------------------------------------------------
class CHyperlink : public WritingElementWithChilds<>
{
@ -63,9 +64,6 @@ namespace OOX
virtual ~CHyperlink()
{
}
public:
const CHyperlink &operator =(const XmlUtils::CXmlNode& oNode)
{
ClearItems();
@ -91,11 +89,9 @@ namespace OOX
WritingElementWithChilds::ClearItems();
}
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;
virtual EElementType getType() const
{
return et_w_hyperlink;
@ -105,7 +101,6 @@ namespace OOX
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:anchor"), m_sAnchor )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:docLocation"), m_sDocLocation )
@ -118,16 +113,70 @@ namespace OOX
public:
// Attributes
nullable<std::wstring > m_sAnchor;
nullable<std::wstring > m_sDocLocation;
nullable<SimpleTypes::COnOff<SimpleTypes::onoffFalse> > m_oHistory;
nullable<SimpleTypes::CRelationshipId > m_oId;
nullable<std::wstring > m_sTgtFrame;
nullable<std::wstring > m_sTooltip;
// Childs
nullable<std::wstring> m_sAnchor;
nullable<std::wstring> m_sDocLocation;
nullable<SimpleTypes::COnOff<SimpleTypes::onoffFalse>> m_oHistory;
nullable<SimpleTypes::CRelationshipId> m_oId;
nullable<std::wstring> m_sTgtFrame;
nullable<std::wstring> m_sTooltip;
};
//--------------------------------------------------------------------------------
// AltChunkPr 17.17.2.2 (Part 1)
//--------------------------------------------------------------------------------
class CAltChunkPr : public WritingElement
{
public:
WritingElement_AdditionConstructors(CAltChunkPr)
CAltChunkPr()
{
}
virtual ~CAltChunkPr()
{
}
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;
virtual EElementType getType() const
{
return et_w_altChunkPr;
}
nullable<ComplexTypes::Word::CMatchSrc> m_oMatchSrc;
};
//--------------------------------------------------------------------------------
// AltChunk 17.17.2.1 (Part 1)
//--------------------------------------------------------------------------------
class CAltChunk : public WritingElement
{
public:
WritingElement_AdditionConstructors(CAltChunk)
CAltChunk()
{
}
virtual ~CAltChunk()
{
}
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;
virtual EElementType getType() const
{
return et_w_altChunk;
}
private:
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_ReadSingle( oReader, _T("r:id"), m_oId )
WritingElement_ReadAttributes_End( oReader )
}
public:
nullable<CAltChunkPr> m_oAltChunkPr;
nullable<SimpleTypes::CRelationshipId> m_oId;
};
} // namespace Logic
} // namespace OOX

View File

@ -705,7 +705,6 @@ namespace OOX
//--------------------------------------------------------------------------------
// TO DO: Нехватающие классы:
// <w:altChunk>
// <w:customXml>
// <w:moveFrom>
// <w:moveTo>
@ -725,9 +724,9 @@ namespace OOX
std::wstring sName = oItem.GetName();
WritingElement *pItem = NULL;
/* if ( _T("w:altChunk") == sName )
if ( _T("w:altChunk") == sName )
pItem = new CAltChunk( oItem );
else */if ( _T("w:bookmarkEnd") == sName )
else if ( _T("w:bookmarkEnd") == sName )
pItem = new CBookmarkEnd( oItem );
else if ( _T("w:bookmarkStart") == sName )
pItem = new CBookmarkStart( oItem );
@ -811,9 +810,9 @@ namespace OOX
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
/*if ( _T("w:altChunk") == sName )
if ( _T("w:altChunk") == sName )
pItem = new CAltChunk( oReader );
else */if ( _T("w:bookmarkEnd") == sName )
else if ( _T("w:bookmarkEnd") == sName )
pItem = new CBookmarkEnd( oReader );
else if ( _T("w:bookmarkStart") == sName )
pItem = new CBookmarkStart( oReader );

View File

@ -168,8 +168,6 @@ namespace OOX
}
m_arrGridCol.clear();
}
public:
const CTblGrid& operator = (const XmlUtils::CXmlNode &oNode)
{
fromXML( (XmlUtils::CXmlNode&)oNode );
@ -180,8 +178,6 @@ namespace OOX
fromXML( (XmlUtils::CXmlLiteReader&)oReader );
return *this;
}
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode)
{
XmlUtils::CXmlNode oChild;
@ -245,7 +241,6 @@ namespace OOX
return et_w_tblGrid;
}
public:
bool m_bTblGridChange;
@ -267,7 +262,6 @@ namespace OOX
virtual ~CTblPrExChange();
const CTblPrExChange& operator = (const XmlUtils::CXmlNode &oNode);
const CTblPrExChange& operator = (const XmlUtils::CXmlLiteReader& oReader);
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
@ -317,8 +311,6 @@ namespace OOX
virtual ~CTblPrEx()
{
}
public:
const CTblPrEx& operator = (const XmlUtils::CXmlNode &oNode)
{
fromXML( (XmlUtils::CXmlNode&)oNode );
@ -329,8 +321,6 @@ namespace OOX
fromXML( (XmlUtils::CXmlLiteReader&)oReader );
return *this;
}
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode)
{
XmlUtils::CXmlNode oChild;
@ -398,7 +388,6 @@ namespace OOX
return et_w_tblPrEx;
}
public:
bool m_bTblPrExChange;
@ -441,8 +430,6 @@ namespace OOX
{
}
public:
const CTbl &operator =(const XmlUtils::CXmlNode& oNode)
{
ClearItems();
@ -466,8 +453,6 @@ namespace OOX
WritingElementWithChilds::ClearItems();
}
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;
@ -476,7 +461,6 @@ namespace OOX
return et_w_tbl;
}
public:
int m_nCountRow;
// Childs
@ -608,8 +592,6 @@ namespace OOX
WritingElementWithChilds::ClearItems();
}
public:
virtual void fromXML(XmlUtils::CXmlNode& oNode);
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
virtual std::wstring toXML() const;

View File

@ -148,7 +148,6 @@ namespace OOX
}
void CTblPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate )
@ -276,7 +275,6 @@ namespace OOX
void CTrPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate )
@ -404,7 +402,6 @@ namespace OOX
}
void CTcPrChange::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
{
// Читаем атрибуты
WritingElement_ReadAttributes_Start( oReader )
WritingElement_ReadAttributes_Read_if ( oReader, _T("w:author"), m_sAuthor )
WritingElement_ReadAttributes_Read_else_if( oReader, _T("w:date"), m_oDate )

View File

@ -49,7 +49,6 @@
namespace OOX
{
// TO DO: Нехватающие классы:
// <w:altChunk>
// <w:customXml>
// <w:moveFrom>
// <w:moveTo>
@ -75,9 +74,9 @@ namespace OOX
std::wstring sName = oReader.GetName();
WritingElement *pItem = NULL;
/* if ( _T("w:altChunk") == sName )
pItem = new CAltChunk( oReader );
else */if ( _T("w:bookmarkEnd") == sName )
if ( _T("w:altChunk") == sName )
pItem = new CAltChunk( oReader );
else if ( _T("w:bookmarkEnd") == sName )
pItem = new CBookmarkEnd( oReader );
else if ( _T("w:bookmarkStart") == sName )
pItem = new CBookmarkStart( oReader );

View File

@ -716,6 +716,8 @@ namespace OOX
et_w_hdrShapeDefaults, // <w:hdrShapeDefaults>
et_w_headers, // <w:headers>
et_w_hyperlink, // <w:hyperlink>
et_w_altChunk, // <w:altChunk>
et_w_altChunkPr, // <w:altChunkPr>
et_w_ins, // <w:ins>
et_w_instrText, // <w:instrText>
et_w_latentStyles, // <w:latentStyles>

View File

@ -945,7 +945,8 @@ namespace BinXlsxRW
Document = 6,
Replies = 7,
Reply = 8,
OOTime = 9
OOTime = 9,
Guid = 10
};}
namespace c_oSer_ThreadedComment{enum c_oSer_ThreadedComment
{

View File

@ -55,6 +55,7 @@ namespace SerializeCommon
std::wstring sUserId;
std::wstring sUserName;
std::wstring sQuoteText;
std::wstring sGuid;
bool Solved;
bool Document;

View File

@ -5268,6 +5268,7 @@ void BinaryWorksheetTableWriter::WriteComment(OOX::Spreadsheet::CCommentItem& oC
}
void BinaryWorksheetTableWriter::WriteCommentData(OOX::Spreadsheet::CCommentItem& oComment, std::vector<SerializeCommon::CommentData*>& aCommentDatas)
{
bool isThreadedComment = NULL != oComment.m_pThreadedComment;
int nCurPos = 0;
if(aCommentDatas.size() > 0)
{
@ -5275,20 +5276,20 @@ void BinaryWorksheetTableWriter::WriteCommentData(OOX::Spreadsheet::CCommentItem
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_Comments::CommentData);
if(0 == i)
WriteCommentDataContent(&oComment, aCommentDatas[i]);
WriteCommentDataContent(&oComment, aCommentDatas[i], isThreadedComment);
else
WriteCommentDataContent(NULL, aCommentDatas[i]);
WriteCommentDataContent(NULL, aCommentDatas[i], isThreadedComment);
m_oBcw.WriteItemEnd(nCurPos);
}
}
else
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_Comments::CommentData);
WriteCommentDataContent(&oComment, NULL);
WriteCommentDataContent(&oComment, NULL, isThreadedComment);
m_oBcw.WriteItemEnd(nCurPos);
}
}
void BinaryWorksheetTableWriter::WriteCommentDataContent(OOX::Spreadsheet::CCommentItem* pComment, SerializeCommon::CommentData* pCommentData)
void BinaryWorksheetTableWriter::WriteCommentDataContent(OOX::Spreadsheet::CCommentItem* pComment, SerializeCommon::CommentData* pCommentData, bool isThreadedComment)
{
int nCurPos = 0;
if(NULL != pCommentData && !pCommentData->sText.empty())
@ -5343,7 +5344,7 @@ void BinaryWorksheetTableWriter::WriteCommentDataContent(OOX::Spreadsheet::CComm
if(pCommentData->aReplies.size() > 0)
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentData::Replies);
WriteCommentReplies(pCommentData->aReplies);
WriteCommentReplies(pCommentData->aReplies, isThreadedComment);
m_oBcw.WriteItemEnd(nCurPos);
}
}
@ -5355,15 +5356,28 @@ void BinaryWorksheetTableWriter::WriteCommentDataContent(OOX::Spreadsheet::CComm
m_oBcw.m_oStream.WriteStringW(*pComment->m_sAuthor);
}
}
if(!isThreadedComment)
{
if(pCommentData && !pCommentData->sGuid.empty())
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentData::Guid);
m_oBcw.m_oStream.WriteStringW(pCommentData->sGuid);
}
else
{
m_oBcw.m_oStream.WriteBYTE(c_oSer_CommentData::Guid);
m_oBcw.m_oStream.WriteStringW(L"{" + XmlUtils::GenerateGuid() + L"}");
}
}
}
void BinaryWorksheetTableWriter::WriteCommentReplies(std::vector<SerializeCommon::CommentData*>& aReplies)
void BinaryWorksheetTableWriter::WriteCommentReplies(std::vector<SerializeCommon::CommentData*>& aReplies, bool isThreadedComment)
{
int nCurPos = 0;
for(size_t i = 0, length = aReplies.size(); i < length; i++)
{
SerializeCommon::CommentData* pReply = aReplies[i];
nCurPos = m_oBcw.WriteItemStart(c_oSer_CommentData::Reply);
WriteCommentDataContent(NULL, pReply);
WriteCommentDataContent(NULL, pReply, isThreadedComment);
m_oBcw.WriteItemEnd(nCurPos);
}
}
@ -5383,13 +5397,13 @@ void BinaryWorksheetTableWriter::WriteThreadedComment(OOX::Spreadsheet::CThreade
m_oBcw.m_oStream.WriteStringW3(oThreadedComment.personId->ToString());
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
if(bThreadedCommentCopy)
if(bThreadedCommentCopy || !oThreadedComment.id.IsInit())
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_ThreadedComment::id);
m_oBcw.m_oStream.WriteStringW3(L"{" + XmlUtils::GenerateGuid() + L"}");
m_oBcw.WriteItemWithLengthEnd(nCurPos);
}
else if(oThreadedComment.id.IsInit())
else
{
nCurPos = m_oBcw.WriteItemStart(c_oSer_ThreadedComment::id);
m_oBcw.m_oStream.WriteStringW3(oThreadedComment.id->ToString());

View File

@ -246,8 +246,8 @@ namespace BinXlsxRW
void getSavedComment(OOX::Spreadsheet::CCommentItem& oComment, std::vector<SerializeCommon::CommentData*>& aDatas);
void WriteComment(OOX::Spreadsheet::CCommentItem& oComment, std::vector<SerializeCommon::CommentData*>& aCommentDatas);
void WriteCommentData(OOX::Spreadsheet::CCommentItem& oComment, std::vector<SerializeCommon::CommentData*>& aCommentDatas);
void WriteCommentDataContent(OOX::Spreadsheet::CCommentItem* pComment, SerializeCommon::CommentData* pCommentData);
void WriteCommentReplies(std::vector<SerializeCommon::CommentData*>& aReplies);
void WriteCommentDataContent(OOX::Spreadsheet::CCommentItem* pComment, SerializeCommon::CommentData* pCommentData, bool isThreadedComment);
void WriteCommentReplies(std::vector<SerializeCommon::CommentData*>& aReplies, bool isThreadedComment);
void WriteThreadedComment(OOX::Spreadsheet::CThreadedComment& oThreadedComment, bool bThreadedCommentCopy);
void WriteThreadedCommentMention(OOX::Spreadsheet::CThreadedCommentMention& oMention);
void WriteSheetPr(const OOX::Spreadsheet::CSheetPr& oSheetPr);

View File

@ -3179,6 +3179,8 @@ int BinaryCommentReader::ReadCommentData(BYTE type, long length, void* poResult)
pComments->sUserName = m_oBufferedStream.GetString4(length);
else if ( c_oSer_CommentData::QuoteText == type )
pComments->sQuoteText = m_oBufferedStream.GetString4(length);
else if ( c_oSer_CommentData::Guid == type )
pComments->sGuid = m_oBufferedStream.GetString4(length);
else if ( c_oSer_CommentData::Solved == type )
{
pComments->bSolved = true;
@ -3774,7 +3776,7 @@ void BinaryWorksheetsTableReader::WriteComments()
pComments->m_oAuthors.Init();
OOX::Spreadsheet::CThreadedComments* pThreadedComments = new OOX::Spreadsheet::CThreadedComments(NULL);
OOX::Spreadsheet::CThreadedComments* pThreadedComments = NULL;
for (boost::unordered_map<std::wstring, OOX::Spreadsheet::CCommentItem*>::const_iterator it = m_pCurWorksheet->m_mapComments.begin(); it != m_pCurWorksheet->m_mapComments.end(); ++it)
{
@ -3789,6 +3791,12 @@ void BinaryWorksheetsTableReader::WriteComments()
}
if(NULL != pCommentItem->m_pThreadedComment)
{
if(NULL == pThreadedComments)
{
pThreadedComments = new OOX::Spreadsheet::CThreadedComments(NULL);
NSCommon::smart_ptr<OOX::File> pThreadedCommentsFile(pThreadedComments);
m_pCurWorksheet->Add(pThreadedCommentsFile);
}
OOX::Spreadsheet::CThreadedComment* pThreadedComment = pCommentItem->m_pThreadedComment;
if( pNewComment->m_oRef.IsInit())
{
@ -3852,8 +3860,6 @@ void BinaryWorksheetsTableReader::WriteComments()
NSCommon::smart_ptr<OOX::File> pCommentsFile(pComments);
m_pCurWorksheet->Add(pCommentsFile);
NSCommon::smart_ptr<OOX::File> pThreadedCommentsFile(pThreadedComments);
m_pCurWorksheet->Add(pThreadedCommentsFile);
}
}
int BinaryWorksheetsTableReader::ReadPivotTable(BYTE type, long length, void* poResult)