0024023: Revamp the OCCT Handle -- plugin
authorabv <abv@opencascade.com>
Mon, 29 Jun 2015 06:17:43 +0000 (09:17 +0300)
committerabv <abv@opencascade.com>
Sat, 11 Jul 2015 09:08:04 +0000 (12:08 +0300)
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.

20 files changed:
src/BinDrivers/BinDrivers.cdl
src/BinDrivers/BinDrivers.cxx
src/BinLDrivers/BinLDrivers.cdl
src/BinLDrivers/BinLDrivers.cxx
src/BinTObjDrivers/BinTObjDrivers.cxx
src/BinTObjDrivers/BinTObjDrivers.hxx
src/BinXCAFDrivers/BinXCAFDrivers.cdl
src/BinXCAFDrivers/BinXCAFDrivers.cxx
src/FWOSDriver/FWOSDriver.cdl
src/FWOSDriver/FWOSDriver.cxx
src/Plugin/Plugin.cxx
src/Plugin/Plugin_Macro.hxx
src/XmlDrivers/XmlDrivers.cdl
src/XmlDrivers/XmlDrivers.cxx
src/XmlLDrivers/XmlLDrivers.cdl
src/XmlLDrivers/XmlLDrivers.cxx
src/XmlTObjDrivers/XmlTObjDrivers.cxx
src/XmlTObjDrivers/XmlTObjDrivers.hxx
src/XmlXCAFDrivers/XmlXCAFDrivers.cdl
src/XmlXCAFDrivers/XmlXCAFDrivers.cxx

index 7a6e220a004075cc485ba43ffa2000bcce078cbb..032646655b2b128adaaf48ca450226591bdffce6 100644 (file)
@@ -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;
index 6fe301780ed9f21a9950240f05d2109e6d903f55..9a28772953c0465749ab85fa90fd63e8a8a9c64f 100644 (file)
@@ -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)
index 05dfa4c57b5a10269a5af812df879360e07afae1..d97484c2db36702df6f27d30b763d6717a523639 100644 (file)
@@ -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;
index ef1efd164dcfaee51de83cb4e116d41300fcc650..5a54f0c578a93adf78038cbee8996645e97d0ad6 100644 (file)
@@ -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)
index 05528381a1951fcbd67f46cec0226010d69f9666..6385c8a5055bc4264a9037e4c3185fbebe508cdf 100644 (file)
@@ -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)
index 499a6eac46ed2cf437637611e2ad762d9e8a0714..e59f45421a1976bfd19ab05631ca09eb690b0def 100644 (file)
@@ -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 <aGUID>. Used for plugin.
 
index 82c487f89e23a9c7b49421d20b3b3311e9ce4f24..a574377ab9d62c77c52437fdd9e92032ce79586b 100644 (file)
@@ -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;
index 6f6aeac8b89c4ac11f22a0196e4d5d8a4fd5a7ed..59d62c2c00b4e2fe366c15f587b6b5b862942aa7 100644 (file)
@@ -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)
index 5e863ce6b0288c5854c2267f7bc4bf184987ea38..84fbdc7c19eba69fb188a5205ec3d3c706234f7a 100644 (file)
@@ -26,4 +26,6 @@ is
     Factory(aGUID: GUID from Standard)
     returns Transient from Standard;
     ---Purpose: returns a DriverFactory.
+    ---C++: return const&
+
 end FWOSDriver;
index cb9f3c96027242bc795c2bf09469e25a22a470ea..28d7cd6985601b4d516ef93407aa6a3fdeb6b507 100644 (file)
 
 #include <Plugin_Macro.hxx>
 
-#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;
index ab5ab0bf2bad5d7fb1a2cfcbfa866bac2ae5a260..8d406becc0f5be82030f13be15c6cbea8747014f 100644 (file)
@@ -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;
   
index df0b2cb1d86c09c0a2540ce8cb4357a93ae71a75..db9e281f73f21c8faadc629fbef5d729391f78ef 100644 (file)
 #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<Standard_Transient*>(name::Factory(aGUID).get()); \
+}
                                        
 
 #endif
index d66df5fc7a02eb83687f3be66920bd186a983ed3..a50a6e265eea9d5d32e481852d947e65ee9e0e02 100644 (file)
@@ -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;
index 27e94e64b0e3b83a75168d2c504c3b2ce07b89a9..9f9036ac05aad974cbb9ef34706660a3315e45f0 100644 (file)
@@ -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)
index 979c852f999c706e4da0d12dec6910df356b2d5f..0e4af2c2f1a165e1c40e4ed980fa7d99cdbd0008 100644 (file)
@@ -35,6 +35,7 @@ is
     imported SequenceOfNamespaceDef;
 
     Factory (theGUID : GUID from Standard) returns Transient from Standard;
+    ---C++: return const &
 
     CreationDate returns AsciiString from TCollection;
 
index d951f27a46cda9564179e21f132b4050b72b959d..341ee134de65b5869240fa55b5fa296b5faabf6c 100644 (file)
@@ -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)
index 7d8f33d692c0f242563006a4679e8e5e573f6c34..443f1f4bfccd63d5867a7fda59d412eb3e41fa9e 100644 (file)
@@ -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)
index d1c6c72ea0ee6c6996171e4300346b95dc5582c1..dd2929d83fd30f13dc7973219c84d63b03556c04 100644 (file)
@@ -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 <aGUID>. Used for plugin.
 
index 9294aaa55347ee935bdaea690499a732b406d242..00f8bc3922f2cc7fecdbc9eeef06aaa401122121 100644 (file)
@@ -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.
         --          
index 85e9f9246888828dc6e6d0d9b5242cde9ccd15f5..a74e0f40ae1a194069cfe3eb1824915b6ac2fd5a 100644 (file)
@@ -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)