From ce8b059af398528096dbb1f32b2bc6fdf6981cbc Mon Sep 17 00:00:00 2001 From: abv Date: Mon, 29 Jun 2015 09:17:43 +0300 Subject: [PATCH] 0024023: Revamp the OCCT Handle -- plugin Definition of PLUGINFACTORY function changed to return Standard_Transient* instead of Handle(Standard_Transient), which cannot be returned by C-style function. Default implementation of PLUGINFACTORY() instantiated by macro PLUGIN() is corrected accordingly. Methods Factory() in persistence packages are made returning const & to handle; this is to reflect the fact that returned handle should point to existing object (usually statically allocated) rather than new one. --- src/BinDrivers/BinDrivers.cdl | 1 + src/BinDrivers/BinDrivers.cxx | 8 +++----- src/BinLDrivers/BinLDrivers.cdl | 1 + src/BinLDrivers/BinLDrivers.cxx | 8 +++----- src/BinTObjDrivers/BinTObjDrivers.cxx | 5 +---- src/BinTObjDrivers/BinTObjDrivers.hxx | 2 +- src/BinXCAFDrivers/BinXCAFDrivers.cdl | 1 + src/BinXCAFDrivers/BinXCAFDrivers.cxx | 8 +++----- src/FWOSDriver/FWOSDriver.cdl | 2 ++ src/FWOSDriver/FWOSDriver.cxx | 6 +----- src/Plugin/Plugin.cxx | 4 ++-- src/Plugin/Plugin_Macro.hxx | 8 ++++---- src/XmlDrivers/XmlDrivers.cdl | 1 + src/XmlDrivers/XmlDrivers.cxx | 9 +++------ src/XmlLDrivers/XmlLDrivers.cdl | 1 + src/XmlLDrivers/XmlLDrivers.cxx | 9 +++------ src/XmlTObjDrivers/XmlTObjDrivers.cxx | 6 +----- src/XmlTObjDrivers/XmlTObjDrivers.hxx | 2 +- src/XmlXCAFDrivers/XmlXCAFDrivers.cdl | 1 + src/XmlXCAFDrivers/XmlXCAFDrivers.cxx | 5 +---- 20 files changed, 35 insertions(+), 53 deletions(-) diff --git a/src/BinDrivers/BinDrivers.cdl b/src/BinDrivers/BinDrivers.cdl index 7a6e220a00..032646655b 100644 --- a/src/BinDrivers/BinDrivers.cdl +++ b/src/BinDrivers/BinDrivers.cdl @@ -33,6 +33,7 @@ is class DocumentRetrievalDriver; Factory (theGUID : GUID from Standard) returns Transient from Standard; + ---C++: return const & AttributeDrivers (MsgDrv : MessageDriver from CDM) returns ADriverTable from BinMDF; diff --git a/src/BinDrivers/BinDrivers.cxx b/src/BinDrivers/BinDrivers.cxx index 6fe301780e..9a28772953 100644 --- a/src/BinDrivers/BinDrivers.cxx +++ b/src/BinDrivers/BinDrivers.cxx @@ -34,7 +34,7 @@ static Standard_GUID BinRetrievalDriver("03a56836-8269-11d5-aab2-0050044b1af1"); //function : Factory //purpose : PLUGIN FACTORY //======================================================================= -Handle(Standard_Transient) BinDrivers::Factory(const Standard_GUID& theGUID) +const Handle(Standard_Transient)& BinDrivers::Factory(const Standard_GUID& theGUID) { if (theGUID == BinStorageDriver) { @@ -57,7 +57,8 @@ Handle(Standard_Transient) BinDrivers::Factory(const Standard_GUID& theGUID) } Standard_Failure::Raise ("BinDrivers : unknown GUID"); - return NULL; + static Handle(Standard_Transient) aNullHandle; + return aNullHandle; } //======================================================================= @@ -90,7 +91,4 @@ TCollection_AsciiString BinDrivers::StorageVersion() return BinLDrivers::StorageVersion(); } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif PLUGIN(BinDrivers) diff --git a/src/BinLDrivers/BinLDrivers.cdl b/src/BinLDrivers/BinLDrivers.cdl index 05dfa4c57b..d97484c2db 100644 --- a/src/BinLDrivers/BinLDrivers.cdl +++ b/src/BinLDrivers/BinLDrivers.cdl @@ -35,6 +35,7 @@ is imported VectorOfDocumentSection; Factory (theGUID : GUID from Standard) returns Transient from Standard; + ---C++: return const & AttributeDrivers (MsgDrv : MessageDriver from CDM) returns ADriverTable from BinMDF; diff --git a/src/BinLDrivers/BinLDrivers.cxx b/src/BinLDrivers/BinLDrivers.cxx index ef1efd164d..5a54f0c578 100644 --- a/src/BinLDrivers/BinLDrivers.cxx +++ b/src/BinLDrivers/BinLDrivers.cxx @@ -32,7 +32,7 @@ static Standard_GUID BinLRetrievalDriver("13a56836-8269-11d5-aab2-0050044b1af1") //function : Factory //purpose : PLUGIN FACTORY //======================================================================= -Handle(Standard_Transient) BinLDrivers::Factory(const Standard_GUID& theGUID) +const Handle(Standard_Transient)& BinLDrivers::Factory(const Standard_GUID& theGUID) { if (theGUID == BinLStorageDriver) { @@ -55,7 +55,8 @@ Handle(Standard_Transient) BinLDrivers::Factory(const Standard_GUID& theGUID) } Standard_Failure::Raise ("BinLDrivers : unknown GUID"); - return NULL; + static Handle(Standard_Transient) aNullHandle; + return aNullHandle; } //======================================================================= @@ -89,7 +90,4 @@ TCollection_AsciiString BinLDrivers::StorageVersion() return aVersionStr; } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif PLUGIN(BinLDrivers) diff --git a/src/BinTObjDrivers/BinTObjDrivers.cxx b/src/BinTObjDrivers/BinTObjDrivers.cxx index 05528381a1..6385c8a505 100644 --- a/src/BinTObjDrivers/BinTObjDrivers.cxx +++ b/src/BinTObjDrivers/BinTObjDrivers.cxx @@ -30,7 +30,7 @@ static Standard_GUID BinStorageDriver ("f78ff4a2-a779-11d5-aab4-0050044b1af1"); static Standard_GUID BinRetrievalDriver("f78ff4a3-a779-11d5-aab4-0050044b1af1"); -Handle(Standard_Transient) BinTObjDrivers::Factory(const Standard_GUID& aGUID) +const Handle(Standard_Transient)& BinTObjDrivers::Factory(const Standard_GUID& aGUID) { if(aGUID == BinStorageDriver) { @@ -69,7 +69,4 @@ void BinTObjDrivers::AddDrivers (const Handle(BinMDF_ADriverTable)& aDriverTable aDriverTable -> AddDriver (new BinTObjDrivers_IntSparseArrayDriver (aMsgDrv)); } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif PLUGIN(BinTObjDrivers) diff --git a/src/BinTObjDrivers/BinTObjDrivers.hxx b/src/BinTObjDrivers/BinTObjDrivers.hxx index 499a6eac46..e59f45421a 100644 --- a/src/BinTObjDrivers/BinTObjDrivers.hxx +++ b/src/BinTObjDrivers/BinTObjDrivers.hxx @@ -30,7 +30,7 @@ class BinTObjDrivers public: // ---------- PUBLIC METHODS ---------- - Standard_EXPORT static Handle(Standard_Transient) Factory + Standard_EXPORT static const Handle(Standard_Transient)& Factory (const Standard_GUID& aGUID); // Returns a driver corresponding to . Used for plugin. diff --git a/src/BinXCAFDrivers/BinXCAFDrivers.cdl b/src/BinXCAFDrivers/BinXCAFDrivers.cdl index 82c487f89e..a574377ab9 100644 --- a/src/BinXCAFDrivers/BinXCAFDrivers.cdl +++ b/src/BinXCAFDrivers/BinXCAFDrivers.cdl @@ -25,6 +25,7 @@ is class DocumentRetrievalDriver; Factory (theGUID : GUID from Standard) returns Transient from Standard; + ---C++: return const & AttributeDrivers (MsgDrv : MessageDriver from CDM) returns ADriverTable from BinMDF; diff --git a/src/BinXCAFDrivers/BinXCAFDrivers.cxx b/src/BinXCAFDrivers/BinXCAFDrivers.cxx index 6f6aeac8b8..59d62c2c00 100644 --- a/src/BinXCAFDrivers/BinXCAFDrivers.cxx +++ b/src/BinXCAFDrivers/BinXCAFDrivers.cxx @@ -29,7 +29,7 @@ static Standard_GUID BinXCAFRetrievalDriver("a78ff497-a779-11d5-aab4-0050044b1af //function : //purpose : //======================================================================= -Handle(Standard_Transient) BinXCAFDrivers::Factory(const Standard_GUID& theGUID) { +const Handle(Standard_Transient)& BinXCAFDrivers::Factory(const Standard_GUID& theGUID) { if (theGUID == BinXCAFStorageDriver) { @@ -53,7 +53,8 @@ Handle(Standard_Transient) BinXCAFDrivers::Factory(const Standard_GUID& theGUID) Standard_Failure::Raise ("XCAFBinDrivers : unknown GUID"); - return NULL; + static Handle(Standard_Transient) aNullHandle; + return aNullHandle; } //======================================================================= @@ -70,7 +71,4 @@ Handle(BinMDF_ADriverTable) BinXCAFDrivers::AttributeDrivers(const Handle(CDM_Me return aTable; } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif PLUGIN(BinXCAFDrivers) diff --git a/src/FWOSDriver/FWOSDriver.cdl b/src/FWOSDriver/FWOSDriver.cdl index 5e863ce6b0..84fbdc7c19 100644 --- a/src/FWOSDriver/FWOSDriver.cdl +++ b/src/FWOSDriver/FWOSDriver.cdl @@ -26,4 +26,6 @@ is Factory(aGUID: GUID from Standard) returns Transient from Standard; ---Purpose: returns a DriverFactory. + ---C++: return const& + end FWOSDriver; diff --git a/src/FWOSDriver/FWOSDriver.cxx b/src/FWOSDriver/FWOSDriver.cxx index cb9f3c9602..28d7cd6985 100644 --- a/src/FWOSDriver/FWOSDriver.cxx +++ b/src/FWOSDriver/FWOSDriver.cxx @@ -19,13 +19,9 @@ #include -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif - PLUGIN(FWOSDriver) -Handle(Standard_Transient) FWOSDriver::Factory(const Standard_GUID& /*aGUID*/) { +const Handle(Standard_Transient)& FWOSDriver::Factory(const Standard_GUID& /*aGUID*/) { static Handle(FWOSDriver_DriverFactory) f; if(f.IsNull()) f = new FWOSDriver_DriverFactory; return f; diff --git a/src/Plugin/Plugin.cxx b/src/Plugin/Plugin.cxx index ab5ab0bf2b..8d406becc0 100644 --- a/src/Plugin/Plugin.cxx +++ b/src/Plugin/Plugin.cxx @@ -94,8 +94,8 @@ Handle(Standard_Transient) Plugin::Load (const Standard_GUID& aGUID, else f = theMapOfFunctions(pid); - Handle(Standard_Transient) (*fp) (const Standard_GUID&) = NULL; - fp = (Handle(Standard_Transient) (*)(const Standard_GUID&)) f; + Standard_Transient* (*fp) (const Standard_GUID&) = NULL; + fp = (Standard_Transient* (*)(const Standard_GUID&)) f; Handle(Standard_Transient) theServiceFactory = (*fp) (aGUID); return theServiceFactory; diff --git a/src/Plugin/Plugin_Macro.hxx b/src/Plugin/Plugin_Macro.hxx index df0b2cb1d8..db9e281f73 100644 --- a/src/Plugin/Plugin_Macro.hxx +++ b/src/Plugin/Plugin_Macro.hxx @@ -17,11 +17,11 @@ #ifndef _Plugin_Macro_HeaderFile #define _Plugin_Macro_HeaderFile +//! Macro implementing C-style interface function to get factory object from the dynamically loaded library #define PLUGIN(name) \ -extern "C" {Standard_EXPORT Handle(Standard_Transient) PLUGINFACTORY(const Standard_GUID&);} \ -Handle(Standard_Transient) PLUGINFACTORY(const Standard_GUID& aGUID) { \ - return name::Factory(aGUID);}\ -\ +extern "C" Standard_EXPORT Standard_Transient* PLUGINFACTORY(const Standard_GUID& aGUID) { \ + return const_cast(name::Factory(aGUID).get()); \ +} #endif diff --git a/src/XmlDrivers/XmlDrivers.cdl b/src/XmlDrivers/XmlDrivers.cdl index d66df5fc7a..a50a6e265e 100644 --- a/src/XmlDrivers/XmlDrivers.cdl +++ b/src/XmlDrivers/XmlDrivers.cdl @@ -32,6 +32,7 @@ is class DocumentRetrievalDriver; Factory (theGUID : GUID from Standard) returns Transient from Standard; + ---C++: return const & AttributeDrivers (theMsgDriver: MessageDriver from CDM) returns ADriverTable from XmlMDF; diff --git a/src/XmlDrivers/XmlDrivers.cxx b/src/XmlDrivers/XmlDrivers.cxx index 27e94e64b0..9f9036ac05 100644 --- a/src/XmlDrivers/XmlDrivers.cxx +++ b/src/XmlDrivers/XmlDrivers.cxx @@ -40,7 +40,7 @@ static Standard_GUID XmlRetrievalDriver("03a56822-8269-11d5-aab2-0050044b1af1"); //function : Factory //purpose : PLUGIN FACTORY //======================================================================= -Handle(Standard_Transient) XmlDrivers::Factory(const Standard_GUID& theGUID) +const Handle(Standard_Transient)& XmlDrivers::Factory(const Standard_GUID& theGUID) { if (theGUID == XmlStorageDriver) { @@ -64,7 +64,8 @@ Handle(Standard_Transient) XmlDrivers::Factory(const Standard_GUID& theGUID) } Standard_Failure::Raise ("XmlDrivers : unknown GUID"); - return NULL; + static Handle(Standard_Transient) aNullHandle; + return aNullHandle; } //======================================================================= @@ -87,9 +88,5 @@ Handle(XmlMDF_ADriverTable) XmlDrivers::AttributeDrivers return aTable; } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif - // Declare entry point PLUGINFACTORY PLUGIN(XmlDrivers) diff --git a/src/XmlLDrivers/XmlLDrivers.cdl b/src/XmlLDrivers/XmlLDrivers.cdl index 979c852f99..0e4af2c2f1 100644 --- a/src/XmlLDrivers/XmlLDrivers.cdl +++ b/src/XmlLDrivers/XmlLDrivers.cdl @@ -35,6 +35,7 @@ is imported SequenceOfNamespaceDef; Factory (theGUID : GUID from Standard) returns Transient from Standard; + ---C++: return const & CreationDate returns AsciiString from TCollection; diff --git a/src/XmlLDrivers/XmlLDrivers.cxx b/src/XmlLDrivers/XmlLDrivers.cxx index d951f27a46..341ee134de 100644 --- a/src/XmlLDrivers/XmlLDrivers.cxx +++ b/src/XmlLDrivers/XmlLDrivers.cxx @@ -36,7 +36,7 @@ static Standard_GUID XmlLRetrievalDriver("13a56822-8269-11d5-aab2-0050044b1af1") //function : Factory //purpose : PLUGIN FACTORY //======================================================================= -Handle(Standard_Transient) XmlLDrivers::Factory(const Standard_GUID& theGUID) +const Handle(Standard_Transient)& XmlLDrivers::Factory(const Standard_GUID& theGUID) { if (theGUID == XmlLStorageDriver) { @@ -60,7 +60,8 @@ Handle(Standard_Transient) XmlLDrivers::Factory(const Standard_GUID& theGUID) } Standard_Failure::Raise ("XmlLDrivers : unknown GUID"); - return NULL; + static Handle(Standard_Transient) aNullHandle; + return aNullHandle; } #define SLENGTH 80 @@ -121,9 +122,5 @@ TCollection_AsciiString XmlLDrivers::StorageVersion() return aVersionStr; } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif - // Declare entry point PLUGINFACTORY PLUGIN(XmlLDrivers) diff --git a/src/XmlTObjDrivers/XmlTObjDrivers.cxx b/src/XmlTObjDrivers/XmlTObjDrivers.cxx index 7d8f33d692..443f1f4bfc 100644 --- a/src/XmlTObjDrivers/XmlTObjDrivers.cxx +++ b/src/XmlTObjDrivers/XmlTObjDrivers.cxx @@ -31,7 +31,7 @@ static Standard_GUID XmlStorageDriver ("f78ff4a0-a779-11d5-aab4-0050044b1af1"); static Standard_GUID XmlRetrievalDriver("f78ff4a1-a779-11d5-aab4-0050044b1af1"); -Handle(Standard_Transient) XmlTObjDrivers::Factory(const Standard_GUID& aGUID) +const Handle(Standard_Transient)& XmlTObjDrivers::Factory(const Standard_GUID& aGUID) { if(aGUID == XmlStorageDriver) { @@ -71,8 +71,4 @@ void XmlTObjDrivers::AddDrivers (const Handle(XmlMDF_ADriverTable)& aDriverTable aDriverTable -> AddDriver (new XmlTObjDrivers_IntSparseArrayDriver(anMsgDrv)); } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif - PLUGIN(XmlTObjDrivers) diff --git a/src/XmlTObjDrivers/XmlTObjDrivers.hxx b/src/XmlTObjDrivers/XmlTObjDrivers.hxx index d1c6c72ea0..dd2929d83f 100644 --- a/src/XmlTObjDrivers/XmlTObjDrivers.hxx +++ b/src/XmlTObjDrivers/XmlTObjDrivers.hxx @@ -30,7 +30,7 @@ class XmlTObjDrivers public: // ---------- PUBLIC METHODS ---------- - Standard_EXPORT static Handle(Standard_Transient) Factory + Standard_EXPORT static const Handle(Standard_Transient)& Factory (const Standard_GUID& aGUID); // Returns a driver corresponding to . Used for plugin. diff --git a/src/XmlXCAFDrivers/XmlXCAFDrivers.cdl b/src/XmlXCAFDrivers/XmlXCAFDrivers.cdl index 9294aaa553..00f8bc3922 100644 --- a/src/XmlXCAFDrivers/XmlXCAFDrivers.cdl +++ b/src/XmlXCAFDrivers/XmlXCAFDrivers.cdl @@ -33,6 +33,7 @@ is Factory (aGUID: GUID from Standard) returns Transient from Standard; + ---C++: return const & ---Purpose: Depending from the ID, returns a list of storage -- or retrieval attribute drivers. Used for plugin. -- diff --git a/src/XmlXCAFDrivers/XmlXCAFDrivers.cxx b/src/XmlXCAFDrivers/XmlXCAFDrivers.cxx index 85e9f92468..a74e0f40ae 100644 --- a/src/XmlXCAFDrivers/XmlXCAFDrivers.cxx +++ b/src/XmlXCAFDrivers/XmlXCAFDrivers.cxx @@ -25,7 +25,7 @@ static Standard_GUID XSStorageDriver ("f78ff496-a779-11d5-aab4-0050044b1af1"); static Standard_GUID XSRetrievalDriver("f78ff497-a779-11d5-aab4-0050044b1af1"); -Handle(Standard_Transient) XmlXCAFDrivers::Factory(const Standard_GUID& aGUID) +const Handle(Standard_Transient)& XmlXCAFDrivers::Factory(const Standard_GUID& aGUID) { if(aGUID == XSStorageDriver) { @@ -50,7 +50,4 @@ Handle(Standard_Transient) XmlXCAFDrivers::Factory(const Standard_GUID& aGUID) return XmlDrivers::Factory (aGUID); } -#ifdef _MSC_VER -#pragma warning(disable:4190) /* disable warning on C++ type returned by C function; should be OK for C++ usage */ -#endif PLUGIN(XmlXCAFDrivers)