(file) Return to EmbeddedServer.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Server

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2