Commit 9c49255b authored by ElenaSubbotina's avatar ElenaSubbotina Committed by Alexander Trofimov

RtfFormatReader - конвертация OleFormat1 -> OleFormat2

parent e1e23f7e
...@@ -639,6 +639,10 @@ ...@@ -639,6 +639,10 @@
RelativePath="..\source\IdGenerator.h" RelativePath="..\source\IdGenerator.h"
> >
</File> </File>
<File
RelativePath="..\source\Ole1FormatReader.h"
>
</File>
<File <File
RelativePath="..\source\RtfDefine.h" RelativePath="..\source\RtfDefine.h"
> >
......
 
#include "DestinationCommand.h" #include "DestinationCommand.h"
#include "RtfOle.h" #include "RtfOle.h"
#include "Ole1FormatReader.h"
#include "ConvertationManager.h" #include "ConvertationManager.h"
HRESULT ConvertOle1ToOle2(BYTE *pData, int nSize, std::wstring sOle2Name)
{
HRESULT hr = S_FALSE;
Ole1FormatReader ole1Reader(pData, nSize);
NSFile::CFileBinary file;
file.CreateFileW(sOle2Name);
file.WriteFile(ole1Reader.NativeData, ole1Reader.NativeDataSize);
file.CloseFile();
return S_FALSE;
}
bool ShapeReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader,CString sCommand, bool hasParameter, int parameter) bool ShapeReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader,CString sCommand, bool hasParameter, int parameter)
{ {
if( _T("shp") == sCommand ) if( _T("shp") == sCommand )
...@@ -250,37 +264,46 @@ bool OleReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader,CStrin ...@@ -250,37 +264,46 @@ bool OleReader::ExecuteCommand(RtfDocument& oDocument, RtfReader& oReader,CStrin
if( 0 != nSize && pData) if( 0 != nSize && pData)
{ {
HRESULT hRes = S_FALSE; HRESULT hRes = S_FALSE;
//обекь для конвертации Ole1 в Ole2
//RtfOle1ToOle2Stream oStream; //конвертация Ole1 в Ole2
//todooo тут был чисто микрософтовский вариант - переделать !!! #if 0//defined(_WIN32) || defined(_WIN64)
//oStream.lpstbl = new OLESTREAMVTBL(); RtfOle1ToOle2Stream oStream;
//oStream.lpstbl->Get = &OleGet1;
//oStream.lpstbl->Put = &OlePut1; oStream.lpstbl = new OLESTREAMVTBL();
//oStream.pBuffer = pData; oStream.lpstbl->Get = &OleGet1;
//oStream.nBufferSize = nSize; oStream.lpstbl->Put = &OlePut1;
//oStream.nCurPos = 0; oStream.pBuffer = pData;
oStream.nBufferSize = nSize;
oStream.nCurPos = 0;
CString sOleStorageName = Utils::CreateTempFile( oReader.m_sTempFolder ); CString sOleStorageName = Utils::CreateTempFile( oReader.m_sTempFolder );
NSFile::CFileBinary file; IStorage* piMSStorage = NULL;
file.CreateFileW(sOleStorageName.GetBuffer()); if( SUCCEEDED( StgCreateDocfile( sOleStorageName, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_TRANSACTED/* | STGM_DELETEONRELEASE*/, NULL, &piMSStorage) ) )
file.WriteFile(pData, nSize); {
file.CloseFile(); hRes = OleConvertOLESTREAMToIStorage( &oStream, piMSStorage, NULL );
piMSStorage->Commit( STGC_DEFAULT );
RELEASEINTERFACE( piMSStorage );
}
delete oStream.lpstbl;
#else
std::wstring sOleStorageName = FileSystem::Directory::CreateTempFileWithUniqueName(oReader.m_sTempFolder, _T("img"));
hRes = ConvertOle1ToOle2(pData, nSize, sOleStorageName);
POLE::Storage * piRootStorage = new POLE::Storage(string2std_string(sOleStorageName).c_str()); #endif
delete[] pData;
POLE::Storage * piRootStorage = new POLE::Storage(sOleStorageName.c_str());
if( piRootStorage) if( piRootStorage)
{ {
//hRes = OleConvertOLESTREAMToIStorage( &oStream, piRootStorage, NULL ); m_oOle.SetFilename( sOleStorageName.c_str() );
m_oOle.SetFilename( sOleStorageName );
m_oOle.SetOle( piRootStorage ); m_oOle.SetOle( piRootStorage );
//RELEASEOBJECT( piRootStorage );
hRes = S_OK; hRes = S_OK;
} }
//delete oStream.lpstbl;
delete[] pData;
if( hRes != S_OK ) if( hRes != S_OK )
Utils::RemoveDirOrFile( sOleStorageName ); Utils::RemoveDirOrFile( sOleStorageName.c_str() );
} }
} }
else if( _T("result") == sCommand ) else if( _T("result") == sCommand )
......
#pragma once
class CDataStream
{
public:
CDataStream() : pBuffer(NULL)
{
}
CDataStream(BYTE* pBuf, unsigned int unSize)
{
SetStream(pBuf, unSize);
}
~CDataStream()
{
}
void SetStream(BYTE* pBuf, unsigned int unSize)
{
pBuffer = pBuf;
pCur = pBuf;
pEnd = pBuf + unSize + 1;
};
BYTE* GetCurPtr()
{
return pCur;
}
unsigned char ReadUChar()
{
if (pCur + 1 >= pEnd)
return 0;
unsigned char unResult = pCur[0];
pCur++;
return unResult;
};
unsigned short ReadUShort()
{
if (pCur + 2 >= pEnd)
return 0;
unsigned short ushResult = (pCur[0]) | ((pCur[1]) << 8);
pCur += 2;
return ushResult;
};
unsigned int ReadULong()
{
if (pCur + 4 >= pEnd)
return 0;
unsigned int unResult = (unsigned int)((pCur[0] << 0) | ((pCur[1]) << 8) | ((pCur[2]) << 16) | ((pCur[3]) << 24));
pCur += 4;
return unResult;
};
double ReadDouble()
{
if (pCur + 4 >= pEnd)
return 0;
float output;
*((unsigned char*)(&output) + 0) = pCur[0];
*((unsigned char*)(&output) + 1) = pCur[1];
*((unsigned char*)(&output) + 2) = pCur[2];
*((unsigned char*)(&output) + 3) = pCur[3];
pCur += 4;
return output;
int lIntValue = (int)((pCur[0] << 16) | ((pCur[1]) << 8) | ((pCur[2]) << 0));
int lFracValue = (int)(pCur[3]);
pCur += 4;
return (double)(lIntValue + (lFracValue / 16.0));
};
char ReadChar()
{
return (char)ReadUChar();
};
short ReadShort()
{
return (short)ReadUShort();
};
int ReadLong()
{
return (int)ReadULong();
};
void ReadBytes(char* pBuffer, unsigned int ulSize)
{
size_t ulRemainSize = (pEnd - pCur);
size_t ulFinalSize = (ulRemainSize > ulSize ? ulSize : ulRemainSize);
for (size_t ulIndex = 0; ulIndex < ulFinalSize; ulIndex++)
{
pBuffer[ulIndex] = ReadChar();
}
};
void ReadBytes(unsigned char* pBuffer, unsigned int ulSize)
{
size_t ulRemainSize = (pEnd - pCur);
size_t ulFinalSize = (ulRemainSize > ulSize ? ulSize : ulRemainSize);
for (size_t ulIndex = 0; ulIndex < ulFinalSize; ulIndex++)
{
pBuffer[ulIndex] = ReadChar();
}
};
void ReadBytes(unsigned short* pBuffer, unsigned int ulSize)
{
size_t ulRemainSize = (pEnd - pCur) / 2;
size_t ulFinalSize = (ulRemainSize > ulSize ? ulSize : ulRemainSize);
for (size_t ulIndex = 0; ulIndex < ulFinalSize; ulIndex++)
{
pBuffer[ulIndex] = ReadUShort();
}
}
void ReadBytes(short* pBuffer, unsigned int ulSize)
{
size_t ulRemainSize = (pEnd - pCur) / 2;
size_t ulFinalSize = (ulRemainSize > ulSize ? ulSize : ulRemainSize);
for (size_t ulIndex = 0; ulIndex < ulFinalSize; ulIndex++)
{
pBuffer[ulIndex] = ReadShort();
}
}
void ReadBytes(unsigned int* pBuffer, unsigned int ulSize)
{
size_t ulRemainSize = (pEnd - pCur) / 4;
size_t ulFinalSize = (ulRemainSize > ulSize ? ulSize : ulRemainSize);
for (size_t ulIndex = 0; ulIndex < ulFinalSize; ulIndex++)
{
pBuffer[ulIndex] = ReadULong();
}
}
CDataStream& operator>>(unsigned char& nValue)
{
nValue = ReadUChar();
return *this;
}
CDataStream& operator>>(unsigned short& nValue)
{
nValue = ReadUShort();
return *this;
}
CDataStream& operator>>(unsigned int& nValue)
{
nValue = ReadULong();
return *this;
}
CDataStream& operator>>(unsigned long& nValue)
{
nValue = ReadULong();
return *this;
}
CDataStream& operator>>(double& dValue)
{
dValue = ReadDouble();
return *this;
}
CDataStream& operator>>(char& nValue)
{
nValue = ReadChar();
return *this;
}
CDataStream& operator>>(bool& nValue)
{
nValue = !!ReadChar();
return *this;
}
CDataStream& operator>>(short& nValue)
{
nValue = ReadShort();
return *this;
}
CDataStream& operator>>(int& nValue)
{
nValue = ReadLong();
return *this;
}
CDataStream& operator>>(long& nValue)
{
nValue = ReadLong();
return *this;
}
bool IsValid() const
{
if (NULL == pBuffer)
return false;
return true;
}
bool IsEof() const
{
if (pCur >= pEnd)
return true;
return false;
}
unsigned int Tell()
{
return (unsigned int)(pCur - pBuffer);
}
void Skip(unsigned int ulSkip)
{
pCur += ulSkip;
}
void SeekBack(unsigned int ulSkipBack)
{
pCur -= ulSkipBack;
}
void SeekToStart()
{
pCur = pBuffer;
}
unsigned int CanRead()
{
return (unsigned int)(pEnd - pCur);
}
private:
BYTE *pBuffer;
BYTE *pCur;
BYTE *pEnd;
};
struct LengthPrefixedAnsiString
{
_UINT32 size;
std::string val;
};
CDataStream & operator >> (CDataStream & strm, LengthPrefixedAnsiString & str)
{
strm >> str.size;
char *s = new char[str.size];
strm.ReadBytes(s, str.size);
str.val = std::string(s,str.size);
delete []s;
return strm;
}
struct ObjectHeader
{
_UINT32 OLEVersion;
_UINT32 FormatID;
LengthPrefixedAnsiString ClassName;
_UINT32 Width;
_UINT32 Height;
};
class Ole1FormatReader
{
public:
Ole1FormatReader(BYTE *pData, int Size)
{
if (!pData || Size < 8) return;
CDataStream stream(pData, Size);
stream >> Header.OLEVersion >> Header.FormatID;
if (Header.OLEVersion & 0x00000500)
{
stream >> Header.ClassName;
}
stream >> Header.Width >> Header.Height;
stream >> NativeDataSize;
NativeData = stream.GetCurPtr();
stream.Skip(NativeDataSize);
int sz = stream.CanRead();
/// далее графическое представление
}
ObjectHeader Header;
_UINT32 NativeDataSize;
BYTE *NativeData;
//PresentationObjectHeader PresentationHeader;
};
...@@ -139,6 +139,13 @@ public: ...@@ -139,6 +139,13 @@ public:
void SetSource( std::wstring sPath ) void SetSource( std::wstring sPath )
{ {
m_oStream.SetSource( sPath); m_oStream.SetSource( sPath);
if (m_oStream.getSize() > m_nReadBufSize)
{
m_nReadBufSize = m_oStream.getSize() ;
if (m_caReadBuffer) delete []m_caReadBuffer;
m_caReadBuffer = new char[m_nReadBufSize];
}
} }
void CloseSource() void CloseSource()
{ {
......
...@@ -113,28 +113,40 @@ public: ...@@ -113,28 +113,40 @@ public:
CString RenderToOOX(RenderParameter oRenderParameter) CString RenderToOOX(RenderParameter oRenderParameter)
{ {
CString sResult; CString sResult;
#ifdef RTF_MATH_OOX //#ifdef RTF_MATH_OOX
RenderParameter oNewParam = oRenderParameter; RenderParameter oNewParam = oRenderParameter;
sResult.AppendFormat( _T("<%ls"), m_sOOXName ); sResult.Append( _T("<") );
sResult += m_sOOXName;
oNewParam.nType = RENDER_TO_OOX_PARAM_MATH; oNewParam.nType = RENDER_TO_OOX_PARAM_MATH;
CString sVal = m_oVal.RenderToOOX( oNewParam ); CString sVal = m_oVal.RenderToOOX( oNewParam );
if( false == sVal.IsEmpty() ) if( false == sVal.IsEmpty() )
sResult.AppendFormat( _T(" w:val=\"%ls\""), sVal ); {
sResult.Append( _T(" w:val=\"") );
sResult += sVal;
sResult.Append( _T("\"") );
}
sResult.Append( _T(">") ); sResult.Append( _T(">") );
oNewParam.nType = RENDER_TO_OOX_PARAM_TEXT; oNewParam.nType = RENDER_TO_OOX_PARAM_TEXT;
sResult.Append( oProperty.RenderToOOX( oNewParam ) ); sResult.Append( oProperty.RenderToOOX( oNewParam ) );
for( int i = 0; i < (int)m_aArray.size(); i++ ) for( int i = 0; i < (int)m_aArray.size(); i++ )
{
sResult.Append(m_aArray[i]->RenderToOOX(oNewParam)); sResult.Append(m_aArray[i]->RenderToOOX(oNewParam));
}
sResult.AppendFormat(_T("</%ls>"), m_sOOXName); sResult.Append(_T("</") );
sResult += m_sOOXName;
sResult.Append(_T(">"));
#else //#else
if( NULL != m_oPicture ) // if( NULL != m_oPicture )
sResult.Append( m_oPicture->RenderToOOX(oRenderParameter) ); // sResult.Append( m_oPicture->RenderToOOX(oRenderParameter) );
#endif //#endif
return sResult; return sResult;
} }
}; };
......
...@@ -18,6 +18,7 @@ CString RtfOle::RenderToOOX(RenderParameter oRenderParameter) ...@@ -18,6 +18,7 @@ CString RtfOle::RenderToOOX(RenderParameter oRenderParameter)
{ {
sResult.Append( _T("<w:r>") ); sResult.Append( _T("<w:r>") );
sResult.AppendFormat( _T("<w:object w:dxaOrig=\"%d\" w:dyaOrig=\"%d\">"), m_nWidth, m_nHeight ); sResult.AppendFormat( _T("<w:object w:dxaOrig=\"%d\" w:dyaOrig=\"%d\">"), m_nWidth, m_nHeight );
RenderParameter oNewRenderParameter = oRenderParameter; RenderParameter oNewRenderParameter = oRenderParameter;
oNewRenderParameter.nType = RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2; oNewRenderParameter.nType = RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2;
m_oResultPic->m_bIsOle = true; m_oResultPic->m_bIsOle = true;
...@@ -71,3 +72,31 @@ CString RtfOle::RenderToOOXOnlyOle(RenderParameter oRenderParameter) ...@@ -71,3 +72,31 @@ CString RtfOle::RenderToOOXOnlyOle(RenderParameter oRenderParameter)
sResult.Append( _T("/>") ); sResult.Append( _T("/>") );
return sResult; return sResult;
} }
#if defined(_WIN32) || defined(_WIN64)
DWORD CALLBACK OlePut1(LPOLESTREAM oStream, const void FAR* pTarget, DWORD dwRead)
{
return 0;
}
DWORD CALLBACK OleGet2(LPOLESTREAM oStream, void FAR* pTarget, DWORD dwRead)
{
return 0;
}
DWORD CALLBACK OleGet1(LPOLESTREAM oStream, void FAR* pTarget, DWORD dwRead)
{
RtfOle1ToOle2Stream* piStream = static_cast<RtfOle1ToOle2Stream*>(oStream);
if( piStream->nCurPos + (int)dwRead > piStream->nBufferSize )
return 0;
memcpy( pTarget, (piStream->pBuffer + piStream->nCurPos) , dwRead );
piStream->nCurPos += dwRead;
return dwRead;
}
DWORD CALLBACK OlePut2(LPOLESTREAM oStream, const void FAR* pTarget, DWORD dwWrite)
{
RtfOle2ToOle1Stream* piStream = static_cast<RtfOle2ToOle1Stream*>(oStream);
BYTE* pSource = (BYTE*)pTarget;
for( int i = 0; i < (int)dwWrite; i++ )
piStream->aBuffer.push_back( pSource[i] );
return dwWrite;
}
#endif
\ No newline at end of file
...@@ -74,7 +74,7 @@ public: ...@@ -74,7 +74,7 @@ public:
{ {
if (piOle == NULL) return; if (piOle == NULL) return;
m_piStorage = new POLE::Storage(*piOle); m_piStorage = piOle;
} }
void SetDefault() void SetDefault()
{ {
...@@ -95,18 +95,34 @@ private: ...@@ -95,18 +95,34 @@ private:
}; };
typedef boost::shared_ptr<RtfOle> RtfOlePtr; typedef boost::shared_ptr<RtfOle> RtfOlePtr;
struct RtfOle1ToOle2Stream : POLE::Stream
{
BYTE* pBuffer;
long nBufferSize; #if defined (_WIN32) || defined (_WIN64)
long nCurPos; struct RtfOle1ToOle2Stream : OLESTREAM
}; {
struct RtfOle2ToOle1Stream : POLE::Stream BYTE* pBuffer;
{ long nBufferSize;
std::vector<BYTE> aBuffer; long nCurPos;
}; };
//DWORD CALLBACK OleGet1(POLE::Stream* oStream, void FAR* pTarget, DWORD dwRead);; struct RtfOle2ToOle1Stream : OLESTREAM
//DWORD CALLBACK OlePut1(POLE::Stream*, const void FAR*, DWORD); {
//DWORD CALLBACK OleGet2(POLE::Stream* oStream, void FAR* pTarget, DWORD dwRead);; std::vector<BYTE> aBuffer;
//DWORD CALLBACK OlePut2(POLE::Stream*, const void FAR*, DWORD); };
DWORD CALLBACK OleGet1(LPOLESTREAM oStream, void FAR* pTarget, DWORD dwRead);;
DWORD CALLBACK OlePut1(LPOLESTREAM, const void FAR*, DWORD);
DWORD CALLBACK OleGet2(LPOLESTREAM oStream, void FAR* pTarget, DWORD dwRead);;
DWORD CALLBACK OlePut2(LPOLESTREAM, const void FAR*, DWORD);
#else
struct RtfOle1ToOle2Stream : POLE::Stream
{
BYTE* pBuffer;
long nBufferSize;
long nCurPos;
};
struct RtfOle2ToOle1Stream : POLE::Stream
{
std::vector<BYTE> aBuffer;
};
#endif
\ No newline at end of file
...@@ -21,13 +21,13 @@ bool RtfReader::Load() ...@@ -21,13 +21,13 @@ bool RtfReader::Load()
void RtfReader::PushState() void RtfReader::PushState()
{ {
ReaderStatePtr psaveNew = ReaderStatePtr(new ReaderState()); ReaderStatePtr psaveNew = ReaderStatePtr(new ReaderState());
psaveNew -> m_nUD = m_oState->m_nUD; psaveNew -> m_nUD = m_oState->m_nUD;
psaveNew -> m_oCharProp = m_oState->m_oCharProp; psaveNew -> m_oCharProp = m_oState->m_oCharProp;
psaveNew -> m_oParagraphProp = m_oState->m_oParagraphProp; psaveNew -> m_oParagraphProp = m_oState->m_oParagraphProp;
psaveNew -> m_oRowProperty = m_oState->m_oRowProperty; psaveNew -> m_oRowProperty = m_oState->m_oRowProperty;
psaveNew -> m_oCellProperty = m_oState->m_oCellProperty; psaveNew -> m_oCellProperty = m_oState->m_oCellProperty;
psaveNew -> m_oCurOldList = m_oState->m_oCurOldList; psaveNew -> m_oCurOldList = m_oState->m_oCurOldList;
//psaveNew -> m_oSectionProp = m_oState->m_oSectionProp; //psaveNew -> m_oSectionProp = m_oState->m_oSectionProp;
psaveNew -> psave = m_oState; psaveNew -> psave = m_oState;
m_oState = psaveNew; m_oState = psaveNew;
......
...@@ -601,7 +601,8 @@ public: ...@@ -601,7 +601,8 @@ public:
{ {
CString sResult = sText; CString sResult = sText;
//обрезавем лишние пробелы //обрезавем лишние пробелы
sResult.Trim(); //sResult.Trim();
//удаляем дублирующие пробелы //удаляем дублирующие пробелы
while( sResult.Replace( _T(" "), _T(" ") ) > 0 ) while( sResult.Replace( _T(" "), _T(" ") ) > 0 )
; ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment