diff options
author | Rosemary <rosemaryseb8@gmail.com> | 2015-09-05 15:22:11 +0530 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-09-10 04:14:51 +0200 |
commit | 4f4a668e04bdd68655a0f574027f486cea953857 (patch) | |
tree | 0d997b2ce2cbc1e2f9929f612c1c6b82aee3ff95 | |
parent | c9efb849fa99c3b0bf9b67920bde8ccfcbfae768 (diff) |
Export the module streams
Change-Id: I132c71e06307dbb0a381d85a6d2ba7a9bd1dd5ec
-rw-r--r-- | oox/source/ole/vbaexport.cxx | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 6726f61ed8a8..3435e3649ede 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(); |