From b2c4b73f049c0c534b34bc65810e66332699ac4d Mon Sep 17 00:00:00 2001 From: Konstantin Redkin Date: Sat, 6 Jan 2024 01:54:50 +0300 Subject: [PATCH] Adding support - attach type and set language code Removes rarely used headers in windows.h. --- CMakeLists.txt | 22 +++++++++++++++++++++- include/AddInDefBase.h | 20 +++++++++++++------- include/ComponentBase.h | 36 ++++++++++++++++++++++++++++++++---- src/Component.cpp | 10 ++++++++++ src/Component.h | 1 + src/exports.cpp | 12 ++++++++++++ 6 files changed, 89 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc521ca..c592b11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ project(SampleAddIn) set(CMAKE_CXX_STANDARD 17) set(TARGET SampleAddIn) +set(ATTACH_TYPE "ANY" CACHE STRING "Attach type: ISOLATED | NOT_ISOLATED | ANY (default)") option(CASE_INSENSITIVE "Case insensitive method names" OFF) option(STATIC_CRT "Static CRT linkage" OFF) @@ -27,6 +28,24 @@ endif () add_library(${TARGET} SHARED ${SOURCES}) +set(ATTACH_TYPE_ANY 0) +set(ATTACH_TYPE_ISOLATED 1) +set(ATTACH_TYPE_NOT_ISOLATED 2) + +target_compile_definitions(${TARGET} PRIVATE ATTACH_TYPE_ANY=${ATTACH_TYPE_ANY}) +target_compile_definitions(${TARGET} PRIVATE ATTACH_TYPE_ISOLATED=${ATTACH_TYPE_ISOLATED}) +target_compile_definitions(${TARGET} PRIVATE ATTACH_TYPE_NOT_ISOLATED=${ATTACH_TYPE_NOT_ISOLATED}) + +if (${ATTACH_TYPE} STREQUAL "ANY") + set(ATTACH_TYPE ${ATTACH_TYPE_ANY}) +elseif (${ATTACH_TYPE} STREQUAL "ISOLATED") + set(ATTACH_TYPE ${ATTACH_TYPE_ISOLATED}) +elseif (${ATTACH_TYPE} STREQUAL "NOT_ISOLATED") + set(ATTACH_TYPE ${ATTACH_TYPE_NOT_ISOLATED}) +else() + message(FATAL_ERROR "Unrecognized ATTACH_TYPE ${ATTACH_TYPE}") +endif () + target_compile_definitions(${TARGET} PRIVATE UNICODE _UNICODE) @@ -51,9 +70,10 @@ if (WIN32) string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") endif () + # https://stackoverflow.com/questions/11040133/what-does-defining-win32-lean-and-mean-exclude-exactly target_compile_definitions(${TARGET} PRIVATE _WINDOWS - _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING) + _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING WIN32_LEAN_AND_MEAN) target_compile_options(${TARGET} PRIVATE /utf-8) endif () diff --git a/include/AddInDefBase.h b/include/AddInDefBase.h index 029d5da..18124ef 100644 --- a/include/AddInDefBase.h +++ b/include/AddInDefBase.h @@ -16,13 +16,10 @@ enum Interfaces { eIMsgBox = 0, eIPlatformInfo, - #if defined(__ANDROID__) - eIAndroidComponentHelper, - -#endif - +#endif + eIAttachedInfo, }; //////////////////////////////////////////////////////////////////////////////// @@ -155,5 +152,14 @@ struct IPlatformInfo : virtual const AppInfo* ADDIN_API GetPlatformInfo() = 0; }; - -#endif //__ADAPTER_DEF_H__ +struct IAttachedInfo : + public IInterface +{ + enum AttachedType + { + eAttachedIsolated = 0, + eAttachedNotIsolated, + }; + virtual const AttachedType ADDIN_API GetAttachedInfo() = 0; +}; +#endif //__ADAPTER_DEF_H__ \ No newline at end of file diff --git a/include/ComponentBase.h b/include/ComponentBase.h index 43199ac..d27351e 100644 --- a/include/ComponentBase.h +++ b/include/ComponentBase.h @@ -204,6 +204,22 @@ class LocaleBase virtual void ADDIN_API SetLocale(const WCHAR_T* loc) = 0; }; +/////////////////////////////////////////////////////////////////////// +/// class UserLanguageBase- интерфейс изменения языка компоненты +/** + * Этот интерфейс предназначен для изменения локализации компоненты + */ +class UserLanguageBase +{ +public: + virtual ~UserLanguageBase() {} + /// Изменение локали компоненты + /** + * @param const char16_t* lang - устанавливаемый язык (ru, etc...) + */ + virtual void ADDIN_API SetUserInterfaceLanguageCode(const WCHAR_T* lang) = 0; +}; + /////////////////////////////////////////////////////////////////////////// /** * The given interface is generalized, for its obligatory inheritance @@ -211,9 +227,10 @@ class LocaleBase */ /// Base interface describing object as a set of properties and methods. class IComponentBase : -public IInitDoneBase, - public ILanguageExtenderBase, - public LocaleBase + public IInitDoneBase, + public ILanguageExtenderBase, + public LocaleBase, + public UserLanguageBase { public: virtual ~IComponentBase(){} @@ -223,7 +240,16 @@ enum AppCapabilities { eAppCapabilitiesInvalid = -1, eAppCapabilities1 = 1, - eAppCapabilitiesLast = eAppCapabilities1, + eAppCapabilities2 = 2, + eAppCapabilities3 = 3, + eAppCapabilitiesLast = eAppCapabilities3, +}; + +enum AttachType +{ + eCanAttachNotIsolated = 1, + eCanAttachIsolated, + eCanAttachAny, }; /// Announcements of exported functions @@ -234,10 +260,12 @@ extern "C" long GetClassObject(const WCHAR_T*, IComponentBase** pIntf); extern "C" long DestroyObject(IComponentBase** pIntf); extern "C" const WCHAR_T* GetClassNames(); extern "C" AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities); +extern "C" AttachType GetAttachType(); typedef long (*GetClassObjectPtr)(const WCHAR_T* wsName, IComponentBase** pIntf); typedef long (*DestroyObjectPtr)(IComponentBase** pIntf); typedef const WCHAR_T* (*GetClassNamesPtr)(); typedef AppCapabilities (*SetPlatformCapabilitiesPtr)(const AppCapabilities capabilities); +typedef AttachType (*GetAttachTypePtr)(); #endif //__COMPONENT_BASE_H__ diff --git a/src/Component.cpp b/src/Component.cpp index 7ffcb80..44c7181 100644 --- a/src/Component.cpp +++ b/src/Component.cpp @@ -464,3 +464,13 @@ std::u16string Component::toUTF16String(std::string_view src) { return cvt_utf8_utf16.from_bytes(src.data(), src.data() + src.size()); #endif } + +void Component::SetUserInterfaceLanguageCode(const wchar_t *lang) { +#ifdef CASE_INSENSITIVE + try { + std::locale::global(std::locale{toUTF8String(locale)}); + } catch (std::runtime_error &) { + std::locale::global(std::locale{""}); + } +#endif +} diff --git a/src/Component.h b/src/Component.h index 5797bac..302f729 100644 --- a/src/Component.h +++ b/src/Component.h @@ -96,6 +96,7 @@ class Component : public IComponentBase { bool ADDIN_API CallAsFunc(const long method_num, tVariant *ret_value, tVariant *params, const long array_size) final; + void ADDIN_API SetUserInterfaceLanguageCode(const wchar_t *lang) final; protected: virtual std::string extensionName() = 0; diff --git a/src/exports.cpp b/src/exports.cpp index f315392..f29db4c 100644 --- a/src/exports.cpp +++ b/src/exports.cpp @@ -56,3 +56,15 @@ long DestroyObject(IComponentBase **pInterface) { AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities) { return eAppCapabilitiesLast; } + +AttachType GetAttachType() { +#if ATTACH_TYPE == ATTACH_TYPE_ANY + return eCanAttachAny; +#elif ATTACH_TYPE == ATTACH_TYPE_ISOLATED + return eCanAttachIsolated; +#elif ATTACH_TYPE == ATTACH_TYPE_NOT_ISOLATED + return eCanAttachNotIsolated; +#else +#error "Unrecognized ATTACH_TYPE" +#endif +} \ No newline at end of file