summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRosemary <rosemaryseb8@gmail.com>2015-09-05 15:22:11 +0530
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2015-09-10 04:14:51 +0200
commit4f4a668e04bdd68655a0f574027f486cea953857 (patch)
tree0d997b2ce2cbc1e2f9929f612c1c6b82aee3ff95
parentc9efb849fa99c3b0bf9b67920bde8ccfcbfae768 (diff)
Export the module streams
Change-Id: I132c71e06307dbb0a381d85a6d2ba7a9bd1dd5ec
-rw-r--r--oox/source/ole/vbaexport.cxx44
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();