1 karl 1.7 //%2004////////////////////////////////////////////////////////////////////////
|
2 schuur 1.1 //
|
3 karl 1.7 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 schuur 1.1 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to
12 // deal in the Software without restriction, including without limitation the
13 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
14 // sell copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
|
16 karl 1.7 //
|
17 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
18 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
19 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
20 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
21 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 //
26 //==============================================================================
27 //
28 // Author: Chip Vincent (cvincent@us.ibm.com)
29 //
30 // Modified By:
31 // Nag Boranna, Hewlett-Packard Company(nagaraja_boranna@hp.com)
32 // Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com)
33 // Mike Day, IBM (mdday@us.ibm.com)
34 // Adrian Schuur, IBM (schuur@de.ibm.com)
35 //
36 //%/////////////////////////////////////////////////////////////////////////////
37
|
38 schuur 1.6 #include "CMPI_Version.h"
39
|
40 schuur 1.1 #include "CMPIProviderModule.h"
41
42 #include <Pegasus/Common/Destroyer.h>
43 #include <Pegasus/Common/FileSystem.h>
44 #include <Pegasus/Common/MessageLoader.h> //l10n
45 #include <Pegasus/Config/ConfigManager.h>
46 #include <Pegasus/ProviderManager2/CMPI/CMPIProvider.h>
47 #include <Pegasus/ProviderManager2/CMPI/CMPIProviderManager.h>
48
|
49 schuur 1.3 PEGASUS_USING_STD;
|
50 schuur 1.1 PEGASUS_NAMESPACE_BEGIN
51
|
52 schuur 1.6 CMPIProviderModule::CMPIProviderModule(const String & fileName)
|
53 schuur 1.1 : _fileName(fileName),
54 _ref_count(0),
55 _library(0)
56 {
|
57 schuur 1.6 genericProviderModule=0;
|
58 a.dunfey 1.5 #ifdef PEGASUS_OS_TYPE_WINDOWS
59 if (fileName[1] != ':')
60 #else
|
61 schuur 1.1 if (fileName[0]!='/')
|
62 a.dunfey 1.5 #endif
|
63 schuur 1.4 _fileName=ProviderManager::_resolvePhysicalName(fileName);
|
64 schuur 1.1 else _fileName=fileName;
65 }
66
67 CMPIProviderModule::~CMPIProviderModule(void)
68 {
69 }
70
71 ProviderVector CMPIProviderModule::load(const String & providerName)
72 {
|
73 schuur 1.6 if (!genericProviderModule)
|
74 schuur 1.1 _library = System::loadDynamicLibrary((const char *)_fileName.getCString());
75
76 if(_library == 0)
77 {
78
79 String s0 = "ProviderLoadFailure";
80 throw Exception(MessageLoaderParms("ProviderManager.CMPIProviderModule.CANNOT_LOAD_LIBRARY",
81 "$0 ($1:$2):Cannot load library, error: $3",
82 s0,
83 _fileName,
84 providerName,
85 System::dynamicLoadError()));
86 }
87
88 char symbolName[512];
89 CString mName=providerName.getCString();
90 ProviderVector miVector;
91 memset(&miVector,0,sizeof(ProviderVector));
92 int specificMode=0;
93
94 if ((miVector.createGenInstMI=(CREATE_GEN_INST_MI)
95 schuur 1.1 System::loadDynamicSymbol(_library,"_Generic_Create_InstanceMI"))) {
|
96 schuur 1.2 if (miVector.createGenInstMI)
97 miVector.miTypes|=CMPI_MIType_Instance;
|
98 schuur 1.1 miVector.genericMode=1;
99 }
100
101 strcpy(symbolName,(const char*)mName);
102 strcat(symbolName,"_Create_InstanceMI");
103 if ((miVector.createInstMI=(CREATE_INST_MI)
104 System::loadDynamicSymbol(_library,symbolName))) {
|
105 schuur 1.2 if (miVector.createInstMI)
106 miVector.miTypes|=CMPI_MIType_Instance;
|
107 schuur 1.1 specificMode=1;
108 }
109
110
111 if ((miVector.createGenAssocMI=(CREATE_GEN_ASSOC_MI)
112 System::loadDynamicSymbol(_library,"_Generic_Create_AssociationMI"))) {
|
113 schuur 1.2 if (miVector.createGenAssocMI)
114 miVector.miTypes|=CMPI_MIType_Association;
|
115 schuur 1.1 miVector.genericMode=1;
116 }
117
118 strcpy(symbolName,(const char*)mName);
119 strcat(symbolName,"_Create_AssociationMI");
120 if ((miVector.createAssocMI=(CREATE_ASSOC_MI)
121 System::loadDynamicSymbol(_library,symbolName))) {
|
122 schuur 1.2 if (miVector.createAssocMI)
123 miVector.miTypes|=CMPI_MIType_Association;
|
124 schuur 1.1 specificMode=1;
125 }
126
127
128 if ((miVector.createGenMethMI=(CREATE_GEN_METH_MI)
129 System::loadDynamicSymbol(_library,"_Generic_Create_MethodMI"))) {
|
130 schuur 1.2 if (miVector.createGenMethMI)
131 miVector.miTypes|=CMPI_MIType_Method;
|
132 schuur 1.1 miVector.genericMode=1;
133 }
134
135 strcpy(symbolName,(const char*)mName);
136 strcat(symbolName,"_Create_MethodMI");
137 if ((miVector.createMethMI=(CREATE_METH_MI)
138 System::loadDynamicSymbol(_library,symbolName))) {
|
139 schuur 1.2 if (miVector.createMethMI)
140 miVector.miTypes|=CMPI_MIType_Method;
|
141 schuur 1.1 specificMode=1;
142 }
143
144
145 if ((miVector.createGenPropMI=(CREATE_GEN_PROP_MI)
146 System::loadDynamicSymbol(_library,"_Generic_Create_PropertyMI"))) {
|
147 schuur 1.2 if (miVector.createGenPropMI)
148 miVector.miTypes|=CMPI_MIType_Property;
|
149 schuur 1.1 miVector.genericMode=1;
150 }
151
152 strcpy(symbolName,(const char*)mName);
153 strcat(symbolName,"_Create_PropertyMI");
154 if ((miVector.createPropMI=(CREATE_PROP_MI)
155 System::loadDynamicSymbol(_library,symbolName))) {
|
156 schuur 1.2 if (miVector.createPropMI)
157 miVector.miTypes|=CMPI_MIType_Property;
|
158 schuur 1.1 specificMode=1;
159 }
160
161
162 if ((miVector.createGenIndMI=(CREATE_GEN_IND_MI)
163 System::loadDynamicSymbol(_library,"_Generic_Create_IndicationMI"))) {
|
164 schuur 1.2 if (miVector.createGenIndMI)
165 miVector.miTypes|=CMPI_MIType_Indication;
|
166 schuur 1.1 miVector.genericMode=1;
167 }
168
169 strcpy(symbolName,(const char*)mName);
170 strcat(symbolName,"_Create_IndicationMI");
171 if ((miVector.createIndMI=(CREATE_IND_MI)
172 System::loadDynamicSymbol(_library,symbolName))) {
|
173 schuur 1.2 if (miVector.createIndMI)
174 miVector.miTypes|=CMPI_MIType_Indication;
|
175 schuur 1.1 specificMode=1;
176 }
177
178 if (miVector.miTypes==0) {
179 throw Exception("ProviderLoadFailure "+_fileName+":"+_providerName+
180 " Provider is a not CMPI style provider");
181 }
182
183 if (miVector.genericMode && specificMode) {
184 throw Exception("ProviderLoadFailure "+_fileName+":"+_providerName+
185 " onflicting generic/specfic CMPI style provider");
186 }
187
|
188 schuur 1.6 genericProviderModule=miVector.genericMode!=0;
|
189 schuur 1.1 _ref_count++;
190
191 return miVector;
192 }
193
194 void CMPIProviderModule::unloadModule(void)
195 {
196 _ref_count--;
197
198 if(_ref_count.value() > 0)
199 return;
200
201 _ref_count = 0;
202
|
203 schuur 1.6 if (_library != 0) {
204 if (genericProviderModule) return;
|
205 schuur 1.1 System::unloadDynamicLibrary(_library);
206 _library = 0;
207 }
208 }
209
210 PEGASUS_NAMESPACE_END
|