oox/source/ole/vbaexport.cxx | 584 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 531 insertions(+), 53 deletions(-)
New commits: commit 1e7a41a8618cd6bbabfb9f8c3d4a470d361944ef Author: Rosemary <[email protected]> Date: Fri Aug 14 11:36:05 2015 +0530 termination of dir stream Change-Id: Iac2284fe0876afe244fad8f33fe88402dc48a704 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 9f54e03..93c228f 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -646,6 +646,8 @@ void exportDirStream(SvStream& rStrm) writePROJECTINFORMATION(rStrm); writePROJECTREFERENCES(rStrm); writePROJECTMODULES(rStrm); + rStrm.WriteUInt16(0x0010); // terminator + rStrm.WriteUInt32(0x00000000); // reserved } } commit de136c316c4336b200405ba5fd141a7989371926 Author: Rosemary <[email protected]> Date: Fri Aug 14 11:29:41 2015 +0530 implementing the fifth module - sheet3 Change-Id: I50abe3687e37fad43ffb93b360f82acf07d74331 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 4494093..9f54e03 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -637,6 +637,7 @@ void writePROJECTMODULES(SvStream& rStrm) writePROJECTMODULE(rStrm, "ThisWorkbook", "ThisWorkbook", 0x000004BD, "other"); writePROJECTMODULE(rStrm, "Sheet1", "Sheet1", 0x00000325, "other"); writePROJECTMODULE(rStrm, "Sheet2", "Sheet2", 0x00000325, "other"); + writePROJECTMODULE(rStrm, "Sheet3", "Sheet3", 0x00000325, "other"); } // section 2.3.4.2 commit add8a73eeb78970128a126c748e3f951d3b93bca Author: Rosemary <[email protected]> Date: Fri Aug 14 11:17:30 2015 +0530 implementing the fourth module - sheet2 Change-Id: Ib3ff765e3646ba381e6d01654147ba1fdda65377 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 65fc6d6..4494093 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -636,6 +636,7 @@ void writePROJECTMODULES(SvStream& rStrm) writePROJECTMODULE(rStrm, "Module1", "Module1", 0x00000379, "procedure"); writePROJECTMODULE(rStrm, "ThisWorkbook", "ThisWorkbook", 0x000004BD, "other"); writePROJECTMODULE(rStrm, "Sheet1", "Sheet1", 0x00000325, "other"); + writePROJECTMODULE(rStrm, "Sheet2", "Sheet2", 0x00000325, "other"); } // section 2.3.4.2 commit 526e371a9665ba63291df744b7b746791b05fd01 Author: Rosemary <[email protected]> Date: Fri Aug 14 11:11:55 2015 +0530 implementing the third module - sheet1 Change-Id: I57633ce039163fa9145a3aa71b594c4b30999475 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 58c1207..65fc6d6 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -635,6 +635,7 @@ void writePROJECTMODULES(SvStream& rStrm) writePROJECTCOOKIE(rStrm); writePROJECTMODULE(rStrm, "Module1", "Module1", 0x00000379, "procedure"); writePROJECTMODULE(rStrm, "ThisWorkbook", "ThisWorkbook", 0x000004BD, "other"); + writePROJECTMODULE(rStrm, "Sheet1", "Sheet1", 0x00000325, "other"); } // section 2.3.4.2 commit cfb7b30693f353fe46431ed7c5571c46792ce36f Author: Rosemary <[email protected]> Date: Fri Aug 14 11:05:35 2015 +0530 implementing the second module Change-Id: I6a9e1fb07c990bcf65fa15e84e72cc410996cd73 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 1b82b8e..58c1207 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -634,6 +634,7 @@ void writePROJECTMODULES(SvStream& rStrm) rStrm.WriteUInt16(count); // Count writePROJECTCOOKIE(rStrm); writePROJECTMODULE(rStrm, "Module1", "Module1", 0x00000379, "procedure"); + writePROJECTMODULE(rStrm, "ThisWorkbook", "ThisWorkbook", 0x000004BD, "other"); } // section 2.3.4.2 commit c80ccce5ea8534b6a205778fba5e9010d31fda15 Author: Rosemary <[email protected]> Date: Fri Aug 14 10:53:59 2015 +0530 modified to implement more module records Conflicts: oox/source/ole/vbaexport.cxx Change-Id: I292869ffd8b2e5aa5d2ba865c237ed1536db3fdb diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 578da98..1b82b8e 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -537,30 +537,33 @@ void writePROJECTCOOKIE(SvStream& rStrm) } // section 2.3.4.2.3.2.1 -void writeMODULENAME(SvStream& rStrm) +void writeMODULENAME(SvStream& rStrm, const OUString name) { rStrm.WriteUInt16(0x0019); // id - rStrm.WriteUInt32(7); // sizeOfModuleName - exportString(rStrm, "Module1"); // ModuleName // TODO: dependent on the document + sal_Int32 n = name.getLength(); // sizeOfModuleName + rStrm.WriteUInt32(n); + exportString(rStrm, name); // ModuleName } // section 2.3.4.2.3.2.2 -void writeMODULENAMEUNICODE(SvStream& rStrm) +void writeMODULENAMEUNICODE(SvStream& rStrm, const OUString name) { rStrm.WriteUInt16(0x0047); // id - rStrm.WriteUInt32(14); // sizeOfModuleName - exportUTF16String(rStrm, "Module1"); // ModuleName // TODO: dependent on the document + sal_Int32 n = name.getLength() * 2; // sizeOfModuleNameUnicode // TODO: better calculation for unicode string length + rStrm.WriteUInt32(n); + exportUTF16String(rStrm, name); // ModuleNameUnicode } // section 2.3.4.2.3.2.3 -void writeMODULESTREAMNAME(SvStream& rStrm) +void writeMODULESTREAMNAME(SvStream& rStrm, const OUString streamName) { rStrm.WriteUInt16(0x001A); // id - rStrm.WriteUInt32(7); // sizeOfStreamName - exportString(rStrm, "Module1"); // StreamName // TODO: dependent on the document + sal_Int32 n = streamName.getLength(); // sizeOfStreamName + rStrm.WriteUInt32(n); + exportString(rStrm, streamName); // StreamName rStrm.WriteUInt16(0x0032); // reserved - rStrm.WriteUInt32(14); // sizeOfModuleStreamName - exportUTF16String(rStrm, "Module1"); // ModuleStreamName // TODO: dependent on the document + rStrm.WriteUInt32(n * 2); // sizeOfStreamNameUnicode // TODO: better calculation for unicode string length + exportUTF16String(rStrm, streamName); // StreamNameUnicode } // section 2.3.4.2.3.2.4 @@ -573,11 +576,11 @@ void writeMODULEDOCSTRING(SvStream& rStrm) } // section 2.3.4.2.3.2.5 -void writeMODULEOFFSET(SvStream& rStrm) +void writeMODULEOFFSET(SvStream& rStrm, sal_uInt32 offset) { rStrm.WriteUInt16(0x0031); // id rStrm.WriteUInt32(0x00000004); // sizeOfTextOffset - rStrm.WriteUInt32(0x00000379); // TextOffset // TODO: dependent on the document + rStrm.WriteUInt32(offset); // TextOffset } // section 2.3.4.2.3.2.6 @@ -597,23 +600,26 @@ void writeMODULECOOKIE(SvStream& rStrm) } // section 2.3.4.2.3.2.8 -void writeMODULETYPE(SvStream& rStrm) +void writeMODULETYPE(SvStream& rStrm, const OUString type) { - rStrm.WriteUInt16(0x0021); // id for procedural module + if(type == "procedure") + rStrm.WriteUInt16(0x0021); // id for a procedural module + else + rStrm.WriteUInt16(0x0022); // id for document, class or design module rStrm.WriteUInt32(0x00000000); // reserved } // section 2.3.4.2.3.2 -void writePROJECTMODULE(SvStream& rStrm) +void writePROJECTMODULE(SvStream& rStrm, const OUString name, const OUString streamName, sal_uInt32 offset, const OUString type) { - writeMODULENAME(rStrm); - writeMODULENAMEUNICODE(rStrm); - writeMODULESTREAMNAME(rStrm); + writeMODULENAME(rStrm, name); + writeMODULENAMEUNICODE(rStrm, name); + writeMODULESTREAMNAME(rStrm, streamName); writeMODULEDOCSTRING(rStrm); - writeMODULEOFFSET(rStrm); + writeMODULEOFFSET(rStrm, offset); writeMODULEHELPCONTEXT(rStrm); writeMODULECOOKIE(rStrm); - writeMODULETYPE(rStrm); + writeMODULETYPE(rStrm, type); rStrm.WriteUInt16(0x002B); // terminator rStrm.WriteUInt32(0x00000000); // reserved } @@ -621,12 +627,13 @@ void writePROJECTMODULE(SvStream& rStrm) // section 2.3.4.2.3 void writePROJECTMODULES(SvStream& rStrm) { + // 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 rStrm.WriteUInt16(count); // Count writePROJECTCOOKIE(rStrm); - writePROJECTMODULE(rStrm); + writePROJECTMODULE(rStrm, "Module1", "Module1", 0x00000379, "procedure"); } // section 2.3.4.2 commit 1ee216c754e4f622f2c6385837e2d4d4f30dcbfc Author: Rosemary <[email protected]> Date: Fri Aug 14 10:20:39 2015 +0530 termination Change-Id: Ie442e2152a6afc739e36e585ae2fa12ad7b82116 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 4fb2a82..578da98 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -614,6 +614,8 @@ void writePROJECTMODULE(SvStream& rStrm) writeMODULEHELPCONTEXT(rStrm); writeMODULECOOKIE(rStrm); writeMODULETYPE(rStrm); + rStrm.WriteUInt16(0x002B); // terminator + rStrm.WriteUInt32(0x00000000); // reserved } // section 2.3.4.2.3 commit 646cb96b5c780b154a4005ade6d91c190e84cc4e Author: Rosemary <[email protected]> Date: Fri Aug 14 10:12:37 2015 +0530 module type record Change-Id: Ie015931985a66f7fb2a47bc94d8215f64a667438 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 6f6c207..4fb2a82 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -596,6 +596,13 @@ void writeMODULECOOKIE(SvStream& rStrm) rStrm.WriteUInt16(0xFFFF); // HelpContext } +// section 2.3.4.2.3.2.8 +void writeMODULETYPE(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0021); // id for procedural module + rStrm.WriteUInt32(0x00000000); // reserved +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { @@ -606,6 +613,7 @@ void writePROJECTMODULE(SvStream& rStrm) writeMODULEOFFSET(rStrm); writeMODULEHELPCONTEXT(rStrm); writeMODULECOOKIE(rStrm); + writeMODULETYPE(rStrm); } // section 2.3.4.2.3 commit a7887aaaa79ad6666eabfe290518659b3a8588b1 Author: Rosemary <[email protected]> Date: Fri Aug 14 10:06:25 2015 +0530 module cookie record Change-Id: Idd2f52e6f48c9fe6e1fbaecdfc34535205f28c59 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index f9eff70..6f6c207 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -588,6 +588,14 @@ void writeMODULEHELPCONTEXT(SvStream& rStrm) rStrm.WriteUInt32(0x00000000); // HelpContext } +// section 2.3.4.2.3.2.7 +void writeMODULECOOKIE(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x002C); // id + rStrm.WriteUInt32(0x00000002); // sizeOfHelpContext + rStrm.WriteUInt16(0xFFFF); // HelpContext +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { @@ -597,6 +605,7 @@ void writePROJECTMODULE(SvStream& rStrm) writeMODULEDOCSTRING(rStrm); writeMODULEOFFSET(rStrm); writeMODULEHELPCONTEXT(rStrm); + writeMODULECOOKIE(rStrm); } // section 2.3.4.2.3 commit f98a9b115592c2077ba7d1049833a45ed6774207 Author: Rosemary <[email protected]> Date: Fri Aug 14 10:01:07 2015 +0530 module help context record Change-Id: I671c1c436864b935dfec97fbde9441d2c5d3ae3c diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index f56c56c..f9eff70 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -580,6 +580,14 @@ void writeMODULEOFFSET(SvStream& rStrm) rStrm.WriteUInt32(0x00000379); // TextOffset // TODO: dependent on the document } +// section 2.3.4.2.3.2.6 +void writeMODULEHELPCONTEXT(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x001E); // id + rStrm.WriteUInt32(0x00000004); // sizeOfHelpContext + rStrm.WriteUInt32(0x00000000); // HelpContext +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { @@ -588,6 +596,7 @@ void writePROJECTMODULE(SvStream& rStrm) writeMODULESTREAMNAME(rStrm); writeMODULEDOCSTRING(rStrm); writeMODULEOFFSET(rStrm); + writeMODULEHELPCONTEXT(rStrm); } // section 2.3.4.2.3 commit 8f5b020b6365503f05938e9dc83a866c053f3d73 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 13:04:18 2015 +0200 more todo Change-Id: Ib28b7493227c24c415649a9e55f274ecf1411c77 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 93f5297..f56c56c 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -577,7 +577,7 @@ void writeMODULEOFFSET(SvStream& rStrm) { rStrm.WriteUInt16(0x0031); // id rStrm.WriteUInt32(0x00000004); // sizeOfTextOffset - rStrm.WriteUInt32(0x00000379); // TextOffset + rStrm.WriteUInt32(0x00000379); // TextOffset // TODO: dependent on the document } // section 2.3.4.2.3.2 commit f6a3ef22d73099d30216efb05ebf5cf20cf99202 Author: Rosemary <[email protected]> Date: Fri Aug 14 09:54:15 2015 +0530 module offset record Change-Id: I7b2c25e518248cbe28762c1392b1372ff8e61bff diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index f86cb87..93f5297 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -572,6 +572,14 @@ void writeMODULEDOCSTRING(SvStream& rStrm) rStrm.WriteUInt32(0x00000000); // sizeOfDocStringUnicode } +// section 2.3.4.2.3.2.5 +void writeMODULEOFFSET(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0031); // id + rStrm.WriteUInt32(0x00000004); // sizeOfTextOffset + rStrm.WriteUInt32(0x00000379); // TextOffset +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { @@ -579,6 +587,7 @@ void writePROJECTMODULE(SvStream& rStrm) writeMODULENAMEUNICODE(rStrm); writeMODULESTREAMNAME(rStrm); writeMODULEDOCSTRING(rStrm); + writeMODULEOFFSET(rStrm); } // section 2.3.4.2.3 commit be4fd6ca2cb0067798e3e92341708f1a79f893aa Author: Rosemary <[email protected]> Date: Fri Aug 14 09:45:30 2015 +0530 module doc string record Change-Id: Ia67dcb4f68379eb923787792e15bc9aaeac308e3 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 3138ce2..f86cb87 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -563,12 +563,22 @@ void writeMODULESTREAMNAME(SvStream& rStrm) exportUTF16String(rStrm, "Module1"); // ModuleStreamName // TODO: dependent on the document } +// section 2.3.4.2.3.2.4 +void writeMODULEDOCSTRING(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x001C); // id + rStrm.WriteUInt32(0x00000000); // sizeOfDocString + rStrm.WriteUInt16(0x0048); // reserved + rStrm.WriteUInt32(0x00000000); // sizeOfDocStringUnicode +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { writeMODULENAME(rStrm); writeMODULENAMEUNICODE(rStrm); writeMODULESTREAMNAME(rStrm); + writeMODULEDOCSTRING(rStrm); } // section 2.3.4.2.3 commit 673e65ca8c723c0941b607daa6c4e117f402cd52 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 13:01:15 2015 +0200 add todo Change-Id: I8a97f7cf2ee576bfe00ec127a5cf5af90796082b diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 930b590..3138ce2 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -557,10 +557,10 @@ void writeMODULESTREAMNAME(SvStream& rStrm) { rStrm.WriteUInt16(0x001A); // id rStrm.WriteUInt32(7); // sizeOfStreamName - exportString(rStrm, "Module1"); // StreamName + exportString(rStrm, "Module1"); // StreamName // TODO: dependent on the document rStrm.WriteUInt16(0x0032); // reserved rStrm.WriteUInt32(14); // sizeOfModuleStreamName - exportUTF16String(rStrm, "Module1"); // ModuleStreamName + exportUTF16String(rStrm, "Module1"); // ModuleStreamName // TODO: dependent on the document } // section 2.3.4.2.3.2 commit 9023ae977b2df43f5c8d69b0e833502baf219bf3 Author: Rosemary <[email protected]> Date: Fri Aug 14 09:37:28 2015 +0530 module stream name record Change-Id: I1c12d5427c4808b496fb0e087c100dc93a5695c1 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index cc3b71d..930b590 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -552,11 +552,23 @@ void writeMODULENAMEUNICODE(SvStream& rStrm) exportUTF16String(rStrm, "Module1"); // ModuleName // TODO: dependent on the document } +// section 2.3.4.2.3.2.3 +void writeMODULESTREAMNAME(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x001A); // id + rStrm.WriteUInt32(7); // sizeOfStreamName + exportString(rStrm, "Module1"); // StreamName + rStrm.WriteUInt16(0x0032); // reserved + rStrm.WriteUInt32(14); // sizeOfModuleStreamName + exportUTF16String(rStrm, "Module1"); // ModuleStreamName +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { writeMODULENAME(rStrm); writeMODULENAMEUNICODE(rStrm); + writeMODULESTREAMNAME(rStrm); } // section 2.3.4.2.3 commit fd9caa16e51d9b8b8f63a337d1d48e32219011a1 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 12:58:49 2015 +0200 add more todo Change-Id: Ie6c6fd5ecfad5f7dd21e72104ab19f41fd051ec1 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 9b68e90..cc3b71d 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -541,7 +541,7 @@ void writeMODULENAME(SvStream& rStrm) { rStrm.WriteUInt16(0x0019); // id rStrm.WriteUInt32(7); // sizeOfModuleName - exportString(rStrm, "Module1"); // ModuleName + exportString(rStrm, "Module1"); // ModuleName // TODO: dependent on the document } // section 2.3.4.2.3.2.2 @@ -549,7 +549,7 @@ void writeMODULENAMEUNICODE(SvStream& rStrm) { rStrm.WriteUInt16(0x0047); // id rStrm.WriteUInt32(14); // sizeOfModuleName - exportUTF16String(rStrm, "Module1"); // ModuleName + exportUTF16String(rStrm, "Module1"); // ModuleName // TODO: dependent on the document } // section 2.3.4.2.3.2 commit cdaa7abf5f4a76922e31093ff4b261028a922033 Author: Rosemary <[email protected]> Date: Fri Aug 14 09:16:39 2015 +0530 module name unicode record Change-Id: I7da5defad290fe7884ea9f074a558645283d9146 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 6029c15..9b68e90 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -544,10 +544,19 @@ void writeMODULENAME(SvStream& rStrm) exportString(rStrm, "Module1"); // ModuleName } +// section 2.3.4.2.3.2.2 +void writeMODULENAMEUNICODE(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0047); // id + rStrm.WriteUInt32(14); // sizeOfModuleName + exportUTF16String(rStrm, "Module1"); // ModuleName +} + // section 2.3.4.2.3.2 void writePROJECTMODULE(SvStream& rStrm) { writeMODULENAME(rStrm); + writeMODULENAMEUNICODE(rStrm); } // section 2.3.4.2.3 commit 31a36ebed2de5c1304d2dbb17c9c977bf4c194db Author: Rosemary <[email protected]> Date: Fri Aug 14 09:11:35 2015 +0530 module name record Conflicts: oox/source/ole/vbaexport.cxx Change-Id: I2b468bc0ae28ed0dbc7f2a188b04ee9728f2b1e9 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 8e3c6c2..6029c15 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -536,13 +536,29 @@ void writePROJECTCOOKIE(SvStream& rStrm) rStrm.WriteUInt16(0xFFFF); // cookie } +// section 2.3.4.2.3.2.1 +void writeMODULENAME(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0019); // id + rStrm.WriteUInt32(7); // sizeOfModuleName + exportString(rStrm, "Module1"); // ModuleName +} + +// section 2.3.4.2.3.2 +void writePROJECTMODULE(SvStream& rStrm) +{ + writeMODULENAME(rStrm); +} + // section 2.3.4.2.3 void writePROJECTMODULES(SvStream& rStrm) { rStrm.WriteUInt16(0x000F); // id rStrm.WriteUInt32(0x00000002); // size of Count - rStrm.WriteUInt16(5); // Count // TODO: this is dependent on the document + sal_Int16 count = 5; // Number of modules // TODO: this is dependent on the document + rStrm.WriteUInt16(count); // Count writePROJECTCOOKIE(rStrm); + writePROJECTMODULE(rStrm); } // section 2.3.4.2 commit 20094a298fdcbea67c55cd06af3deaf9fa4b32f5 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 12:09:53 2015 +0200 add more todo Change-Id: I04faf290770d06c7ec8eb54a1ae777271b105ad5 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 2746ddf..8e3c6c2 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -541,7 +541,7 @@ void writePROJECTMODULES(SvStream& rStrm) { rStrm.WriteUInt16(0x000F); // id rStrm.WriteUInt32(0x00000002); // size of Count - rStrm.WriteUInt16(5); // Count + rStrm.WriteUInt16(5); // Count // TODO: this is dependent on the document writePROJECTCOOKIE(rStrm); } commit dca2553b4b0269684ad67a1cebd63f17bb2cc5b0 Author: Rosemary <[email protected]> Date: Fri Aug 14 08:56:37 2015 +0530 project modules record - project cookie record Change-Id: I20cc81818560bcfa2cefe9c050836e9c856f44ec diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 246a234..2746ddf 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -528,11 +528,29 @@ void writePROJECTREFERENCES(SvStream& rStrm) writeREFERENCE(rStrm, "Office", "*\\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.0#0#C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL#Microsoft Office 14.0 Object Library"); } +// section 2.3.4.2.3.1 +void writePROJECTCOOKIE(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0013); // id + rStrm.WriteUInt32(0x00000002); // size + rStrm.WriteUInt16(0xFFFF); // cookie +} + +// section 2.3.4.2.3 +void writePROJECTMODULES(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x000F); // id + rStrm.WriteUInt32(0x00000002); // size of Count + rStrm.WriteUInt16(5); // Count + writePROJECTCOOKIE(rStrm); +} + // section 2.3.4.2 void exportDirStream(SvStream& rStrm) { writePROJECTINFORMATION(rStrm); writePROJECTREFERENCES(rStrm); + writePROJECTMODULES(rStrm); } } commit 316855b90897ea214e99fffdd077b24a81c78e1b Author: Rosemary <[email protected]> Date: Fri Aug 14 08:37:43 2015 +0530 next reference record Conflicts: oox/source/ole/vbaexport.cxx Change-Id: Ie7efdc2cabac43ea06ca9ba84b634fc2cb1ddd54 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 85c4352..246a234 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -488,38 +488,44 @@ void writePROJECTINFORMATION(SvStream& rStrm) } // section 2.3.4.2.2.2 -void writeREFERENCENAME(SvStream& rStrm) +void writeREFERENCENAME(SvStream& rStrm, const OUString name) { rStrm.WriteUInt16(0x0016); // id - rStrm.WriteUInt32(6); // sizeOfName - exportString(rStrm, "stdole"); // name // TODO: find out where these values are coming from + sal_Int32 size = name.getLength(); + rStrm.WriteUInt32(size); // sizeOfName + exportString(rStrm, name); // name rStrm.WriteUInt16(0x003E); // reserved - rStrm.WriteUInt32(12); // sizeOfNameUnicode - exportUTF16String(rStrm, "stdole"); // nameUnicode // TODO find out where these values are coming from + sal_Int32 unicodesize = size * 2; + rStrm.WriteUInt32(unicodesize); // sizeOfNameUnicode + exportUTF16String(rStrm, name); // nameUnicode } // section 2.3.4.2.2.5 -void writeREFERENCEREGISTERED(SvStream& rStrm) +void writeREFERENCEREGISTERED(SvStream& rStrm, const OUString libid) { rStrm.WriteUInt16(0x000D); // id - rStrm.WriteUInt32(104); // size of sizeOfLibid, Libid, reserved 1 and reserved 2 - rStrm.WriteUInt32(94); // sizeOfLibid - exportString(rStrm, "*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\SysWOW64\\stdole2.tlb#OLE Automation"); + sal_Int32 sizeOfLibid = libid.getLength(); + sal_Int32 size = sizeOfLibid + 10; // size of Libid, sizeOfLibid(4 bytes), reserved 1(4 bytes) and reserved 2(2 bytes) + rStrm.WriteUInt32(size); // size + rStrm.WriteUInt32(sizeOfLibid); // sizeOfLibid + exportString(rStrm, libid); // Libid rStrm.WriteUInt32(0x00000000); // reserved 1 rStrm.WriteUInt16(0x0000); // reserved 2 } // section 2.3.4.2.2.1 -void writeREFERENCE(SvStream& rStrm) +void writeREFERENCE(SvStream& rStrm, const OUString name, const OUString libid) { - writeREFERENCENAME(rStrm); - writeREFERENCEREGISTERED(rStrm); + writeREFERENCENAME(rStrm, name); + writeREFERENCEREGISTERED(rStrm, libid); } // section 2.3.4.2.2 void writePROJECTREFERENCES(SvStream& rStrm) { - writeREFERENCE(rStrm); + // TODO: find out where these references are coming from + writeREFERENCE(rStrm, "stdole", "*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\SysWOW64\\stdole2.tlb#OLE Automation"); + writeREFERENCE(rStrm, "Office", "*\\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.0#0#C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL#Microsoft Office 14.0 Object Library"); } // section 2.3.4.2 commit 102189505d8b3fc69e4e8eac2a4482f73046fd19 Author: Rosemary <[email protected]> Date: Fri Aug 14 06:57:13 2015 +0530 reference registered record Change-Id: I72a038f0e2ef4e7cd430de8e8c835a6147113e29 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 761254501..85c4352 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -498,10 +498,22 @@ void writeREFERENCENAME(SvStream& rStrm) exportUTF16String(rStrm, "stdole"); // nameUnicode // TODO find out where these values are coming from } +// section 2.3.4.2.2.5 +void writeREFERENCEREGISTERED(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x000D); // id + rStrm.WriteUInt32(104); // size of sizeOfLibid, Libid, reserved 1 and reserved 2 + rStrm.WriteUInt32(94); // sizeOfLibid + exportString(rStrm, "*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\SysWOW64\\stdole2.tlb#OLE Automation"); + rStrm.WriteUInt32(0x00000000); // reserved 1 + rStrm.WriteUInt16(0x0000); // reserved 2 +} + // section 2.3.4.2.2.1 void writeREFERENCE(SvStream& rStrm) { writeREFERENCENAME(rStrm); + writeREFERENCEREGISTERED(rStrm); } // section 2.3.4.2.2 commit 064c42135cdb0f939b3611335abb126f46073db3 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 11:58:17 2015 +0200 add two todo for later Change-Id: I8781f3e86584d61613245a5654fe7c6afab9a5da diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index f762e86..761254501 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -492,10 +492,10 @@ void writeREFERENCENAME(SvStream& rStrm) { rStrm.WriteUInt16(0x0016); // id rStrm.WriteUInt32(6); // sizeOfName - exportString(rStrm, "stdole"); // name + exportString(rStrm, "stdole"); // name // TODO: find out where these values are coming from rStrm.WriteUInt16(0x003E); // reserved rStrm.WriteUInt32(12); // sizeOfNameUnicode - exportUTF16String(rStrm, "stdole"); // nameUnicode + exportUTF16String(rStrm, "stdole"); // nameUnicode // TODO find out where these values are coming from } // section 2.3.4.2.2.1 commit 57e1a8e8fa08c1fdae37e0f1a6597bac22ac3de9 Author: Rosemary <[email protected]> Date: Fri Aug 14 01:18:51 2015 +0530 reference name 1 Change-Id: I1aa7233126df0a3dc6bb849646aab35f17e72a2e diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 601be68..f762e86 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -378,47 +378,45 @@ VbaExport::VbaExport(css::uno::Reference<css::frame::XModel> xModel): namespace { -//section 2.3.4.2.1.11 -void writePROJECTCONSTANTS(SvStream& rStrm) +// section 2.3.4.2.1.1 +void writePROJECTSYSKIND(SvStream& rStrm) { - rStrm.WriteUInt16(0x000C); // id - rStrm.WriteUInt32(0x00000000); // sizeOfConstants - rStrm.WriteUInt16(0x003C); // Reserved - rStrm.WriteUInt32(0x00000000); // sizeOfConstantsUnicode + rStrm.WriteUInt16(0x0001); // id + rStrm.WriteUInt32(0x00000004); // size + rStrm.WriteUInt32(0x00000001); // SysKind, hard coded to 32-bin windows for now } -//section 2.3.4.2.1.10 -void writePROJECTVERSION(SvStream& rStrm) +// section 2.3.4.2.1.2 +void writePROJECTLCID(SvStream& rStrm) { - rStrm.WriteUInt16(0x0009); // id - rStrm.WriteUInt32(0x00000004); // Reserved - rStrm.WriteUInt32(1467127224); // VersionMajor // TODO: where is this magic number comming from - rStrm.WriteUInt16(5); // VersionMinor // TODO: where is this magic number coming from + rStrm.WriteUInt16(0x0002); // id + rStrm.WriteUInt32(0x00000004); // size + rStrm.WriteUInt32(0x00000409); // Lcid } -//section 2.3.4.2.1.9 -void writePROJECTLIBFLAGS(SvStream& rStrm) +// section 2.3.4.2.1.3 +void writePROJECTLCIDINVOKE(SvStream& rStrm) { - rStrm.WriteUInt16(0x0008); // id + rStrm.WriteUInt16(0x0014); // id rStrm.WriteUInt32(0x00000004); // size - rStrm.WriteUInt32(0x00000000); // ProjectLibFlags + rStrm.WriteUInt32(0x00000409); // LcidInvoke } -//section 2.3.4.2.1.8 -void writePROJECTHELPCONTEXT(SvStream& rStrm) +// section 2.3.4.2.1.4 +void writePROJECTCODEPAGE(SvStream& rStrm) { - rStrm.WriteUInt16(0x0007); // id - rStrm.WriteUInt32(0x00000004); // size - rStrm.WriteUInt32(0x00000000); // HelpContext + rStrm.WriteUInt16(0x0003); // id + rStrm.WriteUInt32(0x00000002); // size + rStrm.WriteUInt16(CODEPAGE_MS); // CodePage } -//section 2.3.4.2.1.7 -void writePROJECTHELPFILEPATH(SvStream& rStrm) +//section 2.3.4.2.1.5 +void writePROJECTNAME(SvStream& rStrm) { - rStrm.WriteUInt16(0x0006); // id - rStrm.WriteUInt32(0x00000000); // sizeOfHelpFile1 - rStrm.WriteUInt16(0x003D); // Reserved - rStrm.WriteUInt32(0x00000000); // sizeOfHelpFile2 + rStrm.WriteUInt16(0x0004); // id + sal_uInt32 sizeOfProjectName = 0x0000000a; // for project name "VBAProject" + rStrm.WriteUInt32(sizeOfProjectName); // sizeOfProjectName + exportString(rStrm, "VBAProject"); // ProjectName } //section 2.3.4.2.1.6 @@ -430,46 +428,47 @@ void writePROJECTDOCSTRING(SvStream& rStrm) rStrm.WriteUInt32(0x00000000); // sizeOfDocStringUnicode, MUST be even } -//section 2.3.4.2.1.5 -void writePROJECTNAME(SvStream& rStrm) +//section 2.3.4.2.1.7 +void writePROJECTHELPFILEPATH(SvStream& rStrm) { - rStrm.WriteUInt16(0x0004); // id - sal_uInt32 sizeOfProjectName = 0x0000000a; // for project name "VBAProject" - rStrm.WriteUInt32(sizeOfProjectName); // sizeOfProjectName - //characters of "VBAProject" in MBCS character encodings - exportString(rStrm, "VBAProject"); + rStrm.WriteUInt16(0x0006); // id + rStrm.WriteUInt32(0x00000000); // sizeOfHelpFile1 + rStrm.WriteUInt16(0x003D); // Reserved + rStrm.WriteUInt32(0x00000000); // sizeOfHelpFile2 } -// section 2.3.4.2.1.4 -void writePROJECTCODEPAGE(SvStream& rStrm) +//section 2.3.4.2.1.8 +void writePROJECTHELPCONTEXT(SvStream& rStrm) { - rStrm.WriteUInt16(0x0003); // id - rStrm.WriteUInt32(0x00000002); // size - rStrm.WriteUInt16(CODEPAGE_MS); // CodePage + rStrm.WriteUInt16(0x0007); // id + rStrm.WriteUInt32(0x00000004); // size + rStrm.WriteUInt32(0x00000000); // HelpContext } -// section 2.3.4.2.1.3 -void writePROJECTLCIDINVOKE(SvStream& rStrm) +//section 2.3.4.2.1.9 +void writePROJECTLIBFLAGS(SvStream& rStrm) { - rStrm.WriteUInt16(0x0014); // id + rStrm.WriteUInt16(0x0008); // id rStrm.WriteUInt32(0x00000004); // size - rStrm.WriteUInt32(0x00000409); // LcidInvoke + rStrm.WriteUInt32(0x00000000); // ProjectLibFlags } -// section 2.3.4.2.1.2 -void writePROJECTLCID(SvStream& rStrm) +//section 2.3.4.2.1.10 +void writePROJECTVERSION(SvStream& rStrm) { - rStrm.WriteUInt16(0x0002); // id - rStrm.WriteUInt32(0x00000004); // size - rStrm.WriteUInt32(0x00000409); // Lcid + rStrm.WriteUInt16(0x0009); // id + rStrm.WriteUInt32(0x00000004); // Reserved + rStrm.WriteUInt32(1467127224); // VersionMajor // TODO: where is this magic number comming from + rStrm.WriteUInt16(5); // VersionMinor // TODO: where is this magic number coming from } -// section 2.3.4.2.1.1 -void writePROJECTSYSKIND(SvStream& rStrm) +//section 2.3.4.2.1.11 +void writePROJECTCONSTANTS(SvStream& rStrm) { - rStrm.WriteUInt16(0x0001); // id - rStrm.WriteUInt32(0x00000004); // size - rStrm.WriteUInt32(0x00000001); // SysKind, hard coded to 32-bin windows for now + rStrm.WriteUInt16(0x000C); // id + rStrm.WriteUInt32(0x00000000); // sizeOfConstants + rStrm.WriteUInt16(0x003C); // Reserved + rStrm.WriteUInt32(0x00000000); // sizeOfConstantsUnicode } // section 2.3.4.2.1 @@ -488,10 +487,34 @@ void writePROJECTINFORMATION(SvStream& rStrm) writePROJECTCONSTANTS(rStrm); } +// section 2.3.4.2.2.2 +void writeREFERENCENAME(SvStream& rStrm) +{ + rStrm.WriteUInt16(0x0016); // id + rStrm.WriteUInt32(6); // sizeOfName + exportString(rStrm, "stdole"); // name + rStrm.WriteUInt16(0x003E); // reserved + rStrm.WriteUInt32(12); // sizeOfNameUnicode + exportUTF16String(rStrm, "stdole"); // nameUnicode +} + +// section 2.3.4.2.2.1 +void writeREFERENCE(SvStream& rStrm) +{ + writeREFERENCENAME(rStrm); +} + +// section 2.3.4.2.2 +void writePROJECTREFERENCES(SvStream& rStrm) +{ + writeREFERENCE(rStrm); +} + // section 2.3.4.2 void exportDirStream(SvStream& rStrm) { writePROJECTINFORMATION(rStrm); + writePROJECTREFERENCES(rStrm); } } commit 9f11d60e14e964d71be8699cee3557492638b101 Author: Markus Mohrhard <[email protected]> Date: Fri Aug 14 11:41:35 2015 +0200 implement VBA Compression algorithm Change-Id: I0c60244f27d27cf0c97199ff5bf392d157164aa5 diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx index 6cdf5a1..601be68 100644 --- a/oox/source/ole/vbaexport.cxx +++ b/oox/source/ole/vbaexport.cxx @@ -46,6 +46,328 @@ void exportUTF16String(SvStream& rStrm, const OUString& rString) } } +class VBACompressionChunk +{ +public: + + VBACompressionChunk(SvStream& rCompressedStream, const sal_uInt8* pData, sal_Size nChunkSize); + + void write(); + +private: + SvStream& mrCompressedStream; + const sal_uInt8* mpUncompressedData; + sal_uInt8* mpCompressedChunkStream; + + // same as DecompressedChunkEnd in the spec + sal_Size mnChunkSize; + + // CompressedCurrent according to the spec + sal_uInt64 mnCompressedCurrent; + + // CompressedEnd according to the spec + sal_uInt64 mnCompressedEnd; + + // DecompressedCurrent according to the spec + sal_uInt64 mnDecompressedCurrent; + + // DecompressedEnd according to the spec + sal_uInt64 mnDecompressedEnd; + + // Start of the current decompressed chunk + sal_uInt64 mnChunkStart; + + void PackCompressedChunkSize(size_t nSize, sal_uInt16& rHeader); + + void PackCompressedChunkFlag(bool bCompressed, sal_uInt16& rHeader); + + void PackCompressedChunkSignature(sal_uInt16& rHeader); + + void compressTokenSequence(); + + void compressToken(size_t index, sal_uInt8& nFlagByte); + + void SetFlagBit(size_t index, bool bVal, sal_uInt8& rFlag); + + sal_uInt16 CopyToken(size_t nLength, size_t nOffset); + + void match(size_t& rLength, size_t& rOffset); + + void CopyTokenHelp(sal_uInt16& rLengthMask, sal_uInt16& rOffsetMask, + sal_uInt16& rBitCount, sal_uInt16& rMaximumLength); + + void writeRawChunk(); +}; + +VBACompressionChunk::VBACompressionChunk(SvStream& rCompressedStream, const sal_uInt8* pData, sal_Size nChunkSize): + mrCompressedStream(rCompressedStream), + mpUncompressedData(pData), + mnChunkSize(nChunkSize) +{ +} + +// section 2.4.1.3.7 +void VBACompressionChunk::write() +{ + mnChunkStart = mrCompressedStream.Tell(); + + // we need to fill these two bytes later + mrCompressedStream.WriteUInt16(0x0); + + mnDecompressedCurrent = 0; + mnCompressedCurrent = 2; + mnCompressedEnd = 4098; + mnDecompressedEnd = std::min<sal_uInt64>(4096, mnChunkSize); + + // if that stream becomes larger than 4096 bytes then + // we use the uncompressed stream + sal_uInt8 pCompressedChunkStream[4098]; + mpCompressedChunkStream = pCompressedChunkStream; + + while (mnDecompressedCurrent < mnDecompressedEnd + && mnCompressedCurrent < mnCompressedEnd) + { + // compress token sequence + compressTokenSequence(); + } + + bool bCompressedFlag = true; + if (mnDecompressedCurrent < mnDecompressedEnd) + { + writeRawChunk(); + bCompressedFlag = false; + } + else + { + // copy the compressed stream to our output stream + mrCompressedStream.Write(pCompressedChunkStream, mnCompressedCurrent); + } + + // handle header bytes + size_t nSize = mnCompressedCurrent; + sal_uInt16 nHeader = 0; + PackCompressedChunkSize(nSize, nHeader); + PackCompressedChunkFlag(bCompressedFlag, nHeader); + PackCompressedChunkSignature(nHeader); + + // overwrite the two bytes + sal_uInt64 nEnd = mrCompressedStream.Tell(); + mrCompressedStream.Seek(mnChunkStart); + mrCompressedStream.WriteUInt16(nHeader); + mrCompressedStream.Seek(nEnd); +} + +// section 2.4.1.3.13 +void VBACompressionChunk::PackCompressedChunkSize(size_t nSize, sal_uInt16& rHeader) +{ + sal_uInt16 nTemp1 = rHeader & 0xF000; + sal_uInt16 nTemp2 = nSize - 3; + rHeader = nTemp1 | nTemp2; +} + +// section 2.4.1.3.16 +void VBACompressionChunk::PackCompressedChunkFlag(bool bCompressed, sal_uInt16& rHeader) +{ + sal_uInt16 nTemp1 = rHeader & 0x7FFF; + sal_uInt16 nTemp2 = ((sal_uInt16)bCompressed) << 15; + rHeader = nTemp1 | nTemp2; +} + +// section 2.4.1.3.14 +void VBACompressionChunk::PackCompressedChunkSignature(sal_uInt16& rHeader) +{ + sal_Int32 nTemp = rHeader & 0x8FFFF; + rHeader = nTemp | 0x3000; +} + +// section 2.4.1.3.8 +void VBACompressionChunk::compressTokenSequence() +{ + sal_uInt64 nFlagByteIndex = mnCompressedCurrent; + sal_uInt8 nFlagByte = 0; + ++mnCompressedCurrent; + for (size_t index = 0; index <= 7; ++index) + { + if (mnDecompressedCurrent < mnDecompressedEnd + && mnCompressedCurrent < mnCompressedEnd) + { + compressToken(index, nFlagByte); + } + } + mpCompressedChunkStream[nFlagByteIndex] = nFlagByte; +} + +void setUInt16(sal_uInt8* pBuffer, size_t nPos, sal_uInt16 nVal) +{ + pBuffer[nPos] = nVal & 0xFFFF; + pBuffer[nPos+1] = (nVal & 0xFFFF0000) >> 8; +} + +// section 2.4.1.3.9 +void VBACompressionChunk::compressToken(size_t index, sal_uInt8& nFlagByte) +{ + size_t nLength = 0; + size_t nOffset = 0; + match(nLength, nOffset); + if (nOffset != 0) + { + if (mnCompressedCurrent + 1 < mnCompressedEnd) + { + sal_uInt16 nToken = CopyToken(nLength, nOffset); + setUInt16(mpCompressedChunkStream, mnCompressedCurrent, nToken); + SetFlagBit(index, 1, nFlagByte); + mnCompressedCurrent += 2; + mnDecompressedCurrent += nLength; + } + else + { + mnCompressedCurrent = mnCompressedEnd; + } + } + else + { + if (mnCompressedCurrent + 1 < mnCompressedEnd) + { + mpCompressedChunkStream[mnCompressedCurrent] = mpUncompressedData[mnDecompressedCurrent]; + ++mnCompressedCurrent; + ++mnDecompressedCurrent; + } + else + { + mnCompressedCurrent = mnCompressedEnd; + } + } +} + +// section 2.4.1.3.18 +void VBACompressionChunk::SetFlagBit(size_t index, bool bVal, sal_uInt8& rFlag) +{ + size_t nTemp1 = ((int)bVal) << index; + sal_uInt8 nTemp2 = rFlag & (~nTemp1); + rFlag = nTemp2 | nTemp1; +} + +// section 2.4.1.3.19.3 +sal_uInt16 VBACompressionChunk::CopyToken(size_t nLength, size_t nOffset) +{ + sal_uInt16 nLengthMask = 0; + sal_uInt16 nOffsetMask = 0; + sal_uInt16 nBitCount = 0; + sal_uInt16 nMaxLength; + CopyTokenHelp(nLengthMask, nOffsetMask, nBitCount, nMaxLength); + sal_uInt16 nTemp1 = nOffset -1; + sal_uInt16 nTemp2 = 16 - nBitCount; + sal_uInt16 nTemp3 = nLength - 3; + sal_uInt16 nToken = (nTemp1 << nTemp2) | nTemp3; + return nToken; +} + +// section 2.4.1.3.19.4 +void VBACompressionChunk::match(size_t& rLength, size_t& rOffset) +{ + size_t nBestLen = 0; + sal_Int32 nCandidate = mnDecompressedCurrent - 1; + sal_Int32 nBestCandidate = nCandidate; + while (nCandidate >= 0) + { + sal_Int32 nC = nCandidate; + sal_Int32 nD = mnDecompressedCurrent; + size_t nLen = 0; + while (nD < static_cast<sal_Int32>(mnChunkSize) // TODO: check if this needs to be including a minus -1 + && mpUncompressedData[nC] == mpUncompressedData[nD]) + { + ++nLen; + ++nC; + ++nD; + } + if (nLen > nBestLen) + { + nBestLen = nLen; + nBestCandidate = nCandidate; + } + --nCandidate; + } + + if (nBestLen >= 3) + { + sal_uInt16 nMaximumLength = 0; + sal_uInt16 nLengthMask, nOffsetMask, nBitCount; + CopyTokenHelp(nLengthMask, nOffsetMask, nBitCount, nMaximumLength); + rLength = std::min<sal_uInt16>(nMaximumLength, nBestLen); + rOffset = mnDecompressedCurrent - nBestCandidate; + } + else + { + rLength = 0; + rOffset = 0; + } +} + +// section 2.4.1.3.19.1 +void VBACompressionChunk::CopyTokenHelp(sal_uInt16& rLengthMask, sal_uInt16& rOffsetMask, + sal_uInt16& rBitCount, sal_uInt16& rMaximumLength) +{ + sal_uInt16 nDifference = mnDecompressedCurrent; + sal_uInt16 nBitCount = std::ceil(std::log2(nDifference)); + rBitCount = std::max<sal_uInt16>(nBitCount, 4); + rLengthMask = 0xffff >> rBitCount; + rOffsetMask = ~rLengthMask; + rMaximumLength = rLengthMask + 3; +} + +// section 2.4.1.3.10 +void VBACompressionChunk::writeRawChunk() +{ + // we need to use up to 4096 bytes of the original stream + // and fill the rest with padding + mrCompressedStream.Write(mpUncompressedData, mnChunkSize); + sal_Size nPadding = 4096 - mnChunkSize; + for (size_t i = 0; i < nPadding; ++i) + { + mrCompressedStream.WriteUInt8(0); + } +} + +class VBACompression +{ +public: + VBACompression(SvStream& rCompressedStream, + SvMemoryStream& rUncompressedStream); + + void write(); + +private: + SvStream& mrCompressedStream; + SvMemoryStream& mrUncompressedStream; +}; + +VBACompression::VBACompression(SvStream& rCompressedStream, + SvMemoryStream& rUncompressedStream): + mrCompressedStream(rCompressedStream), + mrUncompressedStream(rUncompressedStream) +{ +} + +// section 2.4.1.3.6 +void VBACompression::write() +{ + // section 2.4.1.1.1 + mrCompressedStream.WriteUInt8(0x01); // signature byte of a compressed container + bool bStreamNotEnded = true; + const sal_uInt8* pData = (const sal_uInt8*)mrUncompressedStream.GetData(); + sal_Size nSize = mrUncompressedStream.GetEndOfData(); + sal_Size nRemainingSize = nSize; + while(bStreamNotEnded) + { + sal_Size nChunkSize = nRemainingSize > 4096 ? 4096 : nRemainingSize; + VBACompressionChunk aChunk(mrCompressedStream, &pData[nSize - nRemainingSize], nChunkSize); + + // update the uncompressed chunk start marker + nRemainingSize -= nChunkSize; + bStreamNotEnded = nRemainingSize != 0; + } +} + } VbaExport::VbaExport(css::uno::Reference<css::frame::XModel> xModel): _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
