Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1997-03-06 |
2 | // Created by: Mister rmi | |
3 | // Copyright (c) 1997-1999 Matra Datavision | |
973c2be1 | 4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e | 5 | // |
973c2be1 | 6 | // This file is part of Open CASCADE Technology software library. |
b311480e | 7 | // |
d5f74e42 | 8 | // This library is free software; you can redistribute it and/or modify it under |
9 | // the terms of the GNU Lesser General Public License version 2.1 as published | |
973c2be1 | 10 | // by the Free Software Foundation, with special exception defined in the file |
11 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT | |
12 | // distribution for complete text of the license and disclaimer of any warranty. | |
b311480e | 13 | // |
973c2be1 | 14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. | |
7fd59977 | 16 | |
42cf5bc1 | 17 | |
7fd59977 | 18 | #include <OSD_SharedLibrary.hxx> |
42cf5bc1 | 19 | #include <Plugin.hxx> |
7fd59977 | 20 | #include <Plugin_Failure.hxx> |
42cf5bc1 | 21 | #include <Plugin_MapOfFunctions.hxx> |
22 | #include <Resource_Manager.hxx> | |
23 | #include <Standard_GUID.hxx> | |
24 | #include <Standard_Transient.hxx> | |
7fd59977 | 25 | #include <TCollection_AsciiString.hxx> |
26 | ||
27 | static Standard_Character tc[1000]; | |
28 | static Standard_PCharacter thePluginId = tc; | |
29 | ||
30 | ||
31 | //======================================================================= | |
32 | //function : Load | |
33 | //purpose : | |
34 | //======================================================================= | |
b6c0b841 RL |
35 | Handle(Standard_Transient) Plugin::Load (const Standard_GUID& aGUID, |
36 | const Standard_Boolean theVerbose) | |
7fd59977 | 37 | { |
38 | ||
39 | aGUID.ToCString(thePluginId); | |
40 | TCollection_AsciiString pid(thePluginId); | |
41 | static Plugin_MapOfFunctions theMapOfFunctions; | |
42 | OSD_Function f; | |
43 | ||
44 | if(!theMapOfFunctions.IsBound(pid)) { | |
45 | ||
46 | Handle(Resource_Manager) PluginResource = new Resource_Manager("Plugin"); | |
47 | TCollection_AsciiString theResource(thePluginId); | |
48 | theResource += ".Location"; | |
49 | ||
50 | if(!PluginResource->Find(theResource.ToCString())) { | |
6fe96f84 | 51 | Standard_SStream aMsg; aMsg << "could not find the resource:"; |
52 | aMsg << theResource.ToCString() << endl; | |
53 | if (theVerbose) | |
54 | cout << "could not find the resource:" << theResource.ToCString() << endl; | |
9775fa61 | 55 | throw Plugin_Failure(aMsg.str().c_str()); |
7fd59977 | 56 | } |
57 | ||
58 | TCollection_AsciiString thePluginLibrary(""); | |
57c28b61 | 59 | #ifndef _WIN32 |
7fd59977 | 60 | thePluginLibrary += "lib"; |
61 | #endif | |
62 | thePluginLibrary += PluginResource->Value(theResource.ToCString()); | |
57c28b61 | 63 | #ifdef _WIN32 |
7fd59977 | 64 | thePluginLibrary += ".dll"; |
65 | #elif defined(__APPLE__) | |
66 | thePluginLibrary += ".dylib"; | |
67 | #elif defined (HPUX) || defined(_hpux) | |
68 | thePluginLibrary += ".sl"; | |
69 | #else | |
70 | thePluginLibrary += ".so"; | |
71 | #endif | |
72 | OSD_SharedLibrary theSharedLibrary(thePluginLibrary.ToCString()); | |
73 | if(!theSharedLibrary.DlOpen(OSD_RTLD_LAZY)) { | |
74 | TCollection_AsciiString error(theSharedLibrary.DlError()); | |
75 | Standard_SStream aMsg; aMsg << "could not open:"; | |
76 | aMsg << PluginResource->Value(theResource.ToCString()); | |
77 | aMsg << "; reason:"; | |
78 | aMsg << error.ToCString(); | |
b6c0b841 RL |
79 | if (theVerbose) |
80 | cout << "could not open: " << PluginResource->Value(theResource.ToCString())<< " ; reason: "<< error.ToCString() << endl; | |
9775fa61 | 81 | throw Plugin_Failure(aMsg.str().c_str()); |
7fd59977 | 82 | } |
83 | f = theSharedLibrary.DlSymb("PLUGINFACTORY"); | |
84 | if( f == NULL ) { | |
85 | TCollection_AsciiString error(theSharedLibrary.DlError()); | |
86 | Standard_SStream aMsg; aMsg << "could not find the factory in:"; | |
87 | aMsg << PluginResource->Value(theResource.ToCString()); | |
88 | aMsg << error.ToCString(); | |
9775fa61 | 89 | throw Plugin_Failure(aMsg.str().c_str()); |
7fd59977 | 90 | } |
91 | theMapOfFunctions.Bind(pid,f); | |
92 | } | |
93 | else | |
94 | f = theMapOfFunctions(pid); | |
95 | ||
ce8b059a | 96 | Standard_Transient* (*fp) (const Standard_GUID&) = NULL; |
97 | fp = (Standard_Transient* (*)(const Standard_GUID&)) f; | |
7fd59977 | 98 | Handle(Standard_Transient) theServiceFactory = (*fp) (aGUID); |
99 | return theServiceFactory; | |
100 | ||
101 | } |