extensions/source/activex/so_activex.cxx | 141 ++++++++++++++++--------------- 1 file changed, 73 insertions(+), 68 deletions(-)
New commits: commit e5ded88418c46d2183c911fb7564259fc7c97a47 Author: Mike Kaganski <[email protected]> AuthorDate: Mon Nov 10 12:12:21 2025 +0500 Commit: Mike Kaganski <[email protected]> CommitDate: Mon Nov 10 10:57:14 2025 +0100 Fix registration of ActiveX component It had three separate arrays, together constituting a mapping. In commit ed00d0ddd663085a5fd180301cdc82af80bc8077 (create a master document template type, 2014-09-11), they got desynchronized by a mistake (a MIME type was added for text global templates, but no corresponding entries were added to extensions and modes). This change makes them a single array, and clarifies what "mode" bits meant. Which groups get (un)registered was not changed. Change-Id: I1896bc2901cbcc5825beaa49313a45f374bad7d4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193712 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> diff --git a/extensions/source/activex/so_activex.cxx b/extensions/source/activex/so_activex.cxx index ec6c28c8e07e..3eb69c3122c8 100644 --- a/extensions/source/activex/so_activex.cxx +++ b/extensions/source/activex/so_activex.cxx @@ -152,57 +152,57 @@ private: } // for now database component and chart are always installed -#define SUPPORTED_EXT_NUM 30 -const char* const aFileExt[] = { ".vor", - ".sds", ".sda", ".sdd", ".sdp", ".sdc", ".sdw", ".smf", - ".stw", ".stc", ".sti", ".std", - ".sxw", ".sxc", ".sxi", ".sxd", ".sxg", ".sxm", - ".ott", ".otg", ".otp", ".ots", ".otf", - ".odt", ".oth", ".odm", ".odg", ".odp", ".ods", ".odf"}; -const sal_Unicode* const aMimeType[] = { - u"application/vnd.stardivision.writer", - - u"application/vnd.stardivision.chart", - u"application/vnd.stardivision.draw", - u"application/vnd.stardivision.impress", - u"application/vnd.stardivision.impress-packed", - u"application/vnd.stardivision.calc", - u"application/vnd.stardivision.writer", - u"application/vnd.stardivision.math", - - MIMETYPE_VND_SUN_XML_WRITER_TEMPLATE.getStr(), - MIMETYPE_VND_SUN_XML_CALC_TEMPLATE.getStr(), - MIMETYPE_VND_SUN_XML_IMPRESS_TEMPLATE.getStr(), - MIMETYPE_VND_SUN_XML_DRAW_TEMPLATE.getStr(), - - MIMETYPE_VND_SUN_XML_WRITER.getStr(), - MIMETYPE_VND_SUN_XML_CALC.getStr(), - MIMETYPE_VND_SUN_XML_IMPRESS.getStr(), - MIMETYPE_VND_SUN_XML_DRAW.getStr(), - MIMETYPE_VND_SUN_XML_WRITER_GLOBAL.getStr(), - MIMETYPE_VND_SUN_XML_MATH.getStr(), - - MIMETYPE_OASIS_OPENDOCUMENT_TEXT_TEMPLATE.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL_TEMPLATE.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_TEMPLATE.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_TEMPLATE.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_TEMPLATE.getStr(), - - MIMETYPE_OASIS_OPENDOCUMENT_TEXT.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_TEXT_WEB.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_DRAWING.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET.getStr(), - MIMETYPE_OASIS_OPENDOCUMENT_FORMULA.getStr() }; - -const int nForModes[] = { 16, - 1, 2, 4, 4, 8, 16, 32, - 16, 8, 4, 2, - 16, 8, 4, 2, 16, 32, - 16, 2, 4, 8, 32, - 16, 16, 16, 2, 4, 8, 32 }; + +enum AppBits +{ + Chart = 1, + Draw = 2, + Impress = 4, + Calc = 8, + Writer = 16, + Math = 32, +}; + +struct Mapping +{ + const char* sFileExt; + const sal_Unicode* sMimeType; + AppBits nForModes; +}; + +const Mapping aMappingArray[]{ + { ".vor", u"application/vnd.stardivision.writer", AppBits::Writer }, + { ".sds", u"application/vnd.stardivision.chart", AppBits::Chart }, + { ".sda", u"application/vnd.stardivision.draw", AppBits::Draw }, + { ".sdd", u"application/vnd.stardivision.impress", AppBits::Impress }, + { ".sdp", u"application/vnd.stardivision.impress-packed", AppBits::Impress }, + { ".sdc", u"application/vnd.stardivision.calc", AppBits::Calc }, + { ".sdw", u"application/vnd.stardivision.writer", AppBits::Writer }, + { ".smf", u"application/vnd.stardivision.math", AppBits::Math }, + { ".stw", MIMETYPE_VND_SUN_XML_WRITER_TEMPLATE.getStr(), AppBits::Writer }, + { ".stc", MIMETYPE_VND_SUN_XML_CALC_TEMPLATE.getStr(), AppBits::Calc }, + { ".sti", MIMETYPE_VND_SUN_XML_IMPRESS_TEMPLATE.getStr(), AppBits::Impress }, + { ".std", MIMETYPE_VND_SUN_XML_DRAW_TEMPLATE.getStr(), AppBits::Draw }, + { ".sxw", MIMETYPE_VND_SUN_XML_WRITER.getStr(), AppBits::Writer }, + { ".sxc", MIMETYPE_VND_SUN_XML_CALC.getStr(), AppBits::Calc }, + { ".sxi", MIMETYPE_VND_SUN_XML_IMPRESS.getStr(), AppBits::Impress }, + { ".sxd", MIMETYPE_VND_SUN_XML_DRAW.getStr(), AppBits::Draw }, + { ".sxg", MIMETYPE_VND_SUN_XML_WRITER_GLOBAL.getStr(), AppBits::Writer }, + { ".sxm", MIMETYPE_VND_SUN_XML_MATH.getStr(), AppBits::Math }, + { ".ott", MIMETYPE_OASIS_OPENDOCUMENT_TEXT_TEMPLATE.getStr(), AppBits::Writer }, + { ".otm", MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL_TEMPLATE.getStr(), AppBits::Writer }, + { ".otg", MIMETYPE_OASIS_OPENDOCUMENT_DRAWING_TEMPLATE.getStr(), AppBits::Draw }, + { ".otp", MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE.getStr(), AppBits::Impress }, + { ".ots", MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET_TEMPLATE.getStr(), AppBits::Calc }, + { ".otf", MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_TEMPLATE.getStr(), AppBits::Math }, + { ".odt", MIMETYPE_OASIS_OPENDOCUMENT_TEXT.getStr(), AppBits::Writer }, + { ".oth", MIMETYPE_OASIS_OPENDOCUMENT_TEXT_WEB.getStr(), AppBits::Writer }, + { ".odm", MIMETYPE_OASIS_OPENDOCUMENT_TEXT_GLOBAL.getStr(), AppBits::Writer }, + { ".odg", MIMETYPE_OASIS_OPENDOCUMENT_DRAWING.getStr(), AppBits::Draw }, + { ".odp", MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION.getStr(), AppBits::Impress }, + { ".ods", MIMETYPE_OASIS_OPENDOCUMENT_SPREADSHEET.getStr(), AppBits::Calc }, + { ".odf", MIMETYPE_OASIS_OPENDOCUMENT_FORMULA.getStr(), AppBits::Math }, +}; const char* const aClassID = "{67F2A879-82D5-4A6D-8CC5-FFB3C114B69D}"; const char* const aTypeLib = "{61FA3F13-8061-4796-B055-3697ED28CB38}"; @@ -400,11 +400,11 @@ static HRESULT DllRegisterServerNative_Impl( int nMode, bool bForAllUsers, REGSA } } - for (ind = 0; ind < SUPPORTED_EXT_NUM; ind++) + for (auto& m : aMappingArray) { - if (nForModes[ind] & nMode) + if (m.nForModes & nMode) { - wsprintfA(aSubKey, "%sMIME\DataBase\Content Type\%ls", aPrefix, aMimeType[ind]); + wsprintfA(aSubKey, "%sMIME\DataBase\Content Type\%ls", aPrefix, m.sMimeType); HRegKey hkey; s.upd(RegCreateKeyExA(bForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, aSubKey, 0, nullptr, REG_OPTION_NON_VOLATILE, nKeyAccess, @@ -420,9 +420,9 @@ static HRESULT DllRegisterServerNative_Impl( int nMode, bool bForAllUsers, REGSA HRegKey hkey; s.upd(RegOpenKeyExA(bForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, aSubKey, 0, nKeyAccess, &hkey)); - for (ind = 0; ind < SUPPORTED_EXT_NUM; ind++) + for (auto& m : aMappingArray) { - wsprintfA(aSubKey, "EnableFullPage\%s", aFileExt[ind]); + wsprintfA(aSubKey, "EnableFullPage\%s", m.sFileExt); HRegKey hkey1; s.upd(RegCreateKeyExA(hkey, aSubKey, 0, nullptr, REG_OPTION_NON_VOLATILE, nKeyAccess, nullptr, &hkey1, nullptr)); @@ -471,12 +471,12 @@ static HRESULT DllUnregisterServerNative_Impl( int nMode, bool bForAllUsers, REG const char* aPrefix = aLocalPrefix; // bForAllUsers ? "" : aLocalPrefix; Status s(false); // no throw - for( int ind = 0; ind < SUPPORTED_EXT_NUM; ind++ ) + for (auto& m : aMappingArray) { - if( nForModes[ind] & nMode ) + if (m.nForModes & nMode) { DWORD nSubKeys = 0, nValues = 0; - wsprintfA(aSubKey, "%sMIME\DataBase\Content Type\%ls", aPrefix, aMimeType[ind]); + wsprintfA(aSubKey, "%sMIME\DataBase\Content Type\%ls", aPrefix, m.sMimeType); Status s1(false); // no throw { HRegKey hkey; @@ -494,7 +494,7 @@ static HRESULT DllUnregisterServerNative_Impl( int nMode, bool bForAllUsers, REG nKeyAccess); s.upd(s1.get()); - wsprintfA(aSubKey, "%s%s", aPrefix, aFileExt[ind]); + wsprintfA(aSubKey, "%s%s", aPrefix, m.sFileExt); Status s2(false); // no throw { HRegKey hkey; @@ -736,15 +736,18 @@ STDAPI DllRegisterServer() pPathEnd = wcsrchr(pProgramPath, '\'); if (pPathEnd) { + // No idea why Math is excluded + const int nMode = AppBits::Chart | AppBits::Draw | AppBits::Impress | AppBits::Calc + | AppBits::Writer; *pPathEnd = 0; - aResult = DllRegisterServerNative( 31, TRUE, bX64, pProgramPath ); + aResult = DllRegisterServerNative(nMode, TRUE, bX64, pProgramPath); if( SUCCEEDED( aResult ) ) - aResult = DllRegisterServerDoc( 31, TRUE, bX64 ); + aResult = DllRegisterServerDoc(nMode, TRUE, bX64); else { - aResult = DllRegisterServerNative( 31, FALSE, bX64, pProgramPath ); + aResult = DllRegisterServerNative(nMode, FALSE, bX64, pProgramPath); if( SUCCEEDED( aResult ) ) - aResult = DllRegisterServerDoc( 31, FALSE, bX64 ); + aResult = DllRegisterServerDoc(nMode, FALSE, bX64); } } } @@ -757,10 +760,12 @@ STDAPI DllRegisterServer() STDAPI DllUnregisterServer() { - DllUnregisterServerDoc( 63, FALSE, bX64 ); - DllUnregisterServerNative( 63, FALSE, bX64 ); - DllUnregisterServerDoc( 63, TRUE, bX64 ); - return DllUnregisterServerNative( 63, TRUE, bX64 ); + const int nMode = AppBits::Chart | AppBits::Draw | AppBits::Impress | AppBits::Calc + | AppBits::Writer | AppBits::Math; + DllUnregisterServerDoc(nMode, FALSE, bX64); + DllUnregisterServerNative(nMode, FALSE, bX64); + DllUnregisterServerDoc(nMode, TRUE, bX64); + return DllUnregisterServerNative(nMode, TRUE, bX64); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
