/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef _OD_RXDYNAMICMODULE_H_ #define _OD_RXDYNAMICMODULE_H_ #include "RxModule.h" #include "TDVersion.h" #include "OdString.h" #include "TD_PackPush.h" /** \details This template class provides the implementation of static rx-modules in multi-threaded (MT) mode. \sa OdRxModule, OdRefCounter classes */ template class OdRxStaticModule : public T { ODRX_HEAP_OPERATORS(); OdRefCounter m_nLockCount; OdString m_sName; OdRxStaticModule(const OdString& sName) : m_nLockCount(0) , m_sName(sName) { } void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; } long numRefs() const { return m_nLockCount; } public: /** \details Returns the system data for the existing static rx-module instance. \remarks The default implementation does nothing and returns a null pointer. */ void* sysData() { return 0; } /** \details Creates a new static rx-module instance with the specified /module name/ and returns a raw pointer to it. \param name [in] /Module name/ as a non-empty string value. */ static OdRxModule* createModule(const OdString& name) { return new OdRxStaticModule(name); } /** \details Deletes this static rx-module object. */ void deleteModule() { delete this; } /** \details Returns the /module name/ for the static rx-module instance. */ OdString moduleName() const { return m_sName; } }; typedef OdRxModule* (*StaticModuleEntryPoint)(const OdString& szModuleName); #define ODRX_STATIC_MODULE_ENTRY_POINT(_UserModuleClass) odrxCreateModuleObject_For_##_UserModuleClass /** \details This macro is used to create an entry point function for a custom application which are linked in statically to a Teigha client application. */ #define ODRX_DECLARE_STATIC_MODULE_ENTRY_POINT(_UserModuleClass) \ OdRxModule* ODRX_STATIC_MODULE_ENTRY_POINT(_UserModuleClass)(const OdString& szModuleName) /** \details */ struct STATIC_MODULE_DESC { const wchar_t* szAppName; StaticModuleEntryPoint entryPoint; }; /** \details Defines the start of the static module map, which contains entries for all custom Teigha modules that are linked in statically to a Teigha client application. */ #define ODRX_BEGIN_STATIC_MODULE_MAP() \ STATIC_MODULE_DESC g_ODRX_STATIC_MODULE_MAP[] = { /** \details Defines the entry in the static module map, which contains entries for all custom Teigha modules that are linked in statically to a Teigha client application. \param AppName [in] Registered application name, that can be later passed to OdRxDynamicLinker::loadModule to load the static application. \param ModuleClassName [in] Name of the C++ class derived from OdRxModule, that implements support for this module. */ #define ODRX_DEFINE_STATIC_APPLICATION(AppName, ModuleClassName) \ { AppName, ODRX_STATIC_MODULE_ENTRY_POINT(ModuleClassName) }, /** \details */ #define ODRX_DEFINE_STATIC_APPMODULE(moduleName, ModuleClassName) \ ODRX_DEFINE_STATIC_APPLICATION(moduleName, ModuleClassName) /** \details Defines the end of the static module map, which contains entries for all custom Teigha modules that are linked in statically to a Teigha client application. */ #define ODRX_END_STATIC_MODULE_MAP() \ { 0, 0 } }; FIRSTDLL_EXPORT void odrxInitStaticModuleMap(STATIC_MODULE_DESC* pMap); #define ODRX_INIT_STATIC_MODULE_MAP() odrxInitStaticModuleMap(g_ODRX_STATIC_MODULE_MAP) #define ODRX_DEFINE_STATIC_MODULE(_UserModuleClass)\ ODRX_DECLARE_STATIC_MODULE_ENTRY_POINT(_UserModuleClass)\ {\ return OdRxStaticModule<_UserModuleClass >::createModule(szModuleName);\ } /** \details This template class provides the implementation of pseudo static rx-modules in multi-threaded (MT) mode. \remarks For internal use only \sa OdRxModule, OdRefCounter classes */ template class OdRxPseudoStaticModule : public T { ODRX_HEAP_OPERATORS(); OdRefCounter m_nLockCount; OdString m_sName; OdRxPseudoStaticModule(const OdString& sName) : m_nLockCount(0) , m_sName(sName) { } void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; if (m_nLockCount == 0){ delete this; } } long numRefs() const { return m_nLockCount; } public: /** \details Returns the system data for the existing pseudo static rx-module instance. \remarks The default implementation does nothing and returns a null pointer. */ void* sysData() { return 0; } /** \details Creates a new pseudo static rx-module instance with the specified /module name/ and returns a raw pointer to it. \param name [in] /Module name/ as non-empty string value. */ static OdRxModule* createModule(const OdString& name) { return new OdRxPseudoStaticModule(name); } /** \details Deletes this pseudo static rx-module object. */ void deleteModule() { delete this; } /** \details Returns the /module name/ for the pseudo static rx-module instance. */ OdString moduleName() const { return m_sName; } }; // For internal use only #define ODRX_DEFINE_PSEUDO_STATIC_MODULE(_UserModuleClass)\ ODRX_DECLARE_STATIC_MODULE_ENTRY_POINT(_UserModuleClass)\ {\ return OdRxPseudoStaticModule<_UserModuleClass >::createModule(szModuleName);\ } #if defined(_TOOLKIT_IN_DLL_) && !defined(__MWERKS__) //////////////////////////////////////////////////////////////////////////////// //IR.111706. MacOS X dynamic library loading. #if defined(__GNUC__) && defined(__APPLE__) // GNU compiler MacOS X #define ODRX_STATIC_MODULE_PATH "{5CEAD1EF-4D33-48fe-99E4-E09176BCF088}/" #define ODRX_STATIC_APP_MODULE_NAME(AppName) (OdString(ODRX_STATIC_MODULE_PATH) + AppName + DEFAULT_MODULE_EXTENSION_DOT_W) void deleteModuleObject(); /** \details This template class provides the implementation of Mac rx-modules in multi-threaded (MT) mode. \sa OdRxModule, OdRefCounter classes */ template class OdRxMacModule : public T { OdRefCounter m_nLockCount; void *m_hModule; const OdString m_name; OdRxMacModule(void *hModule, const OdString name) : m_nLockCount(0) , m_hModule(hModule) , m_name(name) {} void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; } long numRefs() const { return m_nLockCount; } ODRX_HEAP_OPERATORS(); public: /** \details Returns the system data for the existing Mac rx-module instance. */ void* sysData() { return m_hModule; } /** \details Creates a new Mac rx-module instance with the specified /module name/ and returns a raw pointer to it. \param hModule [in] Module handle. \param name [in] /Module name/ as non-empty string value. */ static OdRxMacModule* createModule(void *hModule, const OdString name) { return new OdRxMacModule(hModule, name); } /** \details Deletes this Mac rx-module object. */ void deleteModule() { deleteModuleObject(); delete this; } /** \details Returns the /module name/ for the Mac rx-module instance. */ OdString moduleName() const { return m_name; } }; /** \details Creates the entry point function for a Teigha custom application. */ #define ODRX_DEFINE_DYNAMIC_MODULE(_UserModuleClass)\ static OdRxModule* g_pSingletonModule = 0;\ extern "C" { \ __attribute__ ((visibility("default"))) \ OdRxModule* odrxCreateModuleObject(void *hModule, OdChar *name)\ {\ if(!g_pSingletonModule)\ {\ g_pSingletonModule = OdRxMacModule<_UserModuleClass >::createModule(hModule, name);\ hModule = NULL;\ }\ return g_pSingletonModule;\ }\ void odrxGetAPIVersion(int& nMajorVersion, int& nMinorVersion,\ int& nMajorBuildVersion, int& nMinorBuildVersion)\ {\ nMajorVersion = TD_MAJOR_VERSION;\ nMinorVersion = TD_MINOR_VERSION;\ nMajorBuildVersion = TD_MAJOR_BUILD;\ nMinorBuildVersion = TD_MINOR_BUILD;\ }\ }\ void deleteModuleObject()\ {\ g_pSingletonModule = NULL;\ } #elif defined(__GNUC__) #define ODRX_STATIC_MODULE_PATH "{5CEAD1EF-4D33-48fe-99E4-E09176BCF088}/" #define ODRX_STATIC_APP_MODULE_NAME(AppName) (OdString(ODRX_STATIC_MODULE_PATH) + AppName + DEFAULT_MODULE_EXTENSION_DOT_W) void deleteModuleObject(); /** \details This template class provides the implementation of Unix rx-modules in multi-threaded (MT) mode. \sa OdRxModule, OdRefCounter classes */ template class OdRxUnixModule : public T { OdRefCounter m_nLockCount; void *m_hModule; const OdString m_name; protected: OdRxUnixModule(void *hModule, const OdString name) : m_nLockCount(0) , m_hModule(hModule) , m_name(name) {} private: void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; } long numRefs() const { return m_nLockCount; } ODRX_HEAP_OPERATORS(); public: /** \details Returns the system data for the existing Unix rx-module instance. */ void* sysData() { return m_hModule; } /** \details Creates a new Unix rx-module instance with the specified /module name/ and returns a raw pointer to it. \param hModule [in] Module handle. \param name [in] /Module name/ as non-empty string value. */ static OdRxUnixModule* createModule(void *hModule, const OdString name) { return new OdRxUnixModule(hModule, name); } /** \details Deletes this Unix rx-module object. */ void deleteModule() { deleteModuleObject(); delete this; } /** \details Returns the /module name/ for the Unix rx-module instance. */ OdString moduleName() const { return m_name; } }; /** \details Creates the entry point function for a Teigha custom application. */ #define ODRX_DEFINE_DYNAMIC_MODULE(_UserModuleClass)\ static OdRxModule* g_pSingletonModule = 0;\ \ class OdRxUnixModule##_UserModuleClass : public OdRxUnixModule<_UserModuleClass>\ {\ ODRX_HEAP_OPERATORS();\ OdRxUnixModule##_UserModuleClass(void *hModule, const OdString name)\ : OdRxUnixModule<_UserModuleClass>(hModule, name)\ {\ }\ public:\ static _UserModuleClass* createModule(void *hModule, const OdString name) \ { \ return new OdRxUnixModule##_UserModuleClass(hModule, name);\ }\ \ virtual void deleteModule()\ {\ g_pSingletonModule = 0;\ delete this;\ }\ };\ \ extern "C" { \ __attribute__ ((visibility("default"))) \ OdRxModule* odrxCreateModuleObject(void *hModule, OdChar *name)\ {\ if(!g_pSingletonModule)\ {\ g_pSingletonModule = OdRxUnixModule##_UserModuleClass::createModule(hModule, name);\ hModule = NULL;\ }\ return g_pSingletonModule;\ }\ __attribute__ ((visibility("default"))) \ void odrxGetAPIVersion(int& nMajorVersion, int& nMinorVersion,\ int& nMajorBuildVersion, int& nMinorBuildVersion)\ {\ nMajorVersion = TD_MAJOR_VERSION;\ nMinorVersion = TD_MINOR_VERSION;\ nMajorBuildVersion = TD_MAJOR_BUILD;\ nMinorBuildVersion = TD_MINOR_BUILD;\ }\ }\ void deleteModuleObject()\ {\ g_pSingletonModule = NULL;\ }\ #else //defined(__GNUC__) #define ODRX_STATIC_MODULE_PATH "{5CEAD1EF-4D33-48fe-99E4-E09176BCF088}/" #define ODRX_STATIC_APP_MODULE_NAME(AppName) (OdString(ODRX_STATIC_MODULE_PATH) + AppName + DEFAULT_MODULE_EXTENSION_DOT_W) #ifdef __BORLANDC__ /** \details This template class provides the implementation of Win32 rx-modules in multi-threaded (MT) mode. \sa OdRxModule, OdRefCounter classes */ template class OdRxWin32Module : public T { OdRefCounter m_nLockCount; HMODULE m_hModule; const OdString m_sModuleName; OdRxWin32Module() : m_nLockCount(0) { } void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; } long numRefs() const { return m_nLockCount; } OdRxWin32Module(HMODULE hModule , const OdString name ) : m_nLockCount(0) , m_hModule(hModule) , m_sModuleName(name) {} ODRX_HEAP_OPERATORS(); public: /** \details Returns the system data for the existing Win32 rx-module instance. */ void* sysData() { return reinterpret_cast(m_hModule); } /** \details Creates a new Win32 rx-module instance with the specified /module name/ and returns a raw pointer to it. \param hModule [in] Module handle. \param name [in] /Module name/ as non-empty string value. */ static OdRxWin32Module* createModule(HMODULE hModule, const OdString name ) { return new OdRxWin32Module(hModule,name); } /** \details Deletes this Win32 rx-module object. */ void deleteModule() { g_pSingletonModule = 0; delete this; } /** \details Returns the /module name/ for the Win32 rx-module instance. */ OdString moduleName() const { return m_sModuleName; } }; /** \details Creates the entry point function for a Teigha custom application. */ #define ODRX_DEFINE_DYNAMIC_MODULE(_UserModuleClass)\ static OdRxModule* g_pSingletonModule = 0;\ extern "C" {\ __declspec(dllexport) OdRxModule* odrxCreateModuleObject(HMODULE& hModule, const OdChar *name)\ {\ if(!g_pSingletonModule)\ {\ g_pSingletonModule = OdRxWin32Module<_UserModuleClass >::createModule(hModule, name);\ hModule = 0;\ }\ return g_pSingletonModule;\ }\ __declspec(dllexport) void odrxGetAPIVersion(int& nMajorVersion, int& nMinorVersion,\ int& nMajorBuildVersion, int& nMinorBuildVersion)\ {\ nMajorVersion = TD_MAJOR_VERSION;\ nMinorVersion = TD_MINOR_VERSION;\ nMajorBuildVersion = TD_MAJOR_BUILD;\ nMinorBuildVersion = TD_MINOR_BUILD;\ }\ }\ #else //__BORLANDC__ /** \details This template class provides the implementation of Win32 rx-modules in multi-threaded (MT) mode. \sa OdRxModule, OdRefCounter classes */ template class OdRxWin32Module : public T { OdRefCounter m_nLockCount; HMODULE m_hModule; OdRxWin32Module() : m_nLockCount(0) { } void addRef() { ++m_nLockCount; } void release() { ODA_ASSERT(m_nLockCount); --m_nLockCount; } long numRefs() const { return m_nLockCount; } OdRxWin32Module(HMODULE hModule ) : m_nLockCount(0) , m_hModule(hModule) {} ODRX_HEAP_OPERATORS(); public: /** \details Returns the system data for the existing Win32 rx-module instance. */ void* sysData() { return reinterpret_cast(m_hModule); } /** \details Creates a new Win32 rx-module instance with the specified /module name/ and returns a raw pointer to it. \param hModule [in] Module handle. \param name [in] /Module name/ as non-empty string value. */ static OdRxWin32Module* createModule(HMODULE hModule) { return new OdRxWin32Module(hModule); } /** \details Deletes this Win32 rx-module object. */ void deleteModule() { g_pSingletonModule = 0; delete this; } /** \details Returns the /module name/ for the Win32 rx-module instance. */ OdString moduleName() const { wchar_t buffer[_MAX_PATH]; ::GetModuleFileNameW(m_hModule, buffer, _MAX_PATH ); return buffer; } }; /** \details Creates the entry point function for a Teigha custom application. */ #define ODRX_DEFINE_DYNAMIC_MODULE(_UserModuleClass)\ static OdRxModule* g_pSingletonModule = 0;\ extern "C" {\ __declspec(dllexport) OdRxModule* odrxCreateModuleObject(HMODULE& hModule)\ {\ if(!g_pSingletonModule)\ {\ g_pSingletonModule = OdRxWin32Module<_UserModuleClass >::createModule(hModule);\ hModule = 0;\ }\ return g_pSingletonModule;\ }\ __declspec(dllexport) void odrxGetAPIVersion(int& nMajorVersion, int& nMinorVersion,\ int& nMajorBuildVersion, int& nMinorBuildVersion)\ {\ nMajorVersion = TD_MAJOR_VERSION;\ nMinorVersion = TD_MINOR_VERSION;\ nMajorBuildVersion = TD_MAJOR_BUILD;\ nMinorBuildVersion = TD_MINOR_BUILD;\ }\ }\ #endif //__BORLANDC__ #endif //defined(__GNUC__) && defined(__APPLE__) #else //#ifdef _TOOLKIT_IN_DLL_ //////////////////////////////////////////////////////////////////////////////// #define ODRX_STATIC_MODULE_PATH "" #define ODRX_STATIC_APP_MODULE_NAME(AppName) AppName #define ODRX_DEFINE_DYNAMIC_MODULE(_UserModuleClass) ODRX_DEFINE_STATIC_MODULE(_UserModuleClass) #endif //#ifdef _TOOLKIT_IN_DLL_ //////////////////////////////////////////////////////////////////////////////// #if defined(_TOOLKIT_IN_DLL_) && defined(_MSC_VER) /** \details Speeds up DLL loading on Windows. Refer to Win SDK documentation on DllMain() for more details. */ #define DISABLE_THREAD_LIBRARY_CALLS()\ extern "C" int APIENTRY DllMain(HINSTANCE h, DWORD reason, LPVOID ) {\ if(reason==DLL_PROCESS_ATTACH)\ DisableThreadLibraryCalls((HMODULE)h);\ return TRUE;\ } #else #define DISABLE_THREAD_LIBRARY_CALLS() #endif //#if defined(_TOOLKIT_IN_DLL_) && defined(_MSC_VER) #include "TD_PackPop.h" #endif // _OD_RXDYNAMICMODULE_H_