#include "stdafx.h" #include "RtfOle.h" #include "OOXWriter.h" #include "OOXRelsWriter.h" #include "RtfDocument.h" CString RtfOle::RenderToOOX(RenderParameter oRenderParameter) { if( false == IsValid() ) return _T(""); CString sResult; if( RENDER_TO_OOX_PARAM_OLE_ONLY == oRenderParameter.nType ) { sResult.Append( RenderToOOXOnlyOle(oRenderParameter) ); } else { sResult.Append( _T("") ); sResult.AppendFormat( _T(""), m_nWidth, m_nHeight ); RenderParameter oNewRenderParameter = oRenderParameter; oNewRenderParameter.nType = RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2; m_oResultPic->m_bIsOle = true; sResult.Append( m_oResultPic->RenderToOOX(oNewRenderParameter) ); oNewRenderParameter.nValue = m_oResultPic->m_nID; sResult.Append( RenderToOOXOnlyOle(oNewRenderParameter) ); sResult.Append( _T("") ); sResult.Append( _T("") ); } return sResult; } CString RtfOle::RenderToOOXOnlyOle(RenderParameter oRenderParameter) { CString sResult; OOXWriter* poOOXWriter = static_cast(oRenderParameter.poWriter); OOXRelsWriter* poRelsWriter = static_cast(oRenderParameter.poRels); RtfDocument* poDocument = static_cast(oRenderParameter.poDocument); sResult.Append( _T("GetShapeId( oRenderParameter.nValue ) ); sResult.Append( _T(" DrawAspect=\"Content\"") ); sResult.AppendFormat( _T(" ObjectID=\"%s\""), poDocument->m_oIdGenerator.Generate_OleId() ); CString sExtension = _T("bin"); CString sMime = _T("application/vnd.openxmlformats-officedocument.oleObject"); CString sFilenameFull; CString sFilenameRels; sFilenameRels.AppendFormat( _T("embeddings/oleObject%d.%s"), poDocument->m_oIdGenerator.Generate_OleIndex(), sExtension); sFilenameFull = poOOXWriter->m_sTargetFolder + _T("/") + poOOXWriter->m_sDocumentFolder + _T("/") +sFilenameRels; CreateDirectory( poOOXWriter->m_sTargetFolder + _T("/") + poOOXWriter->m_sDocumentFolder + _T("/embeddings"), NULL); Utils::CopyDirOrFile( m_sOleFilename, sFilenameFull ); poOOXWriter->m_oContentTypes.AddExtension( sMime, sExtension); CString srId = poRelsWriter->AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"), sFilenameRels); sResult.AppendFormat( _T(" r:id=\"%s\""), srId ); sResult.Append( _T("/>") ); return sResult; } DWORD CALLBACK OleGet1(LPOLESTREAM oStream, void FAR* pTarget, DWORD dwRead) { RtfOle1ToOle2Stream* piStream = static_cast(oStream); if( piStream->nCurPos + (int)dwRead > piStream->nBufferSize ) return 0; memcpy( pTarget, (piStream->pBuffer + piStream->nCurPos) , dwRead ); piStream->nCurPos += dwRead; return dwRead; } 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 OlePut2(LPOLESTREAM oStream, const void FAR* pTarget, DWORD dwWrite) { RtfOle2ToOle1Stream* piStream = static_cast(oStream); BYTE* pSource = (BYTE*)pTarget; for( int i = 0; i < (int)dwWrite; i++ ) piStream->aBuffer.Add( pSource[i] ); return dwWrite; }