1 mike 1.1.2.1 //%2006////////////////////////////////////////////////////////////////////////
2 //
3 // 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 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
11 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 mike 1.1.2.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "EmbeddedServer.h"
35 #include <Pegasus/Common/Logger.h>
36 #include <Pegasus/Server/ProviderTable.h>
37 #include <Pegasus/Repository/MemoryResidentRepository.h>
38
39 PEGASUS_NAMESPACE_BEGIN
40
|
41 mike 1.1.2.3 //==============================================================================
42 //
43 // Local definitions:
44 //
45 //==============================================================================
46
47 extern void* (*lookupSymbolCallback)(
48 const char* path, const char* name, void* data);
49
50 extern void* lookupSymbolData;
51
52 struct Symbol
53 {
54 String path;
55 String name;
56 void* address;
57 Symbol* next;
58 };
59
60 struct EmbeddedServerRep
61 {
62 mike 1.1.2.3 MemoryResidentRepository* mrr;
63
64 static void initializeCallback(MemoryResidentRepository* mrr, void* data_)
65 {
66 EmbeddedServer* es = (EmbeddedServer*)data_;
67 EmbeddedServerRep* rep = (EmbeddedServerRep*)es->_opaque;
68 rep->mrr = mrr;
69 es->initialize();
70 rep->mrr = 0;
71 }
72
73 Symbol* symbols;
74 };
75
|
76 mike 1.1.2.1 static void _logCallback(
77 int type,
78 const char* system,
79 int level,
80 const char* message,
|
81 mike 1.1.2.3 void* data)
|
82 mike 1.1.2.1 {
|
83 mike 1.1.2.3 EmbeddedServer* es = (EmbeddedServer*)data;
|
84 mike 1.1.2.1 es->putLog(type, system, level, message);
85 }
86
|
87 mike 1.1.2.3 static void _saveCallback(const Buffer& buffer, void* data_)
|
88 mike 1.1.2.1 {
|
89 mike 1.1.2.3 EmbeddedServer* es = (EmbeddedServer*)data_;
|
90 mike 1.1.2.1
91 Array<Uint8> data((const Uint8*)buffer.getData(), buffer.size());
92 es->saveRepository(data);
93 }
94
|
95 mike 1.1.2.3 static void _loadCallback(Buffer& buffer, void* data_)
|
96 mike 1.1.2.1 {
|
97 mike 1.1.2.3 EmbeddedServer* es = (EmbeddedServer*)data_;
|
98 mike 1.1.2.1
99 buffer.clear();
100 Array<Uint8> data;
101 es->loadRepository(data);
102
103 if (data.size())
104 buffer.append((const char*)data.getData(), data.size());
105 }
106
|
107 mike 1.1.2.3 static void* _lookupSymbolCallback(
108 const char* path,
109 const char* name,
110 void* data)
111 {
112 EmbeddedServerRep* rep = (EmbeddedServerRep*)data;
113
114 for (Symbol* p = rep->symbols; p; p = p->next)
115 {
116 if (p->path == path && p->name == name)
117 return p->address;
118 }
119
120 // Not found!
121 return 0;
122 }
123
124 //==============================================================================
125 //
126 // class EmbeddedServer
127 //
128 mike 1.1.2.3 //==============================================================================
129
130 const Uint32 EmbeddedServer::INSTANCE_PROVIDER_TYPE = 1;
131 const Uint32 EmbeddedServer::ASSOCIATION_PROVIDER_TYPE = 2;
132 const Uint32 EmbeddedServer::INDICATION_PROVIDER_TYPE = 4;
133 const Uint32 EmbeddedServer::METHOD_PROVIDER_TYPE = 8;
134 const Uint32 EmbeddedServer::INSTANCE_QUERY_PROVIDER_TYPE = 16;
135
|
136 mike 1.1.2.1 EmbeddedServer::EmbeddedServer()
137 {
|
138 mike 1.1.2.3 // Initialize representation object:
139
140 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
141 memset(rep, 0, sizeof(EmbeddedServerRep));
142
|
143 mike 1.1.2.1 // Install the callbacks:
|
144 mike 1.1.2.3
|
145 mike 1.1.2.1 Logger::installLogCallback(_logCallback, this);
|
146 mike 1.1.2.3
|
147 mike 1.1.2.1 MemoryResidentRepository::installSaveCallback(_saveCallback, this);
|
148 mike 1.1.2.3
|
149 mike 1.1.2.1 MemoryResidentRepository::installLoadCallback(_loadCallback, this);
|
150 mike 1.1.2.3
151 MemoryResidentRepository::installInitializeCallback(
152 EmbeddedServerRep::initializeCallback, this);
153
154 lookupSymbolCallback = _lookupSymbolCallback;
155 lookupSymbolData = rep;
|
156 mike 1.1.2.1 }
157
158 EmbeddedServer::~EmbeddedServer()
159 {
160 }
161
|
162 mike 1.1.2.3 void EmbeddedServer::initialize()
163 {
164 }
165
|
166 mike 1.1.2.4 #if 0
|
167 mike 1.1.2.1 Boolean EmbeddedServer::addProvider(
168 const String& moduleName,
169 const String& providerName,
170 const CIMNamespaceName& nameSpace,
171 const CIMName& className,
172 CIMProvider* (*createProvider)(const String& providerName))
173 {
174 if (providerTableSize == MAX_PROVIDER_TABLE_SIZE)
175 return false;
176
177 ProviderTableEntry entry;
178 entry.moduleName = strdup(moduleName.getCString());
179 entry.providerName = strdup(providerName.getCString());
180 entry.nameSpace = strdup(nameSpace.getString().getCString());
181 entry.className = strdup(className.getString().getCString());
182 entry.createProvider = createProvider;
183
184 providerTable[providerTableSize++] = entry;
185
186 return true;
187 }
|
188 mike 1.1.2.4 #endif
|
189 mike 1.1.2.1
|
190 mike 1.1.2.2 Boolean EmbeddedServer::addNameSpace(const SchemaNameSpace* nameSpace)
|
191 mike 1.1.2.1 {
|
192 mike 1.1.2.2 return MemoryResidentRepository::addNameSpace(nameSpace);
|
193 mike 1.1.2.1 }
194
195 void EmbeddedServer::loadRepository(Array<Uint8>& data)
196 {
197 // No implementation!
198 }
199
200 void EmbeddedServer::saveRepository(const Array<Uint8>& data)
201 {
202 // No implementation!
203 }
204
205 void EmbeddedServer::putLog(
206 int type,
207 const char* system,
208 int level,
209 const char* message)
210 {
211 // No implementation!
212 }
213
214 mike 1.1.2.1 extern "C" int PegasusServerMain(int argc, char** argv);
215
216 Boolean EmbeddedServer::run(int argc, char** argv)
217 {
218 try
219 {
220 PegasusServerMain(argc, argv);
221 return true;
222 }
223 catch (...)
224 {
225 return false;
226 }
227
228 return true;
229 }
230
|
231 mike 1.1.2.8 static Boolean _providerModuleInstanceExists(
|
232 mike 1.1.2.3 MemoryResidentRepository* mrr,
233 const String& name)
234 {
235 try
236 {
237 CIMObjectPath cop;
238 Array<CIMKeyBinding> bindings;
239 bindings.append(CIMKeyBinding("Name", name, CIMKeyBinding::STRING));
240 cop.setClassName("PG_ProviderModule");
241 cop.setKeyBindings(bindings);
242
243 CIMInstance ci = mrr->getInstance(true,
244 "root/PG_InterOp", cop, true, false, false, CIMPropertyList());
245
246 return true;
247 }
248 catch (...)
249 {
250 return false;
251 }
252
253 mike 1.1.2.3 return false;
254 }
255
|
256 mike 1.1.2.8 static Boolean _providerInstanceExists(
|
257 mike 1.1.2.3 MemoryResidentRepository* mrr,
258 const String& providerModuleName,
259 const String& name)
260 {
261 try
262 {
263 CIMObjectPath cop;
264 Array<CIMKeyBinding> bindings;
265 bindings.append(CIMKeyBinding("Name", name, CIMKeyBinding::STRING));
266 bindings.append(CIMKeyBinding(
267 "ProviderModuleName", providerModuleName, CIMKeyBinding::STRING));
268 cop.setClassName("PG_Provider");
269 cop.setKeyBindings(bindings);
270
271 CIMInstance ci = mrr->getInstance(true,
272 "root/PG_InterOp", cop, true, false, false, CIMPropertyList());
273
274 return true;
275 }
276 catch (...)
277 {
278 mike 1.1.2.3 return false;
279 }
280
281 return false;
282 }
283
|
284 mike 1.1.2.8 Boolean EmbeddedServer::registerProviderModule(
|
285 mike 1.1.2.3 const String& moduleName,
286 const String& location,
287 ProviderInterface providerInterface)
288 {
289 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
290
291 // Reject if repository is null at this point.
292
293 if (!rep->mrr)
294 return false;
295
296 //
297 // Create instance of PG_ProviderModule:
298 //
299 // instance of PG_ProviderModule
300 // {
301 // Name = "...";
302 // Vendor = "OpenPegasus";
303 // Version = "2.5.0";
304 // InterfaceType = "C++Default";
305 // InterfaceVersion = "2.5.0";
306 mike 1.1.2.3 // Location = "cimplePerson";
307 // };
308 //
309
310 CIMInstance ci("PG_ProviderModule");
311 ci.addProperty(CIMProperty("Name", moduleName));
312 ci.addProperty(CIMProperty("Vendor", String("OpenPegasus")));
313
314 String version;
315 String interfaceType;
316 String interfaceVersion;
317
318 if (providerInterface == PEGASUS_PROVIDER_INTERFACE)
319 {
320 version = "2.6.0";
321 interfaceType = "C++Default";
322 interfaceVersion = "2.6.0";
323 }
324 else
325 {
326 version = "2.0.0";
327 mike 1.1.2.3 interfaceType = "CMPI";
328 interfaceVersion = "2.0.0";
329 }
330
331 ci.addProperty(CIMProperty("Version", version));
332 ci.addProperty(CIMProperty("InterfaceType", interfaceType));
333 ci.addProperty(CIMProperty("InterfaceVersion", interfaceVersion));
334 ci.addProperty(CIMProperty("Location", location));
335
336 try
337 {
338 CIMObjectPath cop = rep->mrr->createInstance(
339 false, "root/PG_InterOp", ci, ContentLanguageList());
340 }
341 catch (Exception& e)
342 {
343 return false;
344 }
345 catch (...)
346 {
347 return false;
348 mike 1.1.2.3 }
349
350 return true;
351 }
352
|
353 mike 1.1.2.8 Boolean EmbeddedServer::registerProvider(
|
354 mike 1.1.2.3 const String& moduleName,
355 const String& providerName)
356 {
357 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
358
359 // Reject if repository is null at this point.
360
361 if (!rep->mrr)
362 return false;
363
364 // Reject if provider module does not exist:
365
366 if (!_providerModuleInstanceExists(rep->mrr, moduleName))
367 return false;
368
369 //
370 // Create instance of PG_ProviderModule:
371 //
372 // instance of PG_Provider
373 // {
374 // Name = "Person_Provider";
375 mike 1.1.2.3 // ProviderModuleName = "Person_Module";
376 // };
377 //
378
379 CIMInstance ci("PG_Provider");
380 ci.addProperty(CIMProperty("Name", providerName));
381 ci.addProperty(CIMProperty("ProviderModuleName", moduleName));
382
383 try
384 {
385 CIMObjectPath cop = rep->mrr->createInstance(
386 false, "root/PG_InterOp", ci, ContentLanguageList());
387 }
388 catch (Exception& e)
389 {
390 return false;
391 }
392 catch (...)
393 {
394 return false;
395 }
396 mike 1.1.2.3
397 return true;
398 }
399
|
400 mike 1.1.2.8 Boolean EmbeddedServer::registerProviderCapabilities(
|
401 mike 1.1.2.3 const String& moduleName,
402 const String& providerName,
403 const String& capabilityId,
404 const CIMName& className,
405 const Array<CIMNamespaceName>& nameSpaces,
406 Uint32 providerTypes)
407 {
408 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
409
410 // Reject if repository is null at this point.
411
412 if (!rep->mrr)
413 return false;
414
415 // Reject if provider module instance does not exist:
416
417 if (!_providerModuleInstanceExists(rep->mrr, moduleName))
418 return false;
419
420 // Reject if provider instance does not exist:
421
422 mike 1.1.2.3 if (!_providerInstanceExists(rep->mrr, moduleName, providerName))
423 return false;
424
425 // Validate the namespaces:
426 {
427 if (nameSpaces.size() == 0)
428 return false;
429
430 Array<CIMNamespaceName> tmp;
431
432 try
433 {
434 tmp = rep->mrr->enumerateNameSpaces(false);
435 }
436 catch (...)
437 {
438 return false;
439 }
440
441 for (Uint32 i = 0; i < nameSpaces.size(); i++)
442 {
|
443 mike 1.1.2.8 Boolean found = false;
|
444 mike 1.1.2.3
445 for (Uint32 j = 0; j < tmp.size(); j++)
446 {
447 if (nameSpaces[i] == tmp[j])
448 {
449 found = true;
450 break;
451 }
452 }
453
454 if (!found)
455 return false;
456 }
457 }
458
459 //
460 // Create instance of PG_ProviderCapabilities:
461 //
462 // instance of PG_ProviderCapabilities
463 // {
464 // CapabilityID = "Person";
465 mike 1.1.2.3 // ProviderModuleName = "Person_Module";
466 // ProviderName = "Person_Provider";
467 // ClassName = "Person";
468 // Namespaces = {"root/cimv2"};
469 // ProviderType = {2};
470 // supportedProperties = NULL;
471 // supportedMethods = NULL;
472 // };
473 //
474 CIMInstance ci("PG_ProviderCapabilities");
475
476 // PG_ProviderCapabilities.CapabilityID:
477 ci.addProperty(CIMProperty("CapabilityID", capabilityId));
478
479 // PG_ProviderCapabilities.ProviderModuleName:
480 ci.addProperty(CIMProperty("ProviderModuleName", moduleName));
481
482 // PG_ProviderCapabilities.ProviderName:
483 ci.addProperty(CIMProperty("ProviderName", providerName));
484
485 // PG_ProviderCapabilities.ClassName:
486 mike 1.1.2.3 ci.addProperty(CIMProperty("ClassName", className.getString()));
487
488 // PG_ProviderCapabilities.NameSpaces:
489 {
490 Array<String> tmp;
491
492 for (Uint32 i = 0; i < nameSpaces.size(); i++)
493 tmp.append(nameSpaces[i].getString());
494
495 ci.addProperty(CIMProperty("Namespaces", tmp));
496 }
497
498 // PG_ProviderCapabilities.supportedProperties:
499 ci.addProperty(
500 CIMProperty("supportedProperties", CIMValue(CIMTYPE_STRING, true)));
501
502 // PG_ProviderCapabilities.supportedMethods:
503 ci.addProperty(
504 CIMProperty("supportedMethods", CIMValue(CIMTYPE_STRING, true)));
505
506 // PG_ProviderCapabilities.Namespaces:
507 mike 1.1.2.3 {
508 Array<Uint16> tmp;
509
510 if (providerTypes & EmbeddedServer::INSTANCE_PROVIDER_TYPE)
511 tmp.append(2);
512
513 if (providerTypes & EmbeddedServer::ASSOCIATION_PROVIDER_TYPE)
514 tmp.append(3);
515
516 if (providerTypes & EmbeddedServer::INDICATION_PROVIDER_TYPE)
517 tmp.append(4);
518
519 if (providerTypes & EmbeddedServer::METHOD_PROVIDER_TYPE)
520 tmp.append(5);
521
522 if (providerTypes & EmbeddedServer::INSTANCE_QUERY_PROVIDER_TYPE)
523 tmp.append(7);
524
525 ci.addProperty(CIMProperty("ProviderType", tmp));
526 }
527
528 mike 1.1.2.3 // Create the instance:
529 try
530 {
531 CIMObjectPath cop = rep->mrr->createInstance(
532 false, "root/PG_InterOp", ci, ContentLanguageList());
533 }
534 catch (Exception& e)
535 {
536 return false;
537 }
538 catch (...)
539 {
540 return false;
541 }
542
543 return true;
544 }
545
|
546 mike 1.1.2.8 Boolean EmbeddedServer::registerSingletonProvider(
|
547 mike 1.1.2.3 const Array<CIMNamespaceName>& nameSpaces,
548 const CIMName& className,
549 ProviderInterface providerInterface,
550 Uint32 providerTypes)
551 {
552 // Register PG_ProviderModule:
553
|
554 mike 1.1.2.9 String moduleName = className.getString() + "_Module";
|
555 mike 1.1.2.3 String location = moduleName;
556
557 if (!registerProviderModule(moduleName, location, providerInterface))
558 {
559 return false;
560 }
561
562 // Register PG_Provider:
563
|
564 mike 1.1.2.9 String providerName = className.getString() + "_Provider";
|
565 mike 1.1.2.3
566 if (!registerProvider(moduleName, providerName))
567 {
568 return false;
569 }
570
571 // Register PG_ProviderCapabilities:
572
573
|
574 mike 1.1.2.9 String capabilityId = className.getString();
|
575 mike 1.1.2.3
576 if (!registerProviderCapabilities(moduleName, providerName, capabilityId,
577 className, nameSpaces, providerTypes))
578 {
579 return false;
580 }
581
582 return true;
583 }
584
|
585 mike 1.1.2.8 static Boolean _addSymbol(
|
586 mike 1.1.2.6 EmbeddedServerRep* rep,
|
587 mike 1.1.2.3 const String& path,
588 const String& name,
589 void* address)
590 {
591
592 if (_lookupSymbolCallback(path.getCString(), name.getCString(), rep))
593 return false;
594
595 Symbol* symbol = new Symbol;
596 symbol->path = path;
597 symbol->name = name;
598 symbol->address = address;
599
600 symbol->next = rep->symbols;
601 rep->symbols = symbol;
602
603 return true;
604 }
605
|
606 mike 1.1.2.8 Boolean EmbeddedServer::registerPegasusProviderEntryPoint(
|
607 mike 1.1.2.6 const String& location,
608 class CIMProvider* (*entryPoint)(const String&))
609 {
610 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
611
612 return _addSymbol(
613 rep, location, "PegasusCreateProvider", (void*)entryPoint);
614 }
615
|
616 mike 1.1.2.7 #ifdef PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER
617
|
618 mike 1.1.2.8 Boolean EmbeddedServer::registerCMPIProviderEntryPoint(
|
619 mike 1.1.2.7 const String& location,
620 const String& providerName,
621 CreateInstanceMIEntryPoint entryPoint)
622 {
623 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
624 String name = providerName + "_Create_InstanceMI";
625 return _addSymbol(rep, location, name, (void*)entryPoint);
626 }
627
|
628 mike 1.1.2.8 Boolean EmbeddedServer::registerCMPIProviderEntryPoint(
|
629 mike 1.1.2.7 const String& location,
630 const String& providerName,
631 CreateAssociationMIEntryPoint entryPoint)
632 {
633 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
634 String name = providerName + "_Create_AssociationMI";
635 return _addSymbol(rep, location, name, (void*)entryPoint);
636 }
637
|
638 mike 1.1.2.8 Boolean EmbeddedServer::registerCMPIProviderEntryPoint(
|
639 mike 1.1.2.7 const String& location,
640 const String& providerName,
641 CreateMethodMIEntryPoint entryPoint)
642 {
643 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
644 String name = providerName + "_Create_MethodMI";
645 return _addSymbol(rep, location, name, (void*)entryPoint);
646 }
647
|
648 mike 1.1.2.8 Boolean EmbeddedServer::registerCMPIProviderEntryPoint(
|
649 mike 1.1.2.7 const String& location,
650 const String& providerName,
651 CreateIndicationMIEntryPoint entryPoint)
652 {
653 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
654 String name = providerName + "_Create_IndicationMI";
655 return _addSymbol(rep, location, name, (void*)entryPoint);
656 }
657
|
658 mike 1.1.2.8 Boolean EmbeddedServer::registerCMPIProviderEntryPoint(
|
659 mike 1.1.2.7 const String& location,
660 const String& providerName,
661 CreatePropertyMIEntryPoint entryPoint)
662 {
663 EmbeddedServerRep* rep = (EmbeddedServerRep*)_opaque;
664 String name = providerName + "_Create_PropertyMI";
665 return _addSymbol(rep, location, name, (void*)entryPoint);
666 }
667
668 #endif /* PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER */
669
|
670 mike 1.1.2.1 PEGASUS_NAMESPACE_END
|