[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