00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_CIMServer.hpp"
00038 #include "OW_CIMValueCast.hpp"
00039 #include "OW_ConfigOpts.hpp"
00040 #include "OW_Format.hpp"
00041 #include "OW_WQLIFC.hpp"
00042 #include "OW_Assertion.hpp"
00043 #include "OW_CIMParamValue.hpp"
00044 #include "OW_CIMRepository.hpp"
00045 #include "OW_NoSuchProviderException.hpp"
00046 #include "OW_CIMValue.hpp"
00047 #include "OW_CIMProperty.hpp"
00048 #include "OW_CIMQualifierType.hpp"
00049 #include "OW_CIMQualifier.hpp"
00050 #include "OW_CIMMethod.hpp"
00051 #include "OW_CIMParameter.hpp"
00052 #include "OW_CIMObjectPath.hpp"
00053 #include "OW_CIMInstance.hpp"
00054 #include "OW_OperationContext.hpp"
00055 #include "OW_MutexLock.hpp"
00056 #include "OW_UserInfo.hpp"
00057 #include "OW_ResultHandlers.hpp"
00058 #include "OW_AuthorizerManager.hpp"
00059 #include "OW_ProviderEnvironmentIFC.hpp"
00060 #include "OW_ProviderManager.hpp"
00061 #include "OW_ServiceIFCNames.hpp"
00062
00063 #include <iterator>
00064
00065 namespace OW_NAMESPACE
00066 {
00067
00068 using namespace WBEMFlags;
00069
00071 namespace
00072 {
00073 const String COMPONENT_NAME("ow.owcimomd.CIMServer");
00074 const char* const DEPRECATED__NamespaceClassName = "__Namespace";
00075
00076 class AuthorizerEnabler
00077 {
00078 public:
00079 AuthorizerEnabler(const AuthorizerManagerRef& authorizerMgr,
00080 OperationContext& context, bool turnOff=false)
00081 : m_authorizerMgr(authorizerMgr)
00082 , m_context(context)
00083 {
00084 if (turnOff)
00085 {
00086 m_authorizerMgr->turnOff(m_context);
00087 }
00088 }
00089
00090 ~AuthorizerEnabler()
00091 {
00092 m_authorizerMgr->turnOn(m_context);
00093 }
00094
00095 private:
00096 AuthorizerManagerRef m_authorizerMgr;
00097 OperationContext& m_context;
00098 };
00099
00100 class ClonedCIMServerProviderEnvironment : public ProviderEnvironmentIFC
00101 {
00102 public:
00103 ClonedCIMServerProviderEnvironment(
00104 const ServiceEnvironmentIFCRef& env)
00105 : m_env(env)
00106 {}
00107 virtual String getConfigItem(const String &name,
00108 const String& defRetVal="") const
00109 {
00110 return m_env->getConfigItem(name, defRetVal);
00111 }
00112 virtual StringArray getMultiConfigItem(const String &itemName,
00113 const StringArray& defRetVal, const char* tokenizeSeparator = 0) const
00114 {
00115 return m_env->getMultiConfigItem(itemName, defRetVal, tokenizeSeparator);
00116 }
00117 virtual CIMOMHandleIFCRef getCIMOMHandle() const
00118 {
00119 return m_env->getCIMOMHandle(m_context,
00120 ServiceEnvironmentIFC::E_USE_PROVIDERS);
00121 }
00122
00123 virtual CIMOMHandleIFCRef getRepositoryCIMOMHandle() const
00124 {
00125 return m_env->getCIMOMHandle(m_context,
00126 ServiceEnvironmentIFC::E_BYPASS_PROVIDERS);
00127 }
00128
00129 virtual RepositoryIFCRef getRepository() const
00130 {
00131 return m_env->getRepository();
00132 }
00133 virtual LoggerRef getLogger() const
00134 {
00135 return m_env->getLogger(COMPONENT_NAME);
00136 }
00137 virtual LoggerRef getLogger(const String& componentName) const
00138 {
00139 return m_env->getLogger(componentName);
00140 }
00141 virtual String getUserName() const
00142 {
00143 return m_context.getUserInfo().getUserName();
00144 }
00145 virtual OperationContext& getOperationContext()
00146 {
00147 return m_context;
00148 }
00149 virtual ProviderEnvironmentIFCRef clone() const
00150 {
00151 return ProviderEnvironmentIFCRef(new ClonedCIMServerProviderEnvironment(m_env));
00152 }
00153 private:
00154 mutable OperationContext m_context;
00155 ServiceEnvironmentIFCRef m_env;
00156 };
00157
00158 class CIMServerProviderEnvironment : public ProviderEnvironmentIFC
00159 {
00160 public:
00161 CIMServerProviderEnvironment(OperationContext& context,
00162 const ServiceEnvironmentIFCRef& env)
00163 : m_context(context)
00164 , m_env(env)
00165 {}
00166 virtual String getConfigItem(const String &name,
00167 const String& defRetVal="") const
00168 {
00169 return m_env->getConfigItem(name, defRetVal);
00170 }
00171 virtual StringArray getMultiConfigItem(const String &itemName,
00172 const StringArray& defRetVal, const char* tokenizeSeparator = 0) const
00173 {
00174 return m_env->getMultiConfigItem(itemName, defRetVal, tokenizeSeparator);
00175 }
00176 virtual CIMOMHandleIFCRef getCIMOMHandle() const
00177 {
00178 return m_env->getCIMOMHandle(m_context,
00179 ServiceEnvironmentIFC::E_USE_PROVIDERS,
00180 ServiceEnvironmentIFC::E_NO_LOCKING);
00181 }
00182
00183 virtual CIMOMHandleIFCRef getRepositoryCIMOMHandle() const
00184 {
00185 return m_env->getCIMOMHandle(m_context,
00186 ServiceEnvironmentIFC::E_BYPASS_PROVIDERS,
00187 ServiceEnvironmentIFC::E_NO_LOCKING);
00188 }
00189
00190 virtual RepositoryIFCRef getRepository() const
00191 {
00192 return m_env->getRepository();
00193 }
00194 virtual LoggerRef getLogger() const
00195 {
00196 return m_env->getLogger(COMPONENT_NAME);
00197 }
00198 virtual LoggerRef getLogger(const String& componentName) const
00199 {
00200 return m_env->getLogger(componentName);
00201 }
00202 virtual String getUserName() const
00203 {
00204 return m_context.getUserInfo().getUserName();
00205 }
00206 virtual OperationContext& getOperationContext()
00207 {
00208 return m_context;
00209 }
00210 virtual ProviderEnvironmentIFCRef clone() const
00211 {
00212 return ProviderEnvironmentIFCRef(new ClonedCIMServerProviderEnvironment(m_env));
00213 }
00214 private:
00215 OperationContext& m_context;
00216 ServiceEnvironmentIFCRef m_env;
00217 };
00218
00219 inline ProviderEnvironmentIFCRef createProvEnvRef(OperationContext& context,
00220 const ServiceEnvironmentIFCRef& env)
00221 {
00222 return ProviderEnvironmentIFCRef(new CIMServerProviderEnvironment(context, env));
00223 }
00224
00225 inline void logOperation(const LoggerRef& lgr, const OperationContext& context, const char* operation, const String& ns, const String& objectName = String())
00226 {
00227
00228 ELogLevel level = lgr->getLogLevel();
00229 if (level == E_DEBUG_LEVEL || level == E_INFO_LEVEL)
00230 {
00231 String userString;
00232 String user = context.getStringDataWithDefault(OperationContext::USER_NAME);
00233 if (!user.empty())
00234 {
00235 userString = " for user: " + user;
00236 }
00237 String optObjectName;
00238 if (!objectName.empty())
00239 {
00240 optObjectName = ':' + objectName;
00241 }
00242 OW_LOG_INFO(lgr, Format("CIMServer doing operation: %1 on %2%3%4", operation, ns, optObjectName, userString));
00243 }
00244 }
00245 }
00246
00248 CIMServer::CIMServer(const ServiceEnvironmentIFCRef& env,
00249 const ProviderManagerRef& provManager,
00250 const RepositoryIFCRef& cimRepository,
00251 const AuthorizerManagerRef& authorizerMgr)
00252 : RepositoryIFC()
00253 , m_provManager(provManager)
00254 , m_nsClass_Namespace(CIMNULL)
00255 , m_env(env)
00256 , m_cimRepository(cimRepository)
00257 , m_realRepository(dynamic_pointer_cast<CIMRepository>(m_cimRepository))
00258 , m_authorizerMgr(authorizerMgr)
00259 , m_logger(env->getLogger(COMPONENT_NAME))
00260 {
00261 }
00263 CIMServer::~CIMServer()
00264 {
00265 try
00266 {
00267 close();
00268 }
00269 catch (...)
00270 {
00271
00272 }
00273 }
00275 void
00276 CIMServer::open(const String& path)
00277 {
00278 }
00280 void
00281 CIMServer::close()
00282 {
00283 }
00284
00286 String
00287 CIMServer::getName() const
00288 {
00289 return ServiceIFCNames::CIMServer;
00290 }
00291
00293 StringArray
00294 CIMServer::getDependencies() const
00295 {
00296 StringArray rv;
00297 rv.push_back(ServiceIFCNames::AuthorizerManager);
00298 rv.push_back(ServiceIFCNames::CIMRepository);
00299 rv.push_back(ServiceIFCNames::ProviderManager);
00300 return rv;
00301 }
00302
00304 void
00305 CIMServer::init(const ServiceEnvironmentIFCRef& env)
00306 {
00307
00308 }
00309
00311 void
00312 CIMServer::shutdown()
00313 {
00314 m_provManager = 0;
00315 m_env = 0;
00316 m_cimRepository = 0;
00317 m_realRepository = 0;
00318 m_authorizerMgr = 0;
00319 }
00321 void
00322 CIMServer::_checkNameSpaceAccess(OperationContext& context, const String& ns,
00323 Authorizer2IFC::EAccessType acType)
00324 {
00325 if (!m_authorizerMgr->allowAccessToNameSpace(m_env, ns, acType,
00326 context))
00327 {
00328 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00329 Format("Access to namespace %1 is not allowed", ns).c_str());
00330 }
00331 }
00332 #if !defined(OW_DISABLE_INSTANCE_MANIPULATION) && !defined(OW_DISABLE_NAMESPACE_MANIPULATION)
00333
00334 void
00335 CIMServer::createNameSpace(const String& ns,
00336 OperationContext& context)
00337 {
00338 if (!m_authorizerMgr->allowCreateNameSpace(
00339 m_env, ns, context))
00340 {
00341 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00342 Format("Creation of namespace %1 is not allowed",
00343 ns).c_str());
00344 }
00345
00346 logOperation(m_logger, context, "createNameSpace", ns);
00347 m_cimRepository->createNameSpace(ns,context);
00348 }
00350 void
00351 CIMServer::deleteNameSpace(const String& ns,
00352 OperationContext& context)
00353 {
00354 if (!m_authorizerMgr->allowDeleteNameSpace(
00355 m_env, ns, context))
00356 {
00357 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00358 Format("Deletion of namespace %1 is not allowed",
00359 ns).c_str());
00360 }
00361
00362 logOperation(m_logger, context, "deleteNameSpace", ns);
00363 m_cimRepository->deleteNameSpace(ns,context);
00364 }
00365 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00366
00367 void
00368 CIMServer::enumNameSpace(StringResultHandlerIFC& result,
00369 OperationContext& context)
00370 {
00371 if (!m_authorizerMgr->allowEnumNameSpace(
00372 m_env, context))
00373 {
00374 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00375 "Enumeration of namespaces is not allowed");
00376 }
00377
00378
00379 logOperation(m_logger, context, "enumNameSpace", String());
00380 m_cimRepository->enumNameSpace(result,context);
00381 }
00383 CIMQualifierType
00384 CIMServer::getQualifierType(const String& ns,
00385 const String& qualifierName,
00386 OperationContext& context)
00387 {
00388 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00389
00390 if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00391 {
00392 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00393 Format("Read of qualifier %1 is not allowed",
00394 qualifierName).c_str());
00395 }
00396
00397 logOperation(m_logger, context, "GetQualifier", ns, qualifierName);
00398 return m_cimRepository->getQualifierType(ns,qualifierName,context);
00399 }
00400 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00401
00402 void
00403 CIMServer::enumQualifierTypes(
00404 const String& ns,
00405 CIMQualifierTypeResultHandlerIFC& result,
00406 OperationContext& context)
00407 {
00408 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00409
00410 if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00411 {
00412 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00413 "Enumeration of qualifiers is not allowed");
00414 }
00415
00416 logOperation(m_logger, context, "EnumerateQualifiers", ns);
00417 m_cimRepository->enumQualifierTypes(ns,result,context);
00418 }
00420 void
00421 CIMServer::deleteQualifierType(const String& ns, const String& qualName,
00422 OperationContext& context)
00423 {
00424 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00425
00426 if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00427 Authorizer2IFC::E_DELETE, context))
00428 {
00429 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00430 Format("Deletion of qualifier %1 is not allowed",
00431 qualName).c_str());
00432 }
00433
00434 logOperation(m_logger, context, "DeleteQualifier", ns, qualName);
00435 m_cimRepository->deleteQualifierType(ns,qualName,context);
00436 }
00438 void
00439 CIMServer::setQualifierType(
00440 const String& ns,
00441 const CIMQualifierType& qt, OperationContext& context)
00442 {
00443 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00444
00445 if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00446 Authorizer2IFC::E_MODIFY, context))
00447 {
00448 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00449 Format("Modification of qualifier %1 is not allowed",
00450 qt.getName()).c_str());
00451 }
00452
00453 logOperation(m_logger, context, "SetQualifier", ns, qt.getName());
00454 m_cimRepository->setQualifierType(ns,qt,context);
00455 }
00456 #endif // #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00457
00458 CIMClass
00459 CIMServer::getClass(
00460 const String& ns, const String& className, ELocalOnlyFlag localOnly,
00461 EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00462 const StringArray* propertyList, OperationContext& context)
00463 {
00464 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00465
00466 if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00467 {
00468 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00469 Format("Read of class %1 is not allowed", className).c_str());
00470 }
00471
00472 logOperation(m_logger, context, "GetClass", ns, className);
00473 CIMClass theClass = _getNameSpaceClass(className);
00474 if (!theClass)
00475 {
00476 theClass = m_cimRepository->getClass(ns,className,localOnly,
00477 includeQualifiers,includeClassOrigin,propertyList,context);
00478 }
00479 return theClass;
00480 }
00482 CIMClass
00483 CIMServer::_instGetClass(const String& ns, const CIMName& className,
00484 ELocalOnlyFlag localOnly,
00485 EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00486 const StringArray* propertyList, OperationContext& context)
00487 {
00488 CIMClass theClass = _getNameSpaceClass(className);
00489 if (!theClass)
00490 {
00491 try
00492 {
00493 theClass = m_cimRepository->getClass(ns,className.toString(),localOnly,
00494 includeQualifiers,includeClassOrigin,propertyList,context);
00495 }
00496 catch (CIMException& e)
00497 {
00498 if (e.getErrNo() == CIMException::NOT_FOUND)
00499 {
00500 e.setErrNo(CIMException::INVALID_CLASS);
00501 }
00502 throw e;
00503 }
00504 }
00505 return theClass;
00506 }
00507 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00508
00509 CIMClass
00510 CIMServer::deleteClass(const String& ns, const String& className,
00511 OperationContext& context)
00512 {
00513 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00514
00515 if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00516 Authorizer2IFC::E_DELETE, context))
00517 {
00518 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00519 Format("Deletion of class %1 is not allowed",
00520 className).c_str());
00521 }
00522
00523 logOperation(m_logger, context, "DeleteClass", ns, className);
00524 return m_cimRepository->deleteClass(ns,className,context);
00525 }
00527 void
00528 CIMServer::createClass(const String& ns, const CIMClass& cimClass,
00529 OperationContext& context)
00530 {
00531 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00532
00533 if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00534 Authorizer2IFC::E_CREATE, context))
00535 {
00536 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00537 Format("Creation of class %1 is not allowed",
00538 cimClass.getName()).c_str());
00539 }
00540
00541 logOperation(m_logger, context, "GetClass", ns, cimClass.getName());
00542 if (cimClass.getName().equalsIgnoreCase(DEPRECATED__NamespaceClassName))
00543 {
00544 OW_THROWCIMMSG(CIMException::ALREADY_EXISTS,
00545 Format("Creation of class %1 is not allowed",
00546 cimClass.getName()).c_str());
00547 }
00548 m_cimRepository->createClass(ns,cimClass,context);
00549 }
00551 CIMClass
00552 CIMServer::modifyClass(
00553 const String& ns,
00554 const CIMClass& cc,
00555 OperationContext& context)
00556 {
00557 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00558
00559 if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00560 Authorizer2IFC::E_MODIFY, context))
00561 {
00562 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00563 Format("Modification of class %1 is not allowed",
00564 cc.getName()).c_str());
00565 }
00566
00567 logOperation(m_logger, context, "ModifyClass", ns, cc.getName());
00568 return m_cimRepository->modifyClass(ns,cc,context);
00569 }
00570 #endif // #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00571
00572 void
00573 CIMServer::enumClasses(const String& ns,
00574 const String& className,
00575 CIMClassResultHandlerIFC& result,
00576 EDeepFlag deep, ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers,
00577 EIncludeClassOriginFlag includeClassOrigin, OperationContext& context)
00578 {
00579 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00580
00581 if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00582 {
00583 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00584 "Enumeration of classes is not allowed");
00585 }
00586
00587 logOperation(m_logger, context, "EnumerateClasses", ns, className);
00588 m_cimRepository->enumClasses(ns,className,result,deep,localOnly,
00589 includeQualifiers,includeClassOrigin,context);
00590 }
00592 void
00593 CIMServer::enumClassNames(
00594 const String& ns,
00595 const String& className,
00596 StringResultHandlerIFC& result,
00597 EDeepFlag deep, OperationContext& context)
00598 {
00599 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00600
00601 if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00602 {
00603 OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00604 "Enumeration of class names is not allowed");
00605 }
00606
00607 logOperation(m_logger, context, "EnumerateClassNames", ns, className);
00608 m_cimRepository->enumClassNames(ns,className,result,deep,context);
00609 }
00611 namespace
00612 {
00613 class InstNameEnumerator : public CIMClassResultHandlerIFC
00614 {
00615 public:
00616 InstNameEnumerator(
00617 const String& ns_,
00618 CIMObjectPathResultHandlerIFC& result_,
00619 OperationContext& context_,
00620 const ServiceEnvironmentIFCRef& env_,
00621 CIMServer* server_)
00622 : ns(ns_)
00623 , result(result_)
00624 , context(context_)
00625 , m_env(env_)
00626 , server(server_)
00627 {}
00628 protected:
00629 virtual void doHandle(const CIMClass &cc)
00630 {
00631 LoggerRef lgr(m_env->getLogger(COMPONENT_NAME));
00632 if (lgr->getLogLevel() == E_DEBUG_LEVEL)
00633 {
00634 OW_LOG_DEBUG(lgr, Format("CIMServer InstNameEnumerator enumerated derived instance names: %1:%2", ns,
00635 cc.getName()));
00636 }
00637 server->_getCIMInstanceNames(ns, cc.getName(), cc, result, context);
00638 }
00639 private:
00640 String ns;
00641 CIMObjectPathResultHandlerIFC& result;
00642 OperationContext& context;
00643 const ServiceEnvironmentIFCRef& m_env;
00644 CIMServer* server;
00645 };
00646 }
00648 void
00649 CIMServer::enumInstanceNames(
00650 const String& ns,
00651 const String& className,
00652 CIMObjectPathResultHandlerIFC& result,
00653 EDeepFlag deep,
00654 OperationContext& context)
00655 {
00656 _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00657
00658 logOperation(m_logger, context, "EnumerateInstanceNames", ns, className);
00659
00660 InstNameEnumerator ie(ns, result, context, m_env, this);
00661 CIMClass theClass = _instGetClass(ns, className,E_NOT_LOCAL_ONLY,
00662 E_INCLUDE_QUALIFIERS,E_INCLUDE_CLASS_ORIGIN,0,context);
00663 ie.handle(theClass);
00664
00665 if (className.equalsIgnoreCase(DEPRECATED__NamespaceClassName)
00666 || !deep)
00667 {
00668 return;
00669 }
00670 else
00671 {
00672
00673
00674 m_cimRepository->enumClasses(ns,className,ie,deep,E_NOT_LOCAL_ONLY,
00675 E_INCLUDE_QUALIFIERS,E_INCLUDE_CLASS_ORIGIN,context);
00676 }
00677 }
00679
00680 void
00681 CIMServer::_getCIMInstanceNames(const String& ns, const CIMName& className,
00682 const CIMClass& theClass, CIMObjectPathResultHandlerIFC& result,
00683 OperationContext& context)
00684 {
00685 InstanceProviderIFCRef instancep = _getInstanceProvider(ns, theClass, context);
00686 if (instancep)
00687 {
00688 instancep->enumInstanceNames(createProvEnvRef(context, m_env),
00689 ns, className.toString(), result, theClass);
00690 }
00691 else
00692 {
00693 m_cimRepository->enumInstanceNames(ns,className.toString(),result,E_SHALLOW,context);
00694 }
00695 }
00697 namespace
00698 {
00699 class InstEnumerator : public CIMClassResultHandlerIFC
00700 {
00701 public:
00702 InstEnumerator(
00703 const String& ns_,
00704 CIMInstanceResultHandlerIFC& result_,
00705 OperationContext& context_,
00706 const ServiceEnvironmentIFCRef& env_,
00707 CIMServer* server_,
00708 EDeepFlag deep_,
00709 ELocalOnlyFlag localOnly_,
00710 EIncludeQualifiersFlag includeQualifiers_,
00711 EIncludeClassOriginFlag includeClassOrigin_,
00712 const StringArray* propertyList_,
00713 const CIMClass& theTopClass_)
00714 : ns(ns_)
00715 , result(result_)
00716 , context(context_)
00717 , m_env(env_)
00718 , server(server_)
00719 , deep(deep_)
00720 , localOnly(localOnly_)
00721 , includeQualifiers(includeQualifiers_)
00722 , includeClassOrigin(includeClassOrigin_)
00723 , propertyList(propertyList_)
00724 , theTopClass(theTopClass_)
00725 {}
00726 protected:
00727 virtual void doHandle(const CIMClass &cc)
00728 {
00729 LoggerRef lgr(m_env->getLogger(COMPONENT_NAME));
00730 if (lgr->getLogLevel() == E_DEBUG_LEVEL)
00731 {
00732 OW_LOG_DEBUG(lgr, Format("CIMServer InstEnumerator Enumerating"
00733 " derived instance names: %1:%2", ns, cc.getName()));
00734 }
00735 server->_getCIMInstances(ns, cc.getName(), theTopClass, cc,
00736 result, localOnly, deep, includeQualifiers,
00737 includeClassOrigin, propertyList, context);
00738 }
00739 private:
00740 String ns;
00741 CIMInstanceResultHandlerIFC& result;
00742 OperationContext& context;
00743 const ServiceEnvironmentIFCRef& m_env;
00744 CIMServer* server;
00745 EDeepFlag deep;
00746 ELocalOnlyFlag localOnly;
00747 EIncludeQualifiersFlag includeQualifiers;
00748 EIncludeClassOriginFlag includeClassOrigin;
00749 const StringArray* propertyList;
00750 const CIMClass& theTopClass;
00751 };
00752 }
00753
00755 void
00756 CIMServer::enumInstances(
00757 const String& ns,
00758 const String& className,
00759 CIMInstanceResultHandlerIFC& result, EDeepFlag deep,
00760 ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00761 const StringArray* propertyList, EEnumSubclassesFlag enumSubclasses,
00762 OperationContext&am