[Libreoffice-commits] core.git: Branch 'feature/vba-export' - 3 commits - oox/source
Rosemary
rosemaryseb8 at gmail.com
Mon Sep 7 06:00:01 PDT 2015
oox/source/ole/vbaexport.cxx | 86 ++++++++++++++++++++++++++++++-------------
1 file changed, 60 insertions(+), 26 deletions(-)
New commits:
commit dff0afcd5ec2b02b3dad831115f3f4205ac2bb47
Author: Rosemary <rosemaryseb8 at 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 <rosemaryseb8 at 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 <rosemaryseb8 at 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();
More information about the Libreoffice-commits
mailing list