summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2022-04-15 10:00:37 +0200
committerAndreas Heinisch <andreas.heinisch@yahoo.de>2022-04-25 22:10:42 +0200
commite4bdf75260169898f3204cae7071d91da5946e09 (patch)
tree318802663a0374455fb05b4784cc438206c97301 /oox
parent2bb3587f5e7b1ee1fcb7163419c21144258ebf00 (diff)
tdf#75263 - Export VBA-Project using detected charset on import
Change-Id: Ia1f1bb31e077dcb4293c1106ac324a25a975a656 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133064 Tested-by: Jenkins Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
Diffstat (limited to 'oox')
-rw-r--r--oox/source/ole/vbaexport.cxx229
-rw-r--r--oox/source/ole/vbaproject.cxx2
2 files changed, 135 insertions, 96 deletions
diff --git a/oox/source/ole/vbaexport.cxx b/oox/source/ole/vbaexport.cxx
index fa9640e54137..01eaff5586af 100644
--- a/oox/source/ole/vbaexport.cxx
+++ b/oox/source/ole/vbaexport.cxx
@@ -31,15 +31,8 @@
#include <sot/storage.hxx>
#include <comphelper/xmltools.hxx>
-
-#define USE_UTF8_CODEPAGE 0
-#if USE_UTF8_CODEPAGE
-#define CODEPAGE_MS 65001
-#define CODEPAGE RTL_TEXTENCODING_UTF8
-#else
-#define CODEPAGE_MS 1252
-#define CODEPAGE RTL_TEXTENCODING_MS_1252
-#endif
+#include <rtl/tencinfo.h>
+#include <osl/thread.h>
#define VBA_EXPORT_DEBUG 0
#define VBA_USE_ORIGINAL_WM_STREAM 0
@@ -54,9 +47,10 @@
namespace {
-void exportString(SvStream& rStrm, std::u16string_view rString)
+void exportString(SvStream& rStrm, std::u16string_view rString,
+ const rtl_TextEncoding eTextEncoding)
{
- OString aStringCorrectCodepage = OUStringToOString(rString, CODEPAGE);
+ OString aStringCorrectCodepage = OUStringToOString(rString, eTextEncoding);
rStrm.WriteOString(aStringCorrectCodepage);
}
@@ -370,7 +364,9 @@ void VBACompression::write()
// section 2.4.3
#if VBA_ENCRYPTION
-VBAEncryption::VBAEncryption(const sal_uInt8* pData, const sal_uInt16 length, SvStream& rEncryptedData, sal_uInt8 nProjKey)
+VBAEncryption::VBAEncryption(const sal_uInt8* pData, const sal_uInt16 length,
+ SvStream& rEncryptedData, sal_uInt8 nProjKey,
+ const rtl_TextEncoding eTextEncoding)
:mpData(pData)
,mnLength(length)
,mrEncryptedData(rEncryptedData)
@@ -381,6 +377,7 @@ VBAEncryption::VBAEncryption(const sal_uInt8* pData, const sal_uInt16 length, Sv
,mnIgnoredLength(0)
,mnSeed(0x00)
,mnVersionEnc(0)
+ ,meTextEncoding(eTextEncoding)
{
std::random_device rd;
std::mt19937 gen(rd());
@@ -390,14 +387,14 @@ VBAEncryption::VBAEncryption(const sal_uInt8* pData, const sal_uInt16 length, Sv
void VBAEncryption::writeSeed()
{
- exportString(mrEncryptedData, createHexStringFromDigit(mnSeed));
+ exportString(mrEncryptedData, createHexStringFromDigit(mnSeed), meTextEncoding);
}
void VBAEncryption::writeVersionEnc()
{
static const sal_uInt8 mnVersion = 2; // the encrypted version
mnVersionEnc = mnSeed ^ mnVersion;
- exportString(mrEncryptedData, createHexStringFromDigit(mnVersionEnc));
+ exportString(mrEncryptedData, createHexStringFromDigit(mnVersionEnc), meTextEncoding);
}
sal_uInt8 VBAEncryption::calculateProjKey(const OUString& rProjectKey)
@@ -417,7 +414,7 @@ sal_uInt8 VBAEncryption::calculateProjKey(const OUString& rProjectKey)
void VBAEncryption::writeProjKeyEnc()
{
sal_uInt8 nProjKeyEnc = mnSeed ^ mnProjKey;
- exportString(mrEncryptedData, createHexStringFromDigit(nProjKeyEnc));
+ exportString(mrEncryptedData, createHexStringFromDigit(nProjKeyEnc), meTextEncoding);
mnUnencryptedByte1 = mnProjKey;
mnEncryptedByte1 = nProjKeyEnc; // ProjKeyEnc
mnEncryptedByte2 = mnVersionEnc; // VersionEnc
@@ -430,7 +427,7 @@ void VBAEncryption::writeIgnoredEnc()
{
sal_uInt8 nTempValue = 0xBE; // Any value can be assigned here
sal_uInt8 nByteEnc = nTempValue ^ (mnEncryptedByte2 + mnUnencryptedByte1);
- exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc));
+ exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc), meTextEncoding);
mnEncryptedByte2 = mnEncryptedByte1;
mnEncryptedByte1 = nByteEnc;
mnUnencryptedByte1 = nTempValue;
@@ -444,7 +441,7 @@ void VBAEncryption::writeDataLengthEnc()
{
sal_uInt8 nByte = temp & 0xFF;
sal_uInt8 nByteEnc = nByte ^ (mnEncryptedByte2 + mnUnencryptedByte1);
- exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc));
+ exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc), meTextEncoding);
mnEncryptedByte2 = mnEncryptedByte1;
mnEncryptedByte1 = nByteEnc;
mnUnencryptedByte1 = nByte;
@@ -457,7 +454,7 @@ void VBAEncryption::writeDataEnc()
for(sal_Int16 i = 0; i < mnLength; i++)
{
sal_uInt8 nByteEnc = mpData[i] ^ (mnEncryptedByte2 + mnUnencryptedByte1);
- exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc));
+ exportString(mrEncryptedData, createHexStringFromDigit(nByteEnc), meTextEncoding);
mnEncryptedByte2 = mnEncryptedByte1;
mnEncryptedByte1 = nByteEnc;
mnUnencryptedByte1 = mpData[i];
@@ -508,20 +505,20 @@ void writePROJECTLCIDINVOKE(SvStream& rStrm)
}
// section 2.3.4.2.1.4
-void writePROJECTCODEPAGE(SvStream& rStrm)
+void writePROJECTCODEPAGE(SvStream& rStrm, const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x0003); // id
rStrm.WriteUInt32(0x00000002); // size
- rStrm.WriteUInt16(CODEPAGE_MS); // CodePage
+ rStrm.WriteUInt16(rtl_getWindowsCodePageFromTextEncoding(eTextEncoding)); // CodePage
}
//section 2.3.4.2.1.5
-void writePROJECTNAME(SvStream& rStrm, const OUString& name)
+void writePROJECTNAME(SvStream& rStrm, const OUString& name, const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x0004); // id
sal_uInt32 sizeOfProjectName = name.getLength();
rStrm.WriteUInt32(sizeOfProjectName); // sizeOfProjectName
- exportString(rStrm, name); // ProjectName
+ exportString(rStrm, name, eTextEncoding); // ProjectName
}
//section 2.3.4.2.1.6
@@ -577,13 +574,14 @@ void writePROJECTCONSTANTS(SvStream& rStrm)
}
// section 2.3.4.2.1
-void writePROJECTINFORMATION(SvStream& rStrm, const OUString& projectName)
+void writePROJECTINFORMATION(SvStream& rStrm, const OUString& projectName,
+ const rtl_TextEncoding eTextEncoding)
{
writePROJECTSYSKIND(rStrm);
writePROJECTLCID(rStrm);
writePROJECTLCIDINVOKE(rStrm);
- writePROJECTCODEPAGE(rStrm);
- writePROJECTNAME(rStrm, projectName);
+ writePROJECTCODEPAGE(rStrm, eTextEncoding);
+ writePROJECTNAME(rStrm, projectName, eTextEncoding);
writePROJECTDOCSTRING(rStrm);
writePROJECTHELPFILEPATH(rStrm);
writePROJECTHELPCONTEXT(rStrm);
@@ -593,12 +591,12 @@ void writePROJECTINFORMATION(SvStream& rStrm, const OUString& projectName)
}
// section 2.3.4.2.2.2
-void writeREFERENCENAME(SvStream& rStrm, const OUString& name)
+void writeREFERENCENAME(SvStream& rStrm, const OUString& name, const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x0016); // id
sal_Int32 size = name.getLength();
rStrm.WriteUInt32(size); // sizeOfName
- exportString(rStrm, name); // name
+ exportString(rStrm, name, eTextEncoding); // name
rStrm.WriteUInt16(0x003E); // reserved
sal_Int32 unicodesize = size * 2;
rStrm.WriteUInt32(unicodesize); // sizeOfNameUnicode
@@ -606,31 +604,33 @@ void writeREFERENCENAME(SvStream& rStrm, const OUString& name)
}
// section 2.3.4.2.2.5
-void writeREFERENCEREGISTERED(SvStream& rStrm, const OUString& libid)
+void writeREFERENCEREGISTERED(SvStream& rStrm, const OUString& libid,
+ const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x000D); // id
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
+ exportString(rStrm, libid, eTextEncoding); // Libid
rStrm.WriteUInt32(0x00000000); // reserved 1
rStrm.WriteUInt16(0x0000); // reserved 2
}
// section 2.3.4.2.2.1
-void writeREFERENCE(SvStream& rStrm, const OUString& name, const OUString& libid)
+void writeREFERENCE(SvStream& rStrm, const OUString& name, const OUString& libid,
+ const rtl_TextEncoding eTextEncoding)
{
- writeREFERENCENAME(rStrm, name);
- writeREFERENCEREGISTERED(rStrm, libid);
+ writeREFERENCENAME(rStrm, name, eTextEncoding);
+ writeREFERENCEREGISTERED(rStrm, libid, eTextEncoding);
}
// section 2.3.4.2.2
-void writePROJECTREFERENCES(SvStream& rStrm)
+void writePROJECTREFERENCES(SvStream& rStrm, const rtl_TextEncoding eTextEncoding)
{
// 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");
+ writeREFERENCE(rStrm, "stdole", "*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\SysWOW64\\stdole2.tlb#OLE Automation", eTextEncoding);
+ 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", eTextEncoding);
}
// section 2.3.4.2.3.1
@@ -642,12 +642,12 @@ void writePROJECTCOOKIE(SvStream& rStrm)
}
// section 2.3.4.2.3.2.1
-void writeMODULENAME(SvStream& rStrm, const OUString& name)
+void writeMODULENAME(SvStream& rStrm, const OUString& name, const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x0019); // id
sal_Int32 n = name.getLength(); // sizeOfModuleName
rStrm.WriteUInt32(n);
- exportString(rStrm, name); // ModuleName
+ exportString(rStrm, name, eTextEncoding); // ModuleName
}
// section 2.3.4.2.3.2.2
@@ -660,12 +660,13 @@ void writeMODULENAMEUNICODE(SvStream& rStrm, const OUString& name)
}
// section 2.3.4.2.3.2.3
-void writeMODULESTREAMNAME(SvStream& rStrm, const OUString& streamName)
+void writeMODULESTREAMNAME(SvStream& rStrm, const OUString& streamName,
+ const rtl_TextEncoding eTextEncoding)
{
rStrm.WriteUInt16(0x001A); // id
sal_Int32 n = streamName.getLength(); // sizeOfStreamName
rStrm.WriteUInt32(n);
- exportString(rStrm, streamName); // StreamName
+ exportString(rStrm, streamName, eTextEncoding); // StreamName
rStrm.WriteUInt16(0x0032); // reserved
rStrm.WriteUInt32(n * 2); // sizeOfStreamNameUnicode // TODO: better calculation for unicode string length
exportUTF16String(rStrm, streamName); // StreamNameUnicode
@@ -715,11 +716,12 @@ void writeMODULETYPE(SvStream& rStrm, const sal_uInt16 type)
}
// section 2.3.4.2.3.2
-void writePROJECTMODULE(SvStream& rStrm, const OUString& name, const sal_uInt16 type)
+void writePROJECTMODULE(SvStream& rStrm, const OUString& name, const sal_uInt16 type,
+ const rtl_TextEncoding eTextEncoding)
{
- writeMODULENAME(rStrm, name);
+ writeMODULENAME(rStrm, name, eTextEncoding);
writeMODULENAMEUNICODE(rStrm, name);
- writeMODULESTREAMNAME(rStrm, name);
+ writeMODULESTREAMNAME(rStrm, name, eTextEncoding);
writeMODULEDOCSTRING(rStrm);
writeMODULEOFFSET(rStrm);
writeMODULEHELPCONTEXT(rStrm);
@@ -730,7 +732,10 @@ void writePROJECTMODULE(SvStream& rStrm, const OUString& name, const sal_uInt16
}
// section 2.3.4.2.3
-void writePROJECTMODULES(SvStream& rStrm, const css::uno::Reference<css::container::XNameContainer>& xNameContainer, const std::vector<sal_Int32>& rLibraryMap)
+void writePROJECTMODULES(SvStream& rStrm,
+ const css::uno::Reference<css::container::XNameContainer>& xNameContainer,
+ const std::vector<sal_Int32>& rLibraryMap,
+ const rtl_TextEncoding eTextEncoding)
{
const css::uno::Sequence<OUString> aElementNames = xNameContainer->getElementNames();
sal_Int32 n = aElementNames.getLength();
@@ -748,18 +753,21 @@ void writePROJECTMODULES(SvStream& rStrm, const css::uno::Reference<css::contain
{
const OUString& rModuleName = aElementNames[rLibraryMap[i]];
css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(rModuleName);
- writePROJECTMODULE(rStrm, rModuleName, aModuleInfo.ModuleType);
+ writePROJECTMODULE(rStrm, rModuleName, aModuleInfo.ModuleType, eTextEncoding);
}
}
// section 2.3.4.2
-void exportDirStream(SvStream& rStrm, const css::uno::Reference<css::container::XNameContainer>& xNameContainer, const std::vector<sal_Int32>& rLibraryMap, const OUString& projectName)
+void exportDirStream(SvStream& rStrm,
+ const css::uno::Reference<css::container::XNameContainer>& xNameContainer,
+ const std::vector<sal_Int32>& rLibraryMap, const OUString& projectName,
+ const rtl_TextEncoding eTextEncoding)
{
SvMemoryStream aDirStream(4096, 4096);
- writePROJECTINFORMATION(aDirStream, projectName);
- writePROJECTREFERENCES(aDirStream);
- writePROJECTMODULES(aDirStream, xNameContainer, rLibraryMap);
+ writePROJECTINFORMATION(aDirStream, projectName, eTextEncoding);
+ writePROJECTREFERENCES(aDirStream, eTextEncoding);
+ writePROJECTMODULES(aDirStream, xNameContainer, rLibraryMap, eTextEncoding);
aDirStream.WriteUInt16(0x0010); // terminator
aDirStream.WriteUInt32(0x00000000); // reserved
@@ -775,24 +783,25 @@ void exportDirStream(SvStream& rStrm, const css::uno::Reference<css::container::
}
// section 2.3.4.3 Module Stream
-void exportModuleStream(SvStream& rStrm, const OUString& rSourceCode, const OUString& aElementName, css::script::ModuleInfo const & rInfo)
+void exportModuleStream(SvStream& rStrm, const OUString& rSourceCode, const OUString& aElementName,
+ css::script::ModuleInfo const& rInfo, const rtl_TextEncoding eTextEncoding)
{
SvMemoryStream aModuleStream(4096, 4096);
- exportString(aModuleStream, OUStringConcatenation("Attribute VB_Name = \"" + aElementName + "\"\r\n"));
+ exportString(aModuleStream, OUStringConcatenation("Attribute VB_Name = \"" + aElementName + "\"\r\n"), eTextEncoding);
if (rInfo.ModuleType == 4)
{
if (isWorkbook(rInfo.ModuleObject))
- exportString(aModuleStream, u"Attribute VB_Base = \"0{00020819-0000-0000-C000-000000000046}\"\r\n");
+ exportString(aModuleStream, u"Attribute VB_Base = \"0{00020819-0000-0000-C000-000000000046}\"\r\n", eTextEncoding);
else
- exportString(aModuleStream, u"Attribute VB_Base = \"0{00020820-0000-0000-C000-000000000046}\"\r\n");
-
- exportString(aModuleStream, u"Attribute VB_GlobalNameSpace = False\r\n");
- exportString(aModuleStream, u"Attribute VB_Creatable = False\r\n");
- exportString(aModuleStream, u"Attribute VB_PredeclaredId = True\r\n");
- exportString(aModuleStream, u"Attribute VB_Exposed = True\r\n");
- exportString(aModuleStream, u"Attribute VB_TemplateDerived = False\r\n");
- exportString(aModuleStream, u"Attribute VB_Customizable = True\r\n");
+ exportString(aModuleStream, u"Attribute VB_Base = \"0{00020820-0000-0000-C000-000000000046}\"\r\n", eTextEncoding);
+
+ exportString(aModuleStream, u"Attribute VB_GlobalNameSpace = False\r\n", eTextEncoding);
+ exportString(aModuleStream, u"Attribute VB_Creatable = False\r\n", eTextEncoding);
+ exportString(aModuleStream, u"Attribute VB_PredeclaredId = True\r\n", eTextEncoding);
+ exportString(aModuleStream, u"Attribute VB_Exposed = True\r\n", eTextEncoding);
+ exportString(aModuleStream, u"Attribute VB_TemplateDerived = False\r\n", eTextEncoding);
+ exportString(aModuleStream, u"Attribute VB_Customizable = True\r\n", eTextEncoding);
}
OUString aSourceCode = rSourceCode.replaceFirst("Option VBASupport 1\n", "");
const sal_Int32 nPos = aSourceCode.indexOf("Rem Attribute VBA_ModuleType=");
@@ -800,7 +809,7 @@ void exportModuleStream(SvStream& rStrm, const OUString& rSourceCode, const OUSt
if (nPos != -1 && nEndPos != -1)
aSourceCode = aSourceCode.replaceAt(nPos, nEndPos - nPos+1, u"");
aSourceCode = aSourceCode.replaceAll("\n", "\r\n");
- exportString(aModuleStream, aSourceCode);
+ exportString(aModuleStream, aSourceCode, eTextEncoding);
#if VBA_EXPORT_DEBUG
OUString aModuleFileName("/tmp/vba_" + aElementName + "_out.bin");
@@ -823,8 +832,10 @@ void exportVBAProjectStream(SvStream& rStrm)
}
// section 2.3.1 PROJECT Stream
-void exportPROJECTStream(SvStream& rStrm, const css::uno::Reference<css::container::XNameContainer>& xNameContainer,
- const OUString& projectName, const std::vector<sal_Int32>& rLibraryMap)
+void exportPROJECTStream(SvStream& rStrm,
+ const css::uno::Reference<css::container::XNameContainer>& xNameContainer,
+ const OUString& projectName, const std::vector<sal_Int32>& rLibraryMap,
+ const rtl_TextEncoding eTextEncoding)
{
const css::uno::Sequence<OUString> aElementNames = xNameContainer->getElementNames();
sal_Int32 n = aElementNames.getLength();
@@ -834,11 +845,11 @@ void exportPROJECTStream(SvStream& rStrm, const css::uno::Reference<css::contain
// section 2.3.1.1ProjectProperties
// section 2.3.1.2 ProjectId
- exportString(rStrm, u"ID=\"");
+ exportString(rStrm, u"ID=\"", eTextEncoding);
OUString aProjectID
= OStringToOUString(comphelper::xml::generateGUIDString(), RTL_TEXTENCODING_UTF8);
- exportString(rStrm, aProjectID);
- exportString(rStrm, u"\"\r\n");
+ exportString(rStrm, aProjectID, eTextEncoding);
+ exportString(rStrm, u"\"\r\n", eTextEncoding);
// section 2.3.1.3 ProjectModule
for (sal_Int32 i = 0; i < n; ++i)
@@ -847,94 +858,100 @@ void exportPROJECTStream(SvStream& rStrm, const css::uno::Reference<css::contain
css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(rModuleName);
if(aModuleInfo.ModuleType == 1)
{
- exportString(rStrm, OUStringConcatenation("Module=" + rModuleName + "\r\n"));
+ exportString(rStrm, OUStringConcatenation("Module=" + rModuleName + "\r\n"),
+ eTextEncoding);
}
else if(aModuleInfo.ModuleType == 4)
{
- exportString(rStrm, OUStringConcatenation("Document=" + rModuleName + "/&H00000000\r\n"));
+ exportString(rStrm,
+ OUStringConcatenation("Document=" + rModuleName + "/&H00000000\r\n"),
+ eTextEncoding);
}
}
// section 2.3.1.11 ProjectName
- exportString(rStrm, OUStringConcatenation("Name=\"" + projectName + "\"\r\n"));
+ exportString(rStrm, OUStringConcatenation("Name=\"" + projectName + "\"\r\n"), eTextEncoding);
// section 2.3.1.12 ProjectHelpId
- exportString(rStrm, u"HelpContextID=\"0\"\r\n");
+ exportString(rStrm, u"HelpContextID=\"0\"\r\n", eTextEncoding);
// section 2.3.1.14 ProjectVersionCompat32
- exportString(rStrm, u"VersionCompatible32=\"393222000\"\r\n");
+ exportString(rStrm, u"VersionCompatible32=\"393222000\"\r\n", eTextEncoding);
// section 2.3.1.15 ProjectProtectionState
#if VBA_ENCRYPTION
- exportString(rStrm, u"CMG=\"");
+ exportString(rStrm, u"CMG=\"", eTextEncoding);
SvMemoryStream aProtectedStream(4096, 4096);
aProtectedStream.WriteUInt32(0x00000000);
const sal_uInt8* pData = static_cast<const sal_uInt8*>(aProtectedStream.GetData());
sal_uInt8 nProjKey = VBAEncryption::calculateProjKey(aProjectID);
- VBAEncryption aProtectionState(pData, 4, rStrm, nProjKey);
+ VBAEncryption aProtectionState(pData, 4, rStrm, nProjKey, eTextEncoding);
aProtectionState.write();
- exportString(rStrm, u"\"\r\n");
+ exportString(rStrm, u"\"\r\n", eTextEncoding);
#else
- exportString(rStrm, "CMG=\"BEBC9256EEAAA8AEA8AEA8AEA8AE\"\r\n");
+ exportString(rStrm, "CMG=\"BEBC9256EEAAA8AEA8AEA8AEA8AE\"\r\n", eTextEncoding);
#endif
// section 2.3.1.16 ProjectPassword
#if VBA_ENCRYPTION
- exportString(rStrm, u"DPB=\"");
+ exportString(rStrm, u"DPB=\"", eTextEncoding);
aProtectedStream.Seek(0);
aProtectedStream.WriteUInt8(0x00);
pData = static_cast<const sal_uInt8*>(aProtectedStream.GetData());
- VBAEncryption aProjectPassword(pData, 1, rStrm, nProjKey);
+ VBAEncryption aProjectPassword(pData, 1, rStrm, nProjKey, eTextEncoding);
aProjectPassword.write();
- exportString(rStrm, u"\"\r\n");
+ exportString(rStrm, u"\"\r\n", eTextEncoding);
#else
- exportString(rStrm, "DPB=\"7C7E5014B0D3B1D3B1D3\"\r\n");
+ exportString(rStrm, "DPB=\"7C7E5014B0D3B1D3B1D3\"\r\n", eTextEncoding);
#endif
// section 2.3.1.17 ProjectVisibilityState
#if VBA_ENCRYPTION
- exportString(rStrm, u"GC=\"");
+ exportString(rStrm, u"GC=\"", eTextEncoding);
aProtectedStream.Seek(0);
aProtectedStream.WriteUInt8(0xFF);
pData = static_cast<const sal_uInt8*>(aProtectedStream.GetData());
- VBAEncryption aVisibilityState(pData, 1, rStrm, nProjKey);
+ VBAEncryption aVisibilityState(pData, 1, rStrm, nProjKey, eTextEncoding);
aVisibilityState.write();
- exportString(rStrm, u"\"\r\n\r\n");
+ exportString(rStrm, u"\"\r\n\r\n", eTextEncoding);
#else
- exportString(rStrm, "GC=\"3A3816DAD5DBD5DB2A\"\r\n\r\n");
+ exportString(rStrm, "GC=\"3A3816DAD5DBD5DB2A\"\r\n\r\n", eTextEncoding);
#endif
// section 2.3.1.18 HostExtenders
- exportString(rStrm, u"[Host Extender Info]\r\n"
- "&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000\r\n\r\n"
- );
+ exportString(rStrm,
+ u"[Host Extender Info]\r\n"
+ "&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000\r\n\r\n",
+ eTextEncoding);
// section 2.3.1.19 ProjectWorkspace
- exportString(rStrm, u"[Workspace]\r\n");
+ exportString(rStrm, u"[Workspace]\r\n", eTextEncoding);
for (sal_Int32 i = 0; i < n; ++i)
{
const OUString& rModuleName = aElementNames[rLibraryMap[i]];
css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(rModuleName);
if(aModuleInfo.ModuleType == 1)
{
- exportString(rStrm, OUStringConcatenation(rModuleName + "=25, 25, 1439, 639, \r\n"));
+ exportString(rStrm, OUStringConcatenation(rModuleName + "=25, 25, 1439, 639, \r\n"),
+ eTextEncoding);
}
else
{
- exportString(rStrm, OUStringConcatenation(rModuleName + "=0, 0, 0, 0, C\r\n"));
+ exportString(rStrm, OUStringConcatenation(rModuleName + "=0, 0, 0, 0, C\r\n"),
+ eTextEncoding);
}
}
}
// section 2.3.3.1 NAMEMAP
void writeNAMEMAP(SvStream& rStrm, const css::uno::Sequence<OUString>& rElementNames,
- const std::vector<sal_Int32>& rLibraryMap)
+ const std::vector<sal_Int32>& rLibraryMap, const rtl_TextEncoding eTextEncoding)
{
int n = rElementNames.getLength();
for(sal_Int32 i = 0; i < n; ++i)
{
const OUString& rModuleName = rElementNames[rLibraryMap[i]];
- exportString(rStrm, rModuleName);
+ exportString(rStrm, rModuleName, eTextEncoding);
rStrm.WriteUInt8(0x00); // terminator
exportUTF16String(rStrm, rModuleName);
rStrm.WriteUInt16(0x0000); // terminator
@@ -943,9 +960,9 @@ void writeNAMEMAP(SvStream& rStrm, const css::uno::Sequence<OUString>& rElementN
// section 2.3.3 PROJECTwm Stream
void exportPROJECTwmStream(SvStream& rStrm, const css::uno::Sequence<OUString>& rElementNames,
- const std::vector<sal_Int32>& rLibraryMap)
+ const std::vector<sal_Int32>& rLibraryMap, const rtl_TextEncoding eTextEncoding)
{
- writeNAMEMAP(rStrm, rElementNames, rLibraryMap);
+ writeNAMEMAP(rStrm, rElementNames, rLibraryMap, eTextEncoding);
rStrm.WriteUInt16(0x0000); // terminator
}
@@ -1029,25 +1046,28 @@ void VbaExport::exportVBA(SotStorage* pRootStorage)
tools::SvRef<SotStorageStream> pPROJECTStream = pRootStorage->OpenSotStream("PROJECT", StreamMode::READWRITE);
tools::SvRef<SotStorageStream> pPROJECTwmStream = pRootStorage->OpenSotStream("PROJECTwm", StreamMode::READWRITE);
+ const rtl_TextEncoding eTextEncoding = getVBATextEncoding();
+
#if VBA_USE_ORIGINAL_WM_STREAM
OUString aProjectwmPath = "/home/moggi/Documents/testfiles/vba/PROJECTwm";
addFileStreamToSotStream(aProjectwmPath, *pPROJECTwmStream);
#else
- exportPROJECTwmStream(*pPROJECTwmStream, aElementNames, aLibraryMap);
+ exportPROJECTwmStream(*pPROJECTwmStream, aElementNames, aLibraryMap, eTextEncoding);
#endif
#if VBA_USE_ORIGINAL_DIR_STREAM
OUString aDirPath = "/home/moggi/Documents/testfiles/vba/VBA/dir";
addFileStreamToSotStream(aDirPath, *pDirStream);
#else
- exportDirStream(*pDirStream, xNameContainer, aLibraryMap, getProjectName());
+ exportDirStream(*pDirStream, xNameContainer, aLibraryMap, getProjectName(), eTextEncoding);
#endif
#if VBA_USE_ORIGINAL_PROJECT_STREAM
OUString aProjectPath = "/home/moggi/Documents/testfiles/vba/PROJECT";
addFileStreamToSotStream(aProjectPath, *pPROJECTStream);
#else
- exportPROJECTStream(*pPROJECTStream, xNameContainer, getProjectName(), aLibraryMap);
+ exportPROJECTStream(*pPROJECTStream, xNameContainer, getProjectName(), aLibraryMap,
+ eTextEncoding);
#endif
#if VBA_USE_ORIGINAL_VBA_PROJECT
@@ -1090,7 +1110,7 @@ void VbaExport::exportVBA(SotStorage* pRootStorage)
css::script::ModuleInfo aModuleInfo = xModuleInfo->getModuleInfo(rModuleName);
OUString aSourceCode;
aCode >>= aSourceCode;
- exportModuleStream(*pModuleStream, aSourceCode, rModuleName, aModuleInfo);
+ exportModuleStream(*pModuleStream, aSourceCode, rModuleName, aModuleInfo, eTextEncoding);
pModuleStream->Commit();
}
@@ -1153,4 +1173,21 @@ OUString VbaExport::getProjectName() const
return OUString();
}
+rtl_TextEncoding VbaExport::getVBATextEncoding() const
+{
+ rtl_TextEncoding aTextEncoding = osl_getThreadTextEncoding();
+ css::uno::Reference<css::beans::XPropertySet> xProps(getLibraryContainer(),
+ css::uno::UNO_QUERY);
+ if (xProps.is())
+ try
+ {
+ xProps->getPropertyValue("VBATextEncoding") >>= aTextEncoding;
+ }
+ catch (const css::uno::Exception&)
+ {
+ }
+
+ return aTextEncoding;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/ole/vbaproject.cxx b/oox/source/ole/vbaproject.cxx
index 82b02d152dc2..c868d83b6f72 100644
--- a/oox/source/ole/vbaproject.cxx
+++ b/oox/source/ole/vbaproject.cxx
@@ -412,6 +412,8 @@ void VbaProject::readVbaModules( StorageBase& rVbaPrjStrg )
xVBACompat->setVBACompatibilityMode( true );
xVBACompat->setProjectName( maPrjName );
+ uno::Reference<beans::XPropertySet> xProps(xVBACompat, uno::UNO_QUERY_THROW);
+ xProps->setPropertyValue("VBATextEncoding", uno::Any(eTextEnc));
}
catch(const Exception& )
{