From ec2901bf480c9bcc0a94bea401dbdc27430bf445 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Fri, 29 Sep 2017 14:24:57 +0300 Subject: [PATCH] RtfFormat - fix users file --- .../source/DestinationCommand.cpp | 68 ++++++++++++++++--- .../RtfFormatLib/source/DestinationCommand.h | 20 +++++- .../RtfFormatLib/source/Ole1FormatReader.h | 1 + .../RtfFormatLib/source/RtfOle.cpp | 10 ++- ASCOfficeRtfFile/RtfFormatLib/source/Utils.h | 15 ---- 5 files changed, 84 insertions(+), 30 deletions(-) diff --git a/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.cpp b/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.cpp index 34f55d2b52..eb51ed0699 100644 --- a/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.cpp +++ b/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.cpp @@ -46,7 +46,14 @@ HRESULT ConvertOle1ToOle2(BYTE *pData, int nSize, std::wstring sOle2Name) NSFile::CFileBinary file; file.CreateFileW(sOle2Name); - file.WriteFile(ole1Reader.NativeData, ole1Reader.NativeDataSize); + if (ole1Reader.NativeDataSize > 0)//conv_NI38P7GBIpw1aD84H3k.rtf + { + file.WriteFile(ole1Reader.NativeData, ole1Reader.NativeDataSize); + } + else + { + file.WriteFile(pData, nSize); + } file.CloseFile(); return S_FALSE; } @@ -817,8 +824,7 @@ bool RtfShadingRowCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader& oRe else return false; return true; -} - +} bool RtfCharPropsCommand::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter, RtfCharProperty * charProps, bool bLookOnBorder) { if (!charProps) return false; @@ -1645,7 +1651,49 @@ bool RtfFieldInstReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oRead return RtfParagraphPropDestination::ExecuteCommand( oDocument, oReader, (*this), sCommand, hasParameter, parameter ); } } +bool RtfOleBinReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter) +{ + if ( "objdata" == sCommand ) + return true; + if ( "bin" == sCommand ) // from RtfOleReader - conv_NI38P7GBIpw1aD84H3k.rtf + { + int nDataSize = 0; + if ( hasParameter ) + nDataSize = parameter; + + BYTE *pData = NULL; + + oReader.m_oLex.ReadBytes( parameter, &pData ); + + m_arData.push_back(std::string((char*)pData, nDataSize)); + + RELEASEOBJECT(pData); + } + return true; +} +void RtfOleBinReader::ExecuteText(RtfDocument& oDocument, RtfReader& oReader, std::wstring sText) +{ + m_arData.push_back(std::string(sText.begin(), sText.end())); +} +void RtfOleBinReader::GetData( BYTE** ppData, long& nSize) +{ + nSize = 0; + for (size_t i = 0; i < m_arData.size(); i++) + { + nSize += m_arData[i].length(); + } + + (*ppData) = new BYTE[ nSize]; + + int pos = 0; + for (size_t i = 0; i < m_arData.size(); i++) + { + memcpy((*ppData) + pos, m_arData[i].c_str(), m_arData[i].length()); + + pos += m_arData[i].length(); + } +} bool RtfOleReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter) { if ( "object" == sCommand ) @@ -1663,19 +1711,21 @@ bool RtfOleReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, st } else if ( "objdata" == sCommand ) { - std::wstring sOleData; - TextReader oTextReader( sOleData, false ); - StartSubReader( oTextReader, oDocument, oReader ); + RtfOleBinReader oBinReader; + + StartSubReader( oBinReader, oDocument, oReader ); BYTE *pData = NULL; long nSize = 0; - RtfUtility::WriteDataToBinary( sOleData, &pData, nSize ); + + oBinReader.GetData(&pData, nSize ); + if ( 0 != nSize && pData) { HRESULT hRes = S_FALSE; //конвертация Ole1 в Ole2 -#if 0//defined(_WIN32) || defined(_WIN64) +#if 0 //defined(_WIN32) || defined(_WIN64) RtfOle1ToOle2Stream oStream; oStream.lpstbl = new OLESTREAMVTBL(); @@ -1689,7 +1739,7 @@ bool RtfOleReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, st std::wstring sOleStorageName = Utils::CreateTempFile( oReader.m_sTempFolder ); IStorage* piMSStorage = NULL; - if ( SUCCEEDED( StgCreateDocfile( sOleStorageName, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED/* | STGM_DELETEONRELEASE*/, NULL, &piMSStorage) ) ) + if ( SUCCEEDED( StgCreateDocfile( sOleStorageName.c_str(), STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED/* | STGM_DELETEONRELEASE*/, NULL, &piMSStorage) ) ) { hRes = OleConvertOLESTREAMToIStorage( &oStream, piMSStorage, NULL ); piMSStorage->Commit( STGC_DEFAULT ); diff --git a/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.h b/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.h index 6243af3004..2cad59bf67 100644 --- a/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.h +++ b/ASCOfficeRtfFile/RtfFormatLib/source/DestinationCommand.h @@ -109,13 +109,13 @@ public: } }; //class RtfOldList; -class TextReader: public RtfAbstractReader +class TextReader : public RtfAbstractReader { private: std::wstring& m_sName; - bool m_bErease; + bool m_bErease; public: - TextReader( std::wstring& sName, bool bErease = true ):m_sName(sName),m_bErease(bErease) + TextReader( std::wstring& sName, bool bErease = true ) : m_sName(sName), m_bErease(bErease) { } void ExecuteText(RtfDocument& oDocument, RtfReader& oReader, std::wstring sText) @@ -782,6 +782,20 @@ public: bool ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter); }; +class RtfOleBinReader : public RtfAbstractReader +{ +private: + std::vector/*&*/ m_arData; +public: + RtfOleBinReader() + { + } + bool ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader, std::string sCommand, bool hasParameter, int parameter); + + void ExecuteText(RtfDocument& oDocument, RtfReader& oReader, std::wstring sText); + void GetData( BYTE** ppData, long& nSize); +}; + class RtfTrackerChangesReader: public RtfAbstractReader { private: diff --git a/ASCOfficeRtfFile/RtfFormatLib/source/Ole1FormatReader.h b/ASCOfficeRtfFile/RtfFormatLib/source/Ole1FormatReader.h index 13f536b2d3..bfddf136e3 100644 --- a/ASCOfficeRtfFile/RtfFormatLib/source/Ole1FormatReader.h +++ b/ASCOfficeRtfFile/RtfFormatLib/source/Ole1FormatReader.h @@ -300,6 +300,7 @@ public: Ole1FormatReader(BYTE *pData, int Size) { + NativeDataSize = 0; if (!pData || Size < 8) return; CDataStream stream(pData, Size); diff --git a/ASCOfficeRtfFile/RtfFormatLib/source/RtfOle.cpp b/ASCOfficeRtfFile/RtfFormatLib/source/RtfOle.cpp index de98a64501..28d2d1a256 100644 --- a/ASCOfficeRtfFile/RtfFormatLib/source/RtfOle.cpp +++ b/ASCOfficeRtfFile/RtfFormatLib/source/RtfOle.cpp @@ -93,10 +93,14 @@ std::wstring RtfOle::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oNewRenderParameter = oRenderParameter; oNewRenderParameter.nType = RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2; - m_oResultPic->m_bIsOle = true; - sResult += m_oResultPic->RenderToOOX(oNewRenderParameter); - oNewRenderParameter.nValue = m_oResultPic->m_nID; + if (m_oResultPic) + { + m_oResultPic->m_bIsOle = true; + sResult += m_oResultPic->RenderToOOX(oNewRenderParameter); + + oNewRenderParameter.nValue = m_oResultPic->m_nID; + } sResult += RenderToOOXOnlyOle(oNewRenderParameter); sResult += L""; diff --git a/ASCOfficeRtfFile/RtfFormatLib/source/Utils.h b/ASCOfficeRtfFile/RtfFormatLib/source/Utils.h index 75497f08ca..f6e82aafd6 100644 --- a/ASCOfficeRtfFile/RtfFormatLib/source/Utils.h +++ b/ASCOfficeRtfFile/RtfFormatLib/source/Utils.h @@ -617,21 +617,6 @@ public: file.CloseFile(); } - static void WriteDataToBinary( std::wstring sData, BYTE** ppData, long& nSize) - { - wchar_t * buf = (wchar_t *)sData.c_str(); - int nLengthText = (int)sData.length(); - nSize = nLengthText/2; - BYTE * buf2 = new BYTE[ nSize]; - (*ppData) = buf2; - BYTE nByte=0; - for (long i=0; i < nSize ; i++ ) - { - nByte = ToByte(buf[ 2*i])<<4; - nByte |= ToByte(buf[ 2*i+1]); - buf2[i] = nByte; - } - } static std::wstring DecodeHex( std::wstring sText ) { std::wstring sHexText;