Added headers
[tpot/pegasus/.git] / src / Pegasus / Server / ProviderTable.cpp
1 //%/////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM\r
4 //\r
5 // Permission is hereby granted, free of charge, to any person obtaining a copy\r
6 // of this software and associated documentation files (the "Software"), to \r
7 // deal in the Software without restriction, including without limitation the \r
8 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or \r
9 // sell copies of the Software, and to permit persons to whom the Software is\r
10 // furnished to do so, subject to the following conditions:\r
11 // \r
12 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN \r
13 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED\r
14 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\r
15 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR \r
16 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \r
17 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN \r
18 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
19 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
20 //\r
21 //==============================================================================\r
22 //\r
23 // Author: Mike Brasher (mbrasher@bmc.com)\r
24 //\r
25 // Modified By:\r
26 //\r
27 //%/////////////////////////////////////////////////////////////////////////////\r
28 \r
29 #include <stdlib.h>\r
30 #include <Pegasus/Common/Destroyer.h>\r
31 #include <Pegasus/Common/System.h>\r
32 #include "ProviderTable.h"\r
33 \r
34 PEGASUS_NAMESPACE_BEGIN\r
35 \r
36 ProviderTable::ProviderTable()\r
37 {\r
38 \r
39 }\r
40 \r
41 CIMProvider* ProviderTable::lookupProvider(const String& providerId)\r
42 {\r
43     for (Uint32 i = 0, n = _providers.size(); i < n; i++)\r
44         if (String::equal(_providers[i].providerId, providerId))\r
45             return _providers[i].provider;\r
46 \r
47     return 0;\r
48 }\r
49 \r
50 typedef CIMProvider* (*CreateProviderFunc)();\r
51 \r
52 CIMProvider* ProviderTable::loadProvider(const String& providerId)\r
53 {\r
54     // Load the dynamic library:\r
55 \r
56 #ifdef PEGASUS_OS_TYPE_WINDOWS\r
57     ArrayDestroyer<char> libraryName = providerId.allocateCString();\r
58 #else\r
59     String unixLibName = getenv("PEGASUS_HOME");\r
60     unixLibName += "/lib/lib";\r
61     unixLibName += providerId;\r
62     unixLibName += ".so";\r
63     ArrayDestroyer<char> libraryName = unixLibName.allocateCString();\r
64 #endif\r
65 \r
66     DynamicLibraryHandle libraryHandle = \r
67         System::loadDynamicLibrary(libraryName.getPointer());\r
68 \r
69     if (!libraryHandle)\r
70         throw DynamicLoadFailed(libraryName.getPointer());\r
71 \r
72     // Lookup the create provider symbol:\r
73 \r
74     String tmp = "PegasusCreateProvider_";\r
75     tmp.append(providerId);\r
76     ArrayDestroyer<char> functionName = tmp.allocateCString();\r
77 \r
78     CreateProviderFunc func = (CreateProviderFunc)System::loadDynamicSymbol(\r
79         libraryHandle, functionName.getPointer());\r
80 \r
81     if (!func)\r
82         throw DynamicLookupFailed(functionName.getPointer());\r
83 \r
84     // Create the provider:\r
85 \r
86     CIMProvider* provider = func();\r
87 \r
88     if (!provider)\r
89         throw CreateProviderReturnedNull(\r
90             libraryName.getPointer(), functionName.getPointer());\r
91 \r
92     if (provider)\r
93     {\r
94         Entry entry;\r
95         entry.providerId = providerId;\r
96         entry.provider = provider;\r
97         _providers.append(entry);\r
98     }\r
99 \r
100     return provider;\r
101 }\r
102 \r
103 PEGASUS_NAMESPACE_END\r