oox/source/ole/vbaexport.cxx | 86 ++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 26 deletions(-)
New commits: commit dff0afcd5ec2b02b3dad831115f3f4205ac2bb47 Author: Rosemary <rosemarys...@gmail.com> Date: Sat Sep 5 17:18:49 2015 +0530 Fix the module export code Change-Id: I56d239927d8a83b2b71f52da36394710a52b0a06 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 4539089..af997ce 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -615,15 +615,17 @@ void exportDirStream(SvStream& rStrm, css::uno::Reference<css::container::XNameC aCompression.write(); } -void exportModuleStream(SvStream& rStrm, css::uno::Reference<css::container::XNameContainer> xNameContainer, OUString aSourceCode) +// section 2.3.4.3 Module Stream +void exportModuleStream(SvStream& rStrm, OUString aSourceCode, OUString aElementName) { SvMemoryStream aModuleStream(4096, 4096); + exportString(aModuleStream, "Attribute VB_Name = \"" + aElementName + "\"\r\n"); exportString(aModuleStream, aSourceCode); aModuleStream.Seek(0); #if VBA_EXPORT_DEBUG - const OUString aModuleFileName("/tmp/vba_module_out.bin"); + OUString aModuleFileName("/tmp/vba_" + aElementName + "_out.bin"); SvFileStream aModuleStreamDebug(aModuleFileName, STREAM_READWRITE); aModuleStreamDebug.WriteStream(aModuleStream); aModuleStream.Seek(0); @@ -637,6 +639,7 @@ void exportModuleStream(SvStream& rStrm, css::uno::Reference<css::container::XNa aCompression.write(); } +// section 2.3.4.1 _VBA_PROJECT Stream void exportVBAProjectStream(SvStream& rStrm) { rStrm.WriteUInt16(0x61CC); // Reserved1 @@ -670,7 +673,7 @@ void VbaExport::exportVBA(SotStorage* pRootStorage) css::uno::Any aCode = xNameContainer->getByName(aElementNames[i]); OUString aSourceCode; aCode >>= aSourceCode; - exportModuleStream(*pModuleStream[i], xNameContainer, aSourceCode); + exportModuleStream(*pModuleStream[i], aSourceCode, aElementNames[i]); } exportVBAProjectStream(*pVBAProjectStream); commit 44c3aac7b718863207a483ccc425c729c77d2169 Author: Rosemary <rosemarys...@gmail.com> Date: Sat Sep 5 15:22:11 2015 +0530 Export the module streams Change-Id: I132c71e06307dbb0a381d85a6d2ba7a9bd1dd5ec diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 48db2a3..4539089 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -615,6 +615,28 @@ void exportDirStream(SvStream& rStrm, css::uno::Reference<css::container::XNameC aCompression.write(); } +void exportModuleStream(SvStream& rStrm, css::uno::Reference<css::container::XNameContainer> xNameContainer, OUString aSourceCode) +{ + SvMemoryStream aModuleStream(4096, 4096); + + exportString(aModuleStream, aSourceCode); + aModuleStream.Seek(0); + +#if VBA_EXPORT_DEBUG + const OUString aModuleFileName("/tmp/vba_module_out.bin"); + SvFileStream aModuleStreamDebug(aModuleFileName, STREAM_READWRITE); + aModuleStreamDebug.WriteStream(aModuleStream); + aModuleStream.Seek(0); +#endif + + // the stream for the compression + SvMemoryStream aMemoryStream(4096, 4096); + aMemoryStream.WriteStream(aModuleStream); + + VBACompression aCompression(rStrm, aModuleStream); + aCompression.write(); +} + void exportVBAProjectStream(SvStream& rStrm) { rStrm.WriteUInt16(0x61CC); // Reserved1 @@ -627,18 +649,36 @@ void exportVBAProjectStream(SvStream& rStrm) void VbaExport::exportVBA(SotStorage* pRootStorage) { + css::uno::Reference<css::container::XNameContainer> xNameContainer = getBasicLibrary(); + css::uno::Sequence<OUString> aElementNames = xNameContainer->getElementNames(); + sal_Int32 n = aElementNames.getLength(); // get the number of modules + // start here with the VBA export SotStorage* pVBAStream = pRootStorage->OpenSotStorage("VBA", STREAM_READWRITE); SotStorageStream* pDirStream = pVBAStream->OpenSotStream("dir", STREAM_READWRITE); + SotStorageStream* pModuleStream[n]; + for (sal_Int32 i = 0; i < n; ++i) + { + pModuleStream[i] = pVBAStream->OpenSotStream(aElementNames[i], STREAM_READWRITE); + } SotStorageStream* pVBAProjectStream = pVBAStream->OpenSotStream("_VBA_PROJECT", STREAM_READWRITE); - css::uno::Reference<css::container::XNameContainer> xNameContainer = getBasicLibrary(); - // export exportDirStream(*pDirStream, xNameContainer); + for (sal_Int32 i = 0; i < n; ++i) + { + css::uno::Any aCode = xNameContainer->getByName(aElementNames[i]); + OUString aSourceCode; + aCode >>= aSourceCode; + exportModuleStream(*pModuleStream[i], xNameContainer, aSourceCode); + } exportVBAProjectStream(*pVBAProjectStream); pVBAProjectStream->Commit(); + for(sal_Int32 i = 0; i < n; i++) + { + pModuleStream[i]->Commit(); + } pDirStream->Commit(); pVBAStream->Commit(); pRootStorage->Commit(); commit b4e2531ecd29755d3dfaaa10caa04dab11dd887c Author: Rosemary <rosemarys...@gmail.com> Date: Sat Sep 5 08:26:56 2015 +0530 Make the existing code generic Modify the calls to the writePROJECTMODULE method within the writePROJECTMODULES method which are currently specific to the example document Change-Id: I20db96e6c4eb1009f7bc81bec3490b9084532854 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 06dc8aa..48db2a3 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -540,9 +540,9 @@ void writeMODULECOOKIE(SvStream& rStrm) } // section 2.3.4.2.3.2.8 -void writeMODULETYPE(SvStream& rStrm, const OUString type) +void writeMODULETYPE(SvStream& rStrm, const sal_uInt16 type) { - if(type == "procedure") + if(type == 1) rStrm.WriteUInt16(0x0021); // id for a procedural module else rStrm.WriteUInt16(0x0022); // id for document, class or design module @@ -550,7 +550,7 @@ void writeMODULETYPE(SvStream& rStrm, const OUString type) } // section 2.3.4.2.3.2 -void writePROJECTMODULE(SvStream& rStrm, const OUString name, const OUString streamName, sal_uInt32 offset, const OUString type) +void writePROJECTMODULE(SvStream& rStrm, const OUString name, const OUString streamName, sal_uInt32 offset, const sal_uInt16 type) { writeMODULENAME(rStrm, name); writeMODULENAMEUNICODE(rStrm, name); @@ -565,29 +565,35 @@ void writePROJECTMODULE(SvStream& rStrm, const OUString name, const OUString str } // section 2.3.4.2.3 -void writePROJECTMODULES(SvStream& rStrm) +void writePROJECTMODULES(SvStream& rStrm, css::uno::Reference<css::container::XNameContainer> xNameContainer) { + css::uno::Sequence<OUString> aElementNames = xNameContainer->getElementNames(); + sal_Int32 n = aElementNames.getLength(); + css::uno::Reference<css::script::vba::XVBAModuleInfo> xModuleInfo(xNameContainer, css::uno::UNO_QUERY); + assert(xModuleInfo.is()); + // TODO: this whole part is document specific rStrm.WriteUInt16(0x000F); // id rStrm.WriteUInt32(0x00000002); // size of Count - sal_Int16 count = 5; // Number of modules // TODO: this is dependent on the document + sal_Int16 count = n; // Number of modules // TODO: this is dependent on the document rStrm.WriteUInt16(count); // Count writePROJECTCOOKIE(rStrm); - writePROJECTMODULE(rStrm, "Module1", "Module1", 0x00000379, "procedure"); - writePROJECTMODULE(rStrm, "ThisWorkbook", "ThisWorkbook", 0x00000325, "other"); - writePROJECTMODULE(rStrm, "Sheet1", "Sheet1", 0x00000325, "other"); - writePROJECTMODULE(rStrm, "Sheet2", "Sheet2", 0x00000325, "other"); - writePROJECTMODULE(rStrm, "Sheet3", "Sheet3", 0x00000325, "other"); + + for (sal_Int32 i = 0; i < n; ++i) + { + css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(aElementNames[i]); + writePROJECTMODULE(rStrm, aElementNames[i], aElementNames[i], 0x00000000, aModuleInfo.ModuleType); + } } // section 2.3.4.2 -void exportDirStream(SvStream& rStrm) +void exportDirStream(SvStream& rStrm, css::uno::Reference<css::container::XNameContainer> xNameContainer) { SvMemoryStream aDirStream(4096, 4096); writePROJECTINFORMATION(aDirStream); writePROJECTREFERENCES(aDirStream); - writePROJECTMODULES(aDirStream); + writePROJECTMODULES(aDirStream, xNameContainer); aDirStream.WriteUInt16(0x0010); // terminator aDirStream.WriteUInt32(0x00000000); // reserved @@ -626,27 +632,12 @@ void VbaExport::exportVBA(SotStorage* pRootStorage) SotStorageStream* pDirStream = pVBAStream->OpenSotStream("dir", STREAM_READWRITE); SotStorageStream* pVBAProjectStream = pVBAStream->OpenSotStream("_VBA_PROJECT", STREAM_READWRITE); + css::uno::Reference<css::container::XNameContainer> xNameContainer = getBasicLibrary(); + // export - exportDirStream(*pDirStream); + exportDirStream(*pDirStream, xNameContainer); exportVBAProjectStream(*pVBAProjectStream); - - css::uno::Reference<css::container::XNameContainer> xNameContainer = getBasicLibrary(); - css::uno::Sequence<OUString> aElementNames = xNameContainer->getElementNames(); - sal_Int32 n = aElementNames.getLength(); - css::uno::Reference<css::script::vba::XVBAModuleInfo> xModuleInfo(xNameContainer, css::uno::UNO_QUERY); - assert(xModuleInfo.is()); - for (sal_Int32 i = 0; i < n; ++i) - { - SAL_DEBUG(aElementNames[i]); - css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(aElementNames[i]); - SAL_DEBUG(aModuleInfo.ModuleType); - - css::uno::Any aCode = xNameContainer->getByName(aElementNames[i]); - OUString aSourceCode; - aCode >>= aSourceCode; - SAL_DEBUG(aSourceCode); - } pVBAProjectStream->Commit(); pDirStream->Commit(); pVBAStream->Commit(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits