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

   1 karl  1.12 //%2004////////////////////////////////////////////////////////////////////////
   2 karl  1.1  //
   3 karl  1.12 // 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 karl  1.3  // IBM Corp.; EMC Corporation, The Open Group.
   7 karl  1.12 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9 karl  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.3  // 
  17 karl  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: Karl Schopmeyer (k.schopmeyer@opengroup.org)
  29            //
  30            // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
  31            //                (carolann_graves@hp.com)
  32 karl  1.8  //              Karl Schopmeyer - Created Cim_Namespace capabilities.
  33            //              Karl Schopmeyer - added objectmanager and communication classes
  34 karl  1.1  //
  35            //%////////////////////////////////////////////////////////////////////////////
  36            
  37            
  38            ///////////////////////////////////////////////////////////////////////////////
  39 karl  1.5  //  Interop Provider - This provider services those classes from the
  40            //  DMTF Interop schema association with the CIMOM itself
  41 karl  1.1  //
  42 karl  1.5  //  This provider services the following classes:
  43            //      CIMObjectManager
  44            //      CIM_ObjectManagerCommunicationMechanism
  45            //      CIM_CIMXMLCommunicationMechanism
  46            //      CIM_ProtocolAdapter
  47 karl  1.8  //      CIM_Namespace (Effective Pegasus 2.4 we use PG_Namespace which
  48            //      is a subclass of CIM_Namespace with additional properties for
  49            //      shared namespaces.
  50 karl  1.5  //      
  51            //      It also services the Interop associations tied to these classes
  52            //      including:
  53            //      CIM_NamespaceInManager
  54            //      ...
  55 karl  1.11 //      This is a control provider and as such uses the Tracer functions
  56            //      for data and function traces.  Since we do not expect high volume
  57            //      use we added a number of traces to help diagnostics.  
  58 karl  1.1  ///////////////////////////////////////////////////////////////////////////////
  59 karl  1.11 /* TODO LIST:
  60                1. Finish the association functions
  61                
  62                2. UUID generation should become a system function since it will be used
  63                   by many providers, etc. as part of id generation.
  64                   
  65                3. Review the key parameters on create, etc. to be sort out which are
  66                   required from user and which we can supply.  I think we are asking too
  67                   much of the user right now.
  68 tony  1.6  */
  69 karl  1.1  
  70            #include <Pegasus/Common/Config.h>
  71            #include <Pegasus/Common/PegasusVersion.h>
  72            
  73            #include <cctype>
  74            #include <iostream>
  75            
  76            #include "InteropProvider.h"
  77 tony  1.6  #include "Guid.h"
  78 karl  1.1  #include <Pegasus/Common/String.h>
  79            #include <Pegasus/Common/System.h>
  80            #include <Pegasus/Common/ArrayInternal.h>
  81            #include <Pegasus/Common/CIMName.h>
  82            #include <Pegasus/Common/CIMType.h>
  83            #include <Pegasus/Common/CIMInstance.h>
  84            #include <Pegasus/Common/CIMObjectPath.h>
  85            #include <Pegasus/Common/InternalException.h>
  86            #include <Pegasus/Common/CIMStatusCode.h>
  87            #include <Pegasus/Common/Tracer.h>
  88            #include <Pegasus/Common/OperationContext.h>
  89            #include <Pegasus/Config/ConfigManager.h>
  90 tony  1.6  #include <Pegasus/Common/XmlWriter.h>
  91            #include <Pegasus/Config/ConfigManager.h>
  92 karl  1.8  #include <Pegasus/Common/StatisticalData.h>
  93            #include <Pegasus/Common/HashTable.h>
  94 karl  1.1  
  95            
  96 tony  1.6  #include <stdlib.h>
  97 karl  1.1  
  98 tony  1.6  //The following include is needed for gethostbyname
  99            #if defined(PEGASUS_OS_TYPE_WINDOWS)
 100            #include <objbase.h>
 101            #else
 102            #include <netdb.h>
 103            #include <arpa/inet.h>
 104            #endif
 105 karl  1.1  
 106            PEGASUS_USING_STD;
 107            
 108            PEGASUS_NAMESPACE_BEGIN
 109            
 110 tony  1.6  #define CDEBUG(X)
 111 karl  1.11 #define LDEBUG()
 112 tony  1.6  //#define CDEBUG(X) PEGASUS_STD(cout) << "InteropProvider " << X << PEGASUS_STD(endl)
 113 karl  1.11 //#define LDEBUG(X) Logger::put (Logger::DEBUG_LOG, "InteropProvider", Logger::INFORMATION, "$0", X)
 114            // The following is attempt to use the tracer for CDEBUG.  Not working. 1 sept 2004
 115            //#include <cstring>
 116            //#include <stdcxx/stream/strstream>
 117            // This one sucks because not applicable to separate executables.
 118            // looks like we use trace for the externals.
 119            // requires using PEGASUS_USING_PEGASUS
 120            //#define CDEBUG(X) {ostrstream os; os << X; char* tmp = os.str(); PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4, String(tmp));delete tmp;} 
 121            //#define CDEBUG(X) {stringstream os; os << X;string os_str = os.str(); const char* tmp = os_str.c_str(); PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4, String(tmp); }
 122 tony  1.6  
 123            //**************************************************************************
 124            //
 125            //    Constants representing the class names processed
 126            //
 127            //**************************************************************************
 128            
 129 karl  1.10 const char * thisProvider = "InteropProvider";
 130 tony  1.6  // The following should be moved to somewhere like constants.
 131 karl  1.5  static const String PegasusInstanceIDGlobalPrefix = "PEG";
 132 karl  1.1  
 133            /**
 134                The constants representing the class names we process
 135            */
 136 karl  1.8  // ATTN DELETE: static const CIMName __NAMESPACE_CLASSNAME  = CIMName ("__Namespace");
 137 karl  1.1  static const CIMName CIM_NAMESPACE_CLASSNAME  = CIMName ("CIM_Namespace");
 138 karl  1.8  static const CIMName PG_NAMESPACE_CLASSNAME  = CIMName ("PG_Namespace");
 139            
 140 karl  1.1  static const CIMName CIM_OBJECTMANAGER_CLASSNAME  = CIMName ("CIM_ObjectManager");
 141            static const CIMName CIM_OBJECTMANAGERCOMMUNICATIONMECHANISM_CLASSNAME  = 
 142                    CIMName ("CIM_ObjectManagerCommunicationMechanism");
 143 tony  1.6  static const CIMName PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME  = 
 144                    CIMName ("PG_CIMXMLCommunicationMechanism");
 145            static const CIMName CIM_COMMMECHANISMFORMANAGER_CLASSNAME  = 
 146                    CIMName ("CIM_CommMechanismForManager");
 147            static const CIMName CIM_NAMESPACEINMANAGER_CLASSNAME  = 
 148                    CIMName ("CIM_NamespaceInManager");
 149 karl  1.1  
 150            // Property Names for __Namespace Class
 151            static const CIMName NAMESPACE_PROPERTYNAME  = CIMName ("Name");
 152            static const CIMNamespaceName ROOTNS  = CIMNamespaceName ("root");
 153            
 154            
 155            // Property names for CIM_ObjectManager Class
 156            static const CIMName OM_GATHERSTATISTICALDATA  =
 157             CIMName ("GatherStatisticalData");
 158 tony  1.6  // Property for the slp template.
 159            static const CIMName OM_DESCRIPTIONPROPERTY =
 160                CIMName("Description");
 161 karl  1.1  
 162            // Property Names for ObjectManagerCommunicationMechanism Class
 163            static const CIMName OM_COMMUNICATIONMECHANISM  = 
 164                    CIMName ("CommunicationMechanism");
 165            static const CIMName OM_FUNCTIONALPROFILESSUPPORTED  =
 166             CIMName ("FunctionalProfilesSupported");
 167            static const CIMName OM_FUNCTIONALPROFILEDESCRIPTIONS  =
 168             CIMName ("FunctionalProfileDescriptions");
 169            static const CIMName OM_AUTHENTICATIONMECHANISMSSUPPORTED  =
 170             CIMName ("AuthenticationMechanismsSupported");
 171            static const CIMName OM_AUTHENTICATIONMECHANISMDESCRIPTIONS  =
 172             CIMName ("AuthenticationMechanismDescriptions");
 173            static const CIMName OM_MULTIPLEOPERATIONSSUPPORTED  =
 174             CIMName ("MultipleOperationsSupported");
 175            static const CIMName OM_VERSION  =
 176             CIMName ("Version");
 177            
 178            // Property Names for CIMXML CommunicationMechanism
 179            
 180            static const CIMName CIMVALIDATED  =
 181             CIMName ("CIMValidated");
 182 karl  1.1  
 183            static const String CIMXMLProtocolVersion = "1.0";
 184            
 185 karl  1.5  // Property names for CIM_Namespace Class
 186 karl  1.1  
 187            static const CIMName CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME = 
 188                    CIMName ("SystemCreationClassName");
 189            static const CIMName CIM_NAMESPACE_PROPERTY_SYSTEMNAME = 
 190                    CIMName ("SystemName");
 191            static const CIMName CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME = 
 192                    CIMName ("ObjectManagerCreationClassName");
 193            static const CIMName CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME = 
 194                    CIMName ("ObjectManagerName");
 195            static const CIMName CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME = 
 196                    CIMName ("CreationClassName");
 197            static const CIMName CIM_NAMESPACE_PROPERTY_NAME  = CIMName ("Name");
 198            static const CIMName CIM_NAMESPACE_PROPERTY_CLASSINFO = 
 199                    CIMName ("ClassInfo");
 200            static const CIMName CIM_NAMESPACE_PROPERTY_DESCRIPTIONOFCLASSINFO = 
 201                    CIMName ("DescriptionOfClassInfo");
 202            
 203 karl  1.8  // Additional Property names for PG_Namespace Class
 204            
 205            static const CIMName PG_NAMESPACE_PROPERTY_SCHEMAUPDATESALLOWED = 
 206                    CIMName ("SchemaUpdatesAllowed");
 207            static const CIMName PG_NAMESPACE_PROPERTY_ISSHAREABLE = 
 208                    CIMName ("IsShareable");
 209            static const CIMName PG_NAMESPACE_PROPERTY_PARENTNAMESPACE = 
 210                    CIMName ("ParentNamespace");
 211 karl  1.11 static const CIMName PG_NAMESPACE_PROPERTY_NAME = 
 212                    CIMName ("Name");
 213 karl  1.8  
 214 karl  1.5  // Defines to serve as the ENUM for class selection for instance
 215            // operations.
 216            
 217            enum targetClass{
 218 karl  1.11         //__NAMESPACE = 1,
 219                    PG_NAMESPACE = 1,
 220                    CIM_OBJECTMANAGER = 2,
 221                    PG_CIMXMLCOMMUNICATIONMECHANISM = 3,
 222                    CIM_NAMESPACEINMANAGERINST =4,
 223                    CIM_COMMMECHANISMFORMANAGERINST=5
 224                };
 225                
 226 tony  1.6   enum targetAssocClass{
 227                 CIM_NAMESPACEINMANAGER =1,
 228                 CIM_COMMMECHANISMFORMANAGER=2
 229             };
 230 karl  1.5  
 231 karl  1.1  //***************************************************************
 232 karl  1.5  // Provider Utility Functions
 233 karl  1.1  //***************************************************************
 234 tony  1.6  
 235 karl  1.8  /** get one string property from an instance. Note that these functions simply
 236                return the default value if the property cannot be found or is of the wrong
 237                type thus, in reality being a maintenance problem since there is no 
 238                error indication.
 239 tony  1.6      @param instance CIMInstance from which we get property value
 240                @param propertyName String name of the property containing the value
 241                @param default String optional parameter that is substituted if the property does
 242                not exist, is Null, or is not a string type. The substitute is String::EMPTY
 243                @return String value found or defaultValue.
 244            */
 245 karl  1.10 String _getPropertyValue(const CIMInstance& instance, const CIMName& propertyName, const String& defaultValue)
 246 tony  1.6  {
 247 karl  1.8      String output = defaultValue;
 248 tony  1.6      Uint32 pos;
 249                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 250                {
 251                    CIMConstProperty p1 = instance.getProperty(pos);
 252                    if (p1.getType() == CIMTYPE_STRING)
 253                    {
 254                        CIMValue v1  = p1.getValue();
 255            
 256                        if (!v1.isNull())
 257                            v1.get(output);
 258                    }
 259                }
 260 karl  1.8      return(output);
 261            }
 262            
 263            // Overload of _getPropertyValue for boolean type
 264 karl  1.10 Boolean _getPropertyValue(const CIMInstance& instance, const CIMName& propertyName, const Boolean defaultValue)
 265 karl  1.8  {
 266                Boolean output = defaultValue;
 267                Uint32 pos;
 268                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 269                {
 270                    CIMConstProperty p1 = instance.getProperty(pos);
 271                    if (p1.getType() == CIMTYPE_BOOLEAN)
 272                    {
 273                        CIMValue v1  = p1.getValue();
 274            
 275                        if (!v1.isNull())
 276                            v1.get(output);
 277                    }
 278                }
 279 tony  1.6      return(output);
 280            }
 281 karl  1.11 
 282 tony  1.6  /** get Host IP address from host name. If the
 283                host name is not provided, uses internal function.
 284                If everything fails, gets the definition normally
 285                used for localhost (127.0.0.1).
 286                
 287                @param hostName String with the name of the host
 288                @return String with the IP address to be used
 289                NOTE: This code should not be in slpprovider. This
 290                should be in the Interop classes but for the moment
 291                it is not.
 292            */
 293            String _getHostAddress(String hostName)
 294            {
 295              // set default address
 296              String ipAddress("127.0.0.1");
 297              
 298              if (hostName == String::EMPTY)
 299                	hostName = System::getHostName();
 300            
 301              struct hostent * phostent;
 302              struct in_addr   inaddr;
 303 tony  1.6    
 304              if ((phostent = ::gethostbyname((const char *)hostName.getCString())) != NULL)
 305                {
 306                 ::memcpy( &inaddr, phostent->h_addr,4);
 307                  ipAddress = ::inet_ntoa( inaddr );
 308                }
 309              return ipAddress;
 310            }
 311            
 312             Array<String> _getFunctionalProfiles(Array<Uint16> profiles)
 313             {
 314                 Array<String> profileDescriptions;
 315                 profiles.append(2); profileDescriptions.append("Basic Read");
 316                 profiles.append(3); profileDescriptions.append("Basic Write");
 317                 profiles.append(4); profileDescriptions.append("Schema Manipulation");
 318                 profiles.append(5); profileDescriptions.append("Instance Manipulation");
 319                 profiles.append(6); profileDescriptions.append("Association Traversal");
 320                 profiles.append(8); profileDescriptions.append("Qualifier Declaration");
 321                 profiles.append(9); profileDescriptions.append("Indications");
 322                 return(profileDescriptions);
 323             }
 324 tony  1.6  
 325            /*  get the prefix that will be part of the cimom identification
 326                This can be either the default PEG or if the environment
 327                variable PEGASUS_TRADEMARK_PREFIX is defined this is used.
 328                NOTE: getting from the environment variable is a hack until
 329                we can come up with a better source.
 330                @return String containing the unique name for the CIMOM ID
 331            */
 332            
 333            String getTrademarkCIMOMIDPrefix()
 334            {
 335            
 336                char * trademark;
 337                trademark = getenv("PEGASUS_TRADEMARK_PREFIX");
 338                return((trademark)? trademark : PegasusInstanceIDGlobalPrefix);
 339            }
 340            /** Builds the UUID string for this CIMOM.
 341            **/
 342            String getUUIDString()
 343            {
 344                return(Guid::getGuid());
 345 tony  1.6  }
 346 karl  1.1  
 347            /* Test the keys in the CIM_Namespace for valid values
 348               This includes all of the keys above the name key.
 349               THis is a dummy for now.
 350               ATTN: KS Extend and finish this function.
 351            */
 352 karl  1.5  Boolean _validateProperties(const CIMObjectPath& path)
 353 karl  1.1  {
 354                return true;
 355            }
 356 karl  1.5  Boolean _validateProperties(const CIMInstance& instance)
 357 karl  1.1  {
 358                return true;
 359            }
 360            
 361 tony  1.6  /* Validate that the property exists, is string type and
 362 karl  1.5     optionally the value itself. Note processes only String
 363 tony  1.6     properties.
 364               @param Instance to search for property.
 365               @param CIMName containing property Name
 366               @value String containing value. If not String::EMPTY, compare to 
 367 karl  1.5     value in the property
 368 tony  1.6     @return True if passes all tests
 369 karl  1.5  */
 370            Boolean _validateRequiredProperty(const CIMInstance& instance, 
 371                                      const CIMName& propertyName,
 372                                      const String& value)
 373            {
 374 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 375                        "InteropProvider::_validateRequiredProperty()");
 376 karl  1.5      Uint32 pos;
 377 tony  1.6  
 378 karl  1.5      if ((pos = instance.findProperty (propertyName)) == PEG_NOT_FOUND)
 379 tony  1.6      {
 380                    PEG_METHOD_EXIT();
 381 karl  1.5          return(false);
 382 tony  1.6      }
 383 karl  1.5      //
 384                //  Get the property
 385                //
 386                CIMConstProperty theProperty = instance.getProperty(pos);
 387                const CIMValue theValue = theProperty.getValue ();
 388                //
 389 tony  1.6      //  ATTN: Required property must have a non-null value
 390 karl  1.5      //
 391 tony  1.6      if ((theValue.getType() != CIMTYPE_STRING) || (theValue.isNull()))
 392                {
 393                    PEG_METHOD_EXIT();
 394 karl  1.5          return(false);
 395 tony  1.6      }
 396            
 397                String valueField;
 398                theValue.get(valueField);
 399                if ((value == String::EMPTY) || (valueField == value))
 400 karl  1.5      {
 401 tony  1.6          PEG_METHOD_EXIT();
 402                    return(true);
 403 karl  1.5      }
 404 tony  1.6      PEG_METHOD_EXIT();
 405                return(false);
 406 karl  1.5  }
 407            
 408            Boolean _validateRequiredProperty(const CIMInstance& instance,
 409                                      const CIMName& propertyName,
 410                                      const Uint16& value)
 411            {
 412 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 413                    "InteropProvider::_validateRequiredProperty()");
 414                
 415                PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4, "Validate "
 416                    + propertyName.getString());
 417            
 418 karl  1.5      Uint32 pos;
 419                if ((pos = instance.findProperty (propertyName)) == PEG_NOT_FOUND)
 420 tony  1.6      {
 421                    PEG_METHOD_EXIT();
 422 karl  1.5          return(false);
 423 tony  1.6      }
 424 karl  1.5      //
 425                //  Get the property
 426                //
 427                CIMConstProperty theProperty = instance.getProperty(pos);
 428                CIMValue theValue = theProperty.getValue ();
 429                //
 430 tony  1.6      //  ATTN:Required property must have a non-null value
 431 karl  1.5      //
 432 tony  1.6      if ((theValue.getType() != CIMTYPE_UINT16) 
 433                    || (theValue.isNull()) ) 
 434                {
 435                    PEG_METHOD_EXIT();
 436 karl  1.5          return(false);
 437 tony  1.6      }
 438                PEG_METHOD_EXIT();
 439 karl  1.5      return(true);
 440            }
 441            Boolean _validateRequiredProperty(const CIMObjectPath& objectPath,
 442                                      const CIMName& propertyName,
 443                                      const String value)
 444            {
 445 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 446                        "InteropProvider::_validateRequiedProperty()");
 447 karl  1.5      Array<CIMKeyBinding> kbArray = objectPath.getKeyBindings();
 448            
 449                // find the correct key binding
 450                for (Uint32 i = 0; i < kbArray.size(); i++)
 451                {
 452                    if (kbArray[i].getName() == propertyName)
 453                    {
 454                        if (value != String::EMPTY)
 455                        {
 456                            if (value !=kbArray[i].getValue())
 457                            {
 458 tony  1.6                      PEG_METHOD_EXIT();
 459 karl  1.5                      return(true);
 460                            }
 461                        }
 462                    }
 463                }
 464 tony  1.6      PEG_METHOD_EXIT();
 465 karl  1.5      return(true);
 466            }
 467 karl  1.1  
 468            /* Query the repository for array of all namespacenames
 469 tony  1.6     @return Array<CIMNamespaceName> with all namespaces
 470               @exception Passes all exception that repository may generate.
 471 karl  1.1  */        
 472            Array<CIMNamespaceName> InteropProvider::_enumerateNameSpaces()
 473            {
 474                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 475                        "InteropProvider::_enumerateNameSpaces()");
 476 tony  1.6  
 477 karl  1.1      Array<CIMNamespaceName> namespaceNames;
 478                
 479 tony  1.6      namespaceNames = _repository->enumerateNameSpaces();
 480 karl  1.1  
 481                PEG_METHOD_EXIT();
 482                return(namespaceNames);
 483            }
 484            
 485 tony  1.6  /* get a class defintion. Gets the class defined by
 486                the parameters. Generates exception of class not defined.
 487 karl  1.1     @param namespace in which to look for the class.
 488               @param name of class to get.
 489               @return the CIMClass object
 490               @Exceptions any repository exceptions if class not found.
 491            */ 
 492            CIMClass InteropProvider::_getClass(const CIMNamespaceName& nameSpace,
 493 tony  1.6                                      const CIMName& className)
 494 karl  1.1  {
 495                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 496 tony  1.6              "InteropProvider::_getClass");
 497            
 498                CIMClass myClass = _repository->getClass(nameSpace, className,
 499                                        false,true,true);
 500 karl  1.1      PEG_METHOD_EXIT();
 501                return myClass;
 502            }
 503            
 504            /* Verify that this is one of the legal classnames and
 505               return indicator which.
 506               @param - Classname
 507               @return - Uint32 indicating type
 508               @Exceptions - throws CIMNotSupportedException if invalid class.
 509            */
 510 karl  1.5  targetClass _verifyValidClassInput(const CIMName& className)
 511 karl  1.1  {
 512 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 513                        "InteropProvider::_verifyValidClassInput");
 514 karl  1.1      if (className.equal(CIM_OBJECTMANAGER_CLASSNAME))
 515                    return CIM_OBJECTMANAGER;
 516            
 517 tony  1.6      if (className.equal(PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME))
 518                    return PG_CIMXMLCOMMUNICATIONMECHANISM;
 519 karl  1.1  
 520 karl  1.10     // Last entry, reverse test and return OK if PG_Namespace
 521 karl  1.8      // Note: Changed to PG_Namespace for CIM 2.4
 522                if (!className.equal(PG_NAMESPACE_CLASSNAME))
 523 karl  1.1          throw CIMNotSupportedException
 524                        (className.getString() + " not supported by Interop Provider");
 525            
 526 karl  1.10     PEG_METHOD_EXIT();
 527 karl  1.8      return PG_NAMESPACE;
 528 karl  1.1  }
 529            
 530 tony  1.6  targetAssocClass _verifyValidAssocClassInput(const CIMName& className)
 531            {
 532 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 533                        "InteropProvider::_verifyValidAssocClassInput");
 534 tony  1.6      if (className.equal(CIM_NAMESPACEINMANAGER_CLASSNAME))
 535                    return CIM_NAMESPACEINMANAGER;
 536 karl  1.8      // Last entry, reverse test and return OK if CIM_CommMech....
 537 tony  1.6      if (!className.equal(CIM_COMMMECHANISMFORMANAGER_CLASSNAME))
 538                    throw CIMNotSupportedException
 539                        (className.getString() + " not supported by Interop Provider");
 540            
 541 karl  1.10     PEG_METHOD_EXIT();
 542 tony  1.6      return CIM_COMMMECHANISMFORMANAGER;
 543            }
 544            
 545 karl  1.1  /* validate the authorization of the user name against the namespace.
 546            */
 547            String _validateUserID(const OperationContext & context)
 548            {
 549 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 550                        "InteropProvider::_validateUserID");
 551 karl  1.1      //ATTN-DME-P3-20020522: ADD AUTHORIZATION CHECK TO __NAMESPACE PROVIDER
 552                String userName;
 553                try
 554                {
 555                    IdentityContainer container = context.get(IdentityContainer::NAME);
 556                    userName = container.getUserName();
 557                }
 558 karl  1.10 
 559 karl  1.1      catch (...)
 560                {
 561                   userName = String::EMPTY;
 562                }
 563 karl  1.10 
 564                PEG_METHOD_EXIT();
 565 karl  1.1      return userName;
 566            }
 567            
 568 karl  1.11 /** Set the value of a property defined by property name in the instance provided.
 569 tony  1.6      Sets a String into the value field unless the property name cannot be found.
 570                If the property cannot be found, it simply returns.
 571                ATTN: This function does not pass an error back if property not found.
 572                @param instance CIMInstance in which to set property value
 573                @param propertyName CIMName of property in which value will be set.
 574                @param value String value to set into property
 575                
 576            */
 577            void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const String& value)
 578            {
 579                Uint32 pos;
 580                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 581                    instance.getProperty(pos).setValue(CIMValue(value));
 582            }
 583            
 584            void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const Boolean& value)
 585            {
 586                Uint32 pos;
 587                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 588                    instance.getProperty(pos).setValue(CIMValue(value));
 589            }
 590 karl  1.1  
 591 tony  1.6  void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const Uint16& value)
 592            {
 593                Uint32 pos;
 594                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 595                    instance.getProperty(pos).setValue(CIMValue(value));
 596            }
 597            
 598            void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const Array<String>& value)
 599            {
 600                Uint32 pos;
 601                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 602                    instance.getProperty(pos).setValue(CIMValue(value));
 603            }
 604            
 605            void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const Array<Uint16>& value)
 606            {
 607                Uint32 pos;
 608                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 609                    instance.getProperty(pos).setValue(CIMValue(value));
 610            }
 611            
 612 tony  1.6  void _setPropertyValue(CIMInstance& instance, const CIMName propertyName, const CIMObjectPath& value)
 613            {
 614                Uint32 pos;
 615                if ((pos = instance.findProperty(propertyName)) != PEG_NOT_FOUND)
 616                    instance.getProperty(pos).setValue(CIMValue(value));
 617            }
 618            
 619            /** add the correct values to the common keys defined for all of the classes. This is
 620                systemcreationclassname and systemname
 621                Note that if the properties do not exist, we simply ignore them.
 622            */
 623            void _fixInstanceCommonKeys(CIMInstance& instance)
 624 karl  1.1  {
 625                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 626 tony  1.6              "InteropProvider::_fixInstanceCommonKeys()");
 627 karl  1.1      String SystemCreationClassName = System::getSystemCreationClassName ();
 628                if (SystemCreationClassName == String::EMPTY)
 629                {
 630 tony  1.6          //Attn: Get this globally. For now This in place because global is often Empty
 631 karl  1.1          SystemCreationClassName = "CIM_ComputerSystem";
 632                }
 633            
 634 tony  1.6      _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME,SystemCreationClassName);
 635 karl  1.1  
 636 karl  1.5      // Add property SystemName
 637 tony  1.6  
 638                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_SYSTEMNAME,System::getHostName());
 639 karl  1.1      PEG_METHOD_EXIT();
 640            }
 641            
 642 tony  1.6  /** builds one instance of the class named className. Gets Class defintion and f
 643                fills in the correct properties from the class.  This requires a repository
 644                getclass request for each instance built. The skeleton is built by
 645                creating the instance and copying qualifiers and properties from
 646                the class. Finally the instance is cloned to separate it from the
 647                original objects.
 648                NOTE: This is very inefficient for anything larger than a few instances.
 649                We should separate the get from the createSkeleton.
 650                @param className CIMName of the class for which the instance is to be built
 651                @return CIMInstance of this class with properties complete.
 652                @exception passes on any exceptions received from the repository request.
 653            */
 654            CIMInstance InteropProvider::_buildInstanceSkeleton(const CIMName& className)
 655 karl  1.1  {
 656                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 657 tony  1.6              "InteropProvider::_buildInstanceSkeleton()");
 658 karl  1.10     CIMClass myClass;
 659 karl  1.1  
 660 tony  1.6      CIMInstance skeleton(className);
 661                    myClass = _repository->getClass(_operationNamespace, className, false, true, true);
 662 karl  1.1      
 663 tony  1.6      // copy the qualifiers
 664                for (Uint32 i = 0 ; i < myClass.getQualifierCount() ; i++)
 665                    skeleton.addQualifier(myClass.getQualifier(i));
 666            
 667                // copy the properties
 668                for (Uint32 i = 0 ; i < myClass.getPropertyCount() ; i++)
 669                    skeleton.addProperty(myClass.getProperty(i));
 670 karl  1.1  
 671                PEG_METHOD_EXIT();
 672 tony  1.6      return(skeleton.clone());
 673 karl  1.1  }
 674            
 675 tony  1.6  /* build a single instance of the cimxmlcommunicationmechanism class
 676               using the parameter provided as the name property
 677               @parm name String representing the name to be used for this object.
 678               @return CIMInstance of the class
 679 karl  1.5  */
 680 tony  1.6  CIMInstance InteropProvider::_buildInstancePGCIMXMLCommunicationMechanism(
 681                                                        const String& namespaceType,
 682                                                        const String& IPAddress,
 683                                                        const Boolean& includeQualifiers,
 684                                                        const Boolean& includeClassOrigin,
 685                                                        const CIMPropertyList& propertyList)
 686 karl  1.1  {
 687                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 688 tony  1.6              "InteropProvider::_buildInstancePGCIMXMLCommunicationMechanism()");
 689 karl  1.1      
 690 tony  1.6      CIMInstance instance = _buildInstanceSkeleton(PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME);
 691 karl  1.1  
 692 tony  1.6      _fixInstanceCommonKeys(instance);
 693 karl  1.1  
 694 tony  1.6      //CreationClassName
 695                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME,PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME.getString());
 696 karl  1.1  
 697 tony  1.6      //Name, this CommunicationMechanism.
 698                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_NAME, PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME.getString());
 699 karl  1.1  
 700 tony  1.6      // CommunicationMechanism Property
 701                _setPropertyValue(instance, OM_COMMUNICATIONMECHANISM, Uint16(2));
 702 karl  1.1  
 703                //Functional Profiles Supported Property.
 704                Array<Uint16> profiles;
 705 tony  1.6      Array<String> profileDescriptions = _getFunctionalProfiles(profiles);
 706 karl  1.1  
 707 tony  1.6      // Set functional profiles in instance
 708                _setPropertyValue(instance, OM_FUNCTIONALPROFILESSUPPORTED, profiles);
 709            
 710                _setPropertyValue(instance, OM_FUNCTIONALPROFILEDESCRIPTIONS, profileDescriptions);
 711 karl  1.1  
 712                // Multiple OperationsSupported Property
 713 tony  1.6      _setPropertyValue(instance, OM_MULTIPLEOPERATIONSSUPPORTED, false);
 714 karl  1.5  
 715                // AuthenticationMechanismsSupported Property
 716 karl  1.1      Array<Uint16> authentications;
 717                Array<String> authenticationDescriptions;
 718 karl  1.5  
 719 tony  1.7      authentications.append(3); authenticationDescriptions.append("Basic");
 720 karl  1.5  
 721 tony  1.6      _setPropertyValue(instance, OM_AUTHENTICATIONMECHANISMSSUPPORTED, authentications);
 722            
 723                _setPropertyValue(instance, OM_AUTHENTICATIONMECHANISMDESCRIPTIONS, authenticationDescriptions);
 724 karl  1.1      
 725 tony  1.6      _setPropertyValue(instance, OM_VERSION, CIMXMLProtocolVersion);
 726            
 727                _setPropertyValue(instance, "namespaceType", namespaceType);
 728            
 729                _setPropertyValue(instance, "IPAddress", IPAddress);
 730 karl  1.1  
 731                PEG_METHOD_EXIT();
 732                return(instance);
 733            }
 734 tony  1.6  
 735            Array<CIMInstance> InteropProvider::_buildInstancesPGCIMXMLCommunicationMechanism(
 736                                                        const Boolean includeQualifiers,
 737                                                        const Boolean includeClassOrigin,
 738                                                        const CIMPropertyList& propertyList)
 739            {
 740 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 741                        "InteropProvider::_buildInstancesPGCIMXMLCommunicationMechanism");
 742                
 743 tony  1.6      // This is a temporary hack to get the multiple connections.
 744                ConfigManager* configManager = ConfigManager::getInstance();
 745                Boolean enableHttpConnection = String::equal(
 746                    configManager->getCurrentValue("enableHttpConnection"), "true");
 747                Boolean enableHttpsConnection = String::equal(
 748                    configManager->getCurrentValue("enableHttpsConnection"), "true");
 749            
 750                String IPAddress = _getHostAddress(System::getHostName());
 751                Array<CIMInstance> instances;
 752            
 753                if (enableHttpConnection)
 754                {
 755                    CDEBUG("building pgcimxmlinstances 1");
 756                    CIMInstance instance = _buildInstancePGCIMXMLCommunicationMechanism(
 757                                        "http", IPAddress,
 758                                        includeQualifiers,
 759                                        includeClassOrigin,
 760                                        propertyList);
 761                    instances.append(instance);
 762                }
 763            
 764 tony  1.6      if (enableHttpsConnection)
 765                {
 766                    CDEBUG("building pgcimxmlinstances 2");
 767                    CIMInstance instance = _buildInstancePGCIMXMLCommunicationMechanism(
 768                                                            "https", IPAddress,
 769                                                            includeQualifiers,
 770                                                            includeClassOrigin,
 771                                                            propertyList);
 772                    instances.append(instance);
 773                }
 774 karl  1.10     PEG_METHOD_EXIT();
 775 tony  1.6      return(instances);
 776            }
 777            /*  Gets the value for the CIMObjectManager name.  This is a key
 778                property with the following characteristics.
 779                1. It is persistent. This must be persistent through CIMOM
 780                restarts.  We will save it in the instance database to achieve this. 
 781                2. It must be unique. We cannot create duplicate CIMOM names
 782                3. It is based on the DMTF description of how unique InstanceIds
 783                are defined (Trademark/etc followed by unique identification.
 784                Use the Global constant PegasusInstanceIDGlobalPrefix as the
 785                prefix allowing this to be changed.
 786            */
 787            String buildObjectManagerName()
 788            {
 789                return(getTrademarkCIMOMIDPrefix() + ":" + getUUIDString());
 790 karl  1.1  }
 791            
 792 karl  1.10 /** get either the local or disk CIMObjectmanager instance.
 793                @return Boolean true if already exists. False if 
 794                not initialized. Also returns with the current version set
 795                into local parameter.
 796                ATTN: Probably should get rid of the local parameter since
 797                this is used so infrequently, waste of space.
 798            */
 799            Boolean InteropProvider::_getInstanceCIMObjectManager(
 800                                    const Boolean includeQualifiers,
 801                                    const Boolean includeClassOrigin,
 802                                    const CIMPropertyList& propertyList)
 803            {
 804            
 805                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 806                        "InteropProvider::_getInstanceCIMObjectManager");
 807                // If there is already an instance of this class local use it.
 808                if (!instanceOfCIMObjectManager.isUninitialized())
 809                {
 810                    PEG_METHOD_EXIT();
 811                    return(true);
 812                }
 813 karl  1.10     // Try to get persistent instance from repository
 814                Array<CIMInstance> instances;
 815                try
 816                {
 817                    instances = _repository->enumerateInstances(_operationNamespace,
 818                                  CIM_OBJECTMANAGER_CLASSNAME, true, false, includeQualifiers,
 819                                    includeClassOrigin, propertyList);
 820                
 821                    CDEBUG("_buildInstanceCIMOBJMGR Found Instance in repository " << instances.size() );
 822                
 823                    if (instances.size() >= 1)
 824                    {
 825                        // set this instance into global variable.
 826                        instanceOfCIMObjectManager = instances[0];
 827                
 828                        // log entry if there is more than one instance.
 829                        // Some day we may support multiple entries to see other CIMOMs but
 830                        // for now this should be illegal and represent an internal error.
 831                        // but we will still continue to use the first entry.
 832                        if (instances.size() > 1)
 833                        {
 834 karl  1.10                 Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 835                                "Error. Multiple definitons of : $0", CIM_OBJECTMANAGER_CLASSNAME.getString());
 836                        }
 837                        return(true);
 838                    }
 839                    else
 840                        return(false);
 841                }
 842                catch(CIMException& e)
 843                {
 844                    Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 845                        "Error. Cannot access $0 in repository", CIM_OBJECTMANAGER_CLASSNAME.getString());
 846                    PEG_METHOD_EXIT();
 847                    throw e;
 848                }
 849                catch(Exception& e)
 850                {
 851                    Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
 852                        "Error. Cannot access $0 in repository", CIM_OBJECTMANAGER_CLASSNAME.getString());
 853                    PEG_METHOD_EXIT();
 854                    throw e;
 855 karl  1.10     }
 856            }
 857            
 858            
 859 tony  1.6  /** build an instance of the CIM_ObjectManager class filling out
 860                the required properties
 861                @param includeQualifiers Boolean
 862                @param includeClassOrigin Boolean
 863                @param propertylist CIMPropertyList 
 864                @return CIMInstance with a single built instance of the class
 865                @exception repository instances if exception to enumerateInstances
 866                    for this class.
 867            */
 868            CIMInstance InteropProvider::_buildInstanceCIMObjectManager(
 869                                    const Boolean includeQualifiers,
 870                                    const Boolean includeClassOrigin,
 871                                    const CIMPropertyList& propertyList)
 872 karl  1.1  {
 873                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 874 karl  1.10             "InteropProvider::_buildInstanceCIMObjectManager");
 875 karl  1.1  
 876 karl  1.10     // Try to get the current object.  If true then it is already created.
 877                if (_getInstanceCIMObjectManager(includeQualifiers,includeClassOrigin,propertyList))
 878 karl  1.5      {
 879                    PEG_METHOD_EXIT();
 880                    return(instanceOfCIMObjectManager);
 881                }
 882                //
 883 karl  1.8      // No instance in the repository. Build new instance and save it.
 884 karl  1.5      //
 885 tony  1.6      CIMInstance instance = _buildInstanceSkeleton(CIM_OBJECTMANAGER_CLASSNAME);
 886            
 887                _fixInstanceCommonKeys(instance);
 888 karl  1.1  
 889 tony  1.6      _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME,CIM_OBJECTMANAGER_CLASSNAME.getString());
 890 karl  1.1  
 891 tony  1.6      _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_NAME,buildObjectManagerName());
 892            
 893                _setPropertyValue(instance, CIMName("ElementName"), String("Pegasus"));
 894            
 895 karl  1.8      //
 896 tony  1.6      //Description property this object manager instance
 897 karl  1.10     // default is Pegasus CIM_Server Version.
 898                // Provided undocumented option to get this from the environment.
 899                // This should probably be removed or documented.
 900 karl  1.8      //
 901 tony  1.6      String description;
 902                char * envDescription;
 903                envDescription = getenv("PEGASUS_CIMOM_DESCRIPTION");
 904            
 905 karl  1.10     description = (envDescription) ?
 906                    envDescription :
 907                    "Pegasus " + String(PEGASUS_NAME) + "Version " + String(PEGASUS_VERSION);
 908 tony  1.6  
 909                _setPropertyValue(instance, CIMName("Description"), description);
 910 karl  1.1  
 911 karl  1.8      //Property GatherStatisticalData. Initially this is set to false
 912                // and can then be modified by a modify instance on the instance.
 913                
 914 karl  1.10     Boolean gatherStatDataFlag = false;
 915            
 916                _setPropertyValue(instance, OM_GATHERSTATISTICALDATA, Boolean(gatherStatDataFlag));
 917            
 918                // ATTN: This one is a problem KS rethink this.
 919                // the following is a temporary hack to set the value of the statistics
 920                // gathering function dynamically.  We simply get the correct value
 921                // and call the internal method to set it each time this object is
 922                // built.
 923            #ifdef PEGASUS_HAS_PERFINST
 924                StatisticalData* sd = StatisticalData::current();
 925                sd->setCopyGSD(gatherStatDataFlag);
 926            #endif
 927 tony  1.6  
 928 karl  1.5      // write the instance to the repository
 929 karl  1.10     CIMObjectPath instancePath;
 930                // Add the instance path to this if necessary ATTN ATTN:
 931 karl  1.5      try
 932                {
 933 karl  1.10         instancePath = _repository->createInstance(_operationNamespace,
 934                                   instance );
 935 karl  1.5      }
 936                catch(CIMException& e)
 937                {
 938 tony  1.6          // ATTN: KS generate log error if this not possible
 939 karl  1.5          PEG_METHOD_EXIT();
 940                    throw e;
 941                }
 942                catch(Exception& e)
 943                {
 944 karl  1.10         // ATTN: Generate log error.
 945                    PEG_METHOD_EXIT();
 946 karl  1.5          throw e;
 947                }
 948 karl  1.10     instance.setPath(instancePath);
 949                CDEBUG("CIMObjectMgr path = " << instancePath.toString());
 950                // Save this instance for other requests
 951                instanceOfCIMObjectManager = instance;
 952 karl  1.5      PEG_METHOD_EXIT();
 953                return(instanceOfCIMObjectManager);
 954 karl  1.1  }
 955            
 956 karl  1.8  /** Get the instances of CIM_Namespace. Gets all instances of the namespace from
 957                the repository namespace management functions
 958                Pegasus 2.4 - This now gets CIM_Namespace and its subclass PG_Namespace
 959 tony  1.6  */
 960            Array<CIMInstance> InteropProvider::_getInstancesCIMNamespace(const Boolean& includeQualifiers,
 961                                        const Boolean& includeClassOrigin,
 962                                        const CIMPropertyList& propertyList)
 963            {
 964                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 965                        "InteropProvider::_getInstancesCIMNamespace()");
 966 karl  1.8  
 967                CDEBUG("_getinstancesPGNamespace");
 968 tony  1.6      Array<CIMNamespaceName> namespaceNames = _enumerateNameSpaces();
 969 karl  1.10     CDEBUG("_getInstancesCIMNamespace. count = " << namespaceNames.size());
 970 tony  1.6      Array<CIMInstance> instanceArray;
 971            
 972 karl  1.8      // We build instances of PG namespace since that is the leaf class
 973 tony  1.6      for (Uint32 i = 0; i < namespaceNames.size(); i++)
 974                {
 975 karl  1.8         instanceArray.append( _buildInstancePGNamespace(namespaceNames[i]));
 976 tony  1.6      }
 977 karl  1.10     CDEBUG("Build this many PG_Namespace Instances. count= " << instanceArray.size());
 978 tony  1.6      PEG_METHOD_EXIT();
 979                return(instanceArray);
 980            }
 981            
 982            /** get the instance of namespace defined by the input parameter which is the object path
 983                for the instance required.
 984                ATTN: Note that this is incorrect. We are supplying the namespace name and need to supply
 985                the objectpath
 986                @param TBD
 987                @return CIMInstance with the found instance or CIMInstance() if nothing found.
 988            */
 989            CIMInstance InteropProvider::_getInstanceCIMNamespace(const CIMNamespaceName & nameSpace)
 990            {
 991                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
 992                        "InteropProvider::_getInstancesCIMNamespace()");
 993            
 994                CDEBUG("_getinstanceCIMNamespace Gets ONE only from Namespace=" << nameSpace.getString());
 995                Array<CIMInstance> instances = _getInstancesCIMNamespace(true, true, CIMPropertyList());
 996            
 997 karl  1.8      // search the instances for one with the name property value = input parameter.
 998 tony  1.6      for (Uint32 i = 0 ; i < instances.size() ; i++)
 999                {
1000 karl  1.8          if (_getPropertyValue(instances[i], CIMName("name"), String::EMPTY) == nameSpace.getString())
1001 tony  1.6          {
1002                        PEG_METHOD_EXIT();
1003                        return(instances[i]);
1004                    }
1005                }
1006                PEG_METHOD_EXIT();
1007                CIMInstance nullInstance;
1008                return(nullInstance);
1009            }
1010            
1011            CIMObjectPath InteropProvider::_buildReference(const CIMInstance& instance, const CIMName& className)
1012            {
1013                return(_buildObjectPath(_operationNamespace,className, instance));
1014            }
1015            
1016            Array<CIMInstance> InteropProvider::_buildInstancesNamespaceInManager()
1017            {
1018 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1019                        "InteropProvider::_buildInstancesNamespaceInManager");
1020 tony  1.6  
1021                Array<CIMInstance> namespaceInstances = _getInstancesCIMNamespace(false,
1022                                        false, CIMPropertyList());
1023            
1024                CIMInstance instanceObjMgr = _buildInstanceCIMObjectManager( true, true, CIMPropertyList());
1025            
1026                CIMObjectPath refObjMgr = _buildReference(instanceObjMgr, CIM_OBJECTMANAGER_CLASSNAME);
1027            
1028                Array<CIMInstance> assocInstances;
1029            
1030                for (Uint32 i = 0 ; i < namespaceInstances.size() ; i++)
1031                {
1032                    CIMInstance instance = _buildInstanceSkeleton(CIM_NAMESPACEINMANAGER_CLASSNAME);
1033            
1034                    _setPropertyValue(instance, CIMName("Antecdent"), refObjMgr);
1035                    //ATTNATTN: this is weak qualifier.
1036                    _setPropertyValue(instance, CIMName("Dependent"), _buildReference(namespaceInstances[i],
1037                                                                        CIM_NAMESPACEINMANAGER_CLASSNAME));
1038                    assocInstances.append(instance);
1039                }
1040 karl  1.10 
1041                PEG_METHOD_EXIT();
1042 tony  1.6      return(assocInstances);
1043            }
1044            
1045            Array<CIMInstance> InteropProvider::_buildInstancesCommMechanismForManager()
1046            {
1047 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1048                        "InteropProvider::_buildInstancesCommMechanismForManager");
1049 tony  1.6  
1050                Array<CIMInstance> commInstances = _buildInstancesPGCIMXMLCommunicationMechanism(true,
1051                     true, CIMPropertyList());
1052            
1053                CIMInstance instanceObjMgr = _buildInstanceCIMObjectManager( true, true, CIMPropertyList());
1054            
1055                CIMObjectPath refObjMgr = _buildReference(instanceObjMgr, CIM_OBJECTMANAGER_CLASSNAME);
1056                Array<CIMInstance> assocInstances;
1057            
1058                for (Uint32 i = 0 ; i < commInstances.size() ; i++)
1059                {
1060                    
1061                    CIMInstance instance = _buildInstanceSkeleton(CIM_COMMMECHANISMFORMANAGER_CLASSNAME);
1062            
1063                    _setPropertyValue(instance,CIMName("Antecdent"), refObjMgr);
1064                    //ATTNATTN: this is weak qualifier.
1065                    _setPropertyValue(instance,CIMName("Dependent"), _buildReference(commInstances[i],CIM_COMMMECHANISMFORMANAGER_CLASSNAME));
1066                    assocInstances.append(instance);
1067                }
1068 karl  1.10 
1069                PEG_METHOD_EXIT();
1070 tony  1.6      return(assocInstances);
1071            }
1072            
1073 karl  1.1  /* generate one instance of the CIM_Namespace class with the
1074               properties
1075 karl  1.8     NOTE: CIM 2.4 - Changed to build PG namespace
1076 karl  1.1     @param namespace name to put into the class
1077               @exceptions - exceptions carried forward from create instance
1078               and addProperty.
1079            */
1080 karl  1.8  CIMInstance InteropProvider::_buildInstancePGNamespace(const CIMNamespaceName & nameSpace)
1081 karl  1.1  {
1082                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1083 karl  1.10             "InteropProvider::_buildInstancePGNamespace");
1084 tony  1.6      
1085                // ATTN: KS need to get the real objectManager name from elsewhere.  the only place
1086                // this exists is through the objectmanager object.  
1087                // ATTN: Should we be saving the objectmanager name somewhere internally either in
1088                // interop or more generally somewhere within the system for common access.
1089 karl  1.1      String ObjectManagerName = "ObjectManagerNameValue";
1090                
1091 karl  1.8      CIMInstance instance = _buildInstanceSkeleton(PG_NAMESPACE_CLASSNAME);
1092 karl  1.1  
1093 tony  1.6      _fixInstanceCommonKeys(instance);
1094 karl  1.1  
1095                //ObjectManagerCreationClassName
1096 tony  1.6      _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME, CIM_OBJECTMANAGER_CLASSNAME.getString());
1097            
1098 karl  1.1      //ObjectManagerName
1099 tony  1.6      _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME, ObjectManagerName);
1100            
1101 karl  1.1      //CreationClassName
1102 tony  1.6      // Class in which this was created, 
1103                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME, CIM_NAMESPACE_CLASSNAME.getString());
1104 karl  1.1      //Name
1105 tony  1.6      // This is the namespace name itself
1106                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_NAME, nameSpace.getString());
1107 karl  1.1  
1108                //ClassInfo
1109 tony  1.6      // Set the classinfo to unknown and the description to namespace.
1110                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_CLASSINFO, Uint16(0));
1111                _setPropertyValue(instance, CIM_NAMESPACE_PROPERTY_DESCRIPTIONOFCLASSINFO, String("namespace"));
1112            
1113 karl  1.8      //
1114                //  Everything above was commmon to CIM Namespace.  The following is PG_Namespace Properties
1115                //
1116                // ATTN: KS Get the correct values for these entities from repository interface.
1117 karl  1.10     CDEBUG("_buildPGNS Instance get namespace attributes for namespace= " << nameSpace.getString()); 
1118 karl  1.8  	CIMRepository::NameSpaceAttributes attributes;
1119                _repository->getNameSpaceAttributes(nameSpace.getString(), attributes);
1120                String parent="";
1121 karl  1.11 	String name = "";
1122 karl  1.8      Boolean shareable=false;
1123                Boolean updatesAllowed=true;
1124                for (CIMRepository::NameSpaceAttributes::Iterator i = attributes.start(); i; i++) 
1125                {
1126                   String key=i.key();
1127 karl  1.10        String value = i.value();
1128                   CDEBUG("Show Attributes. key= " << key << " value= " << value);
1129 karl  1.8         if (String::equalNoCase(key,"shareable"))
1130 karl  1.11 	   {
1131 karl  1.10           if (String::equalNoCase(value,"true"))
1132                          shareable=true;
1133 karl  1.11 	   }
1134 karl  1.8         else if (String::equalNoCase(key,"updatesAllowed")) 
1135 karl  1.11 	   {
1136 karl  1.10           if (String::equalNoCase(value,"false"))
1137                          updatesAllowed=false;
1138 karl  1.11 	   }
1139 karl  1.10        // Test to be sure we are returning proper namespace name
1140                   else if (String::equalNoCase(key,"name"))
1141 karl  1.8         {
1142 karl  1.10           if (!String::equalNoCase(value, nameSpace.getString()))
1143                      {
1144                          PEG_METHOD_EXIT();
1145                          // This is poor exception since it reflects internal error. Do error log
1146                          throw PEGASUS_CIM_EXCEPTION (CIM_ERR_NOT_SUPPORTED, 
1147                              "Namespace attribute rtnd error for key " + key + "expected " +
1148                               nameSpace.getString()+ value + " in " + String(thisProvider));
1149                      }
1150 karl  1.11 
1151            		  name = value;
1152 karl  1.8         }
1153                   else if (String::equalNoCase(key,"parent"))
1154 karl  1.11 	   {
1155 karl  1.10           parent=value;
1156 karl  1.11 	   }
1157 karl  1.8         else 
1158                   {
1159                      PEG_METHOD_EXIT();
1160 karl  1.10           // Poor error definition since it reflects internal error. do error log
1161 karl  1.8            throw PEGASUS_CIM_EXCEPTION (CIM_ERR_NOT_SUPPORTED, nameSpace.getString()+
1162 karl  1.10               " namespace attribute " + key + " option not supported in"+ String(thisProvider));
1163 karl  1.8         }
1164                }
1165                _setPropertyValue(instance, PG_NAMESPACE_PROPERTY_SCHEMAUPDATESALLOWED, updatesAllowed);
1166                _setPropertyValue(instance, PG_NAMESPACE_PROPERTY_ISSHAREABLE, shareable);
1167                _setPropertyValue(instance, PG_NAMESPACE_PROPERTY_PARENTNAMESPACE, parent);
1168 karl  1.11 	_setPropertyValue(instance, PG_NAMESPACE_PROPERTY_NAME, name);
1169 karl  1.8  
1170 karl  1.1      PEG_METHOD_EXIT();
1171                return(instance);
1172            }
1173 karl  1.5  void _validateCIMNamespaceKeys(const CIMObjectPath& objectPath)
1174            {
1175 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1176                        "InteropProvider::_validateCIMNamespaceKeys");
1177            
1178 karl  1.5      Boolean valid = true;
1179                CIMName propertyName;
1180                if (!_validateRequiredProperty(objectPath,
1181                            CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME,
1182                            System::getSystemCreationClassName ()))
1183                {
1184                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME;
1185                    valid = false;
1186                }
1187                if (!_validateRequiredProperty(objectPath,
1188                            CIM_NAMESPACE_PROPERTY_SYSTEMNAME,
1189                            System::getHostName()))
1190                {
1191                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMNAME;
1192                    valid = false;
1193                }
1194                if (!_validateRequiredProperty(objectPath,
1195                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME,
1196                            CIM_OBJECTMANAGER_CLASSNAME.getString()))
1197                {
1198                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME;
1199 karl  1.5          valid = false;
1200                }
1201            
1202                // ATTN: This one still a problem.  We have to get the name first
1203                if (!_validateRequiredProperty(objectPath,
1204                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME,
1205                            String::EMPTY))
1206                {
1207                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME;
1208                    valid = false;
1209                }
1210                if (!_validateRequiredProperty(objectPath,
1211                            CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME,
1212                            System::getHostName()))
1213                {
1214                    propertyName = CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME;
1215                    valid = false;
1216                }
1217            
1218                if (!_validateRequiredProperty(objectPath,
1219                            CIM_NAMESPACE_PROPERTY_NAME,
1220 karl  1.5                  String::EMPTY))
1221                {
1222                    propertyName = CIM_NAMESPACE_PROPERTY_NAME;
1223                    valid = false;
1224                }
1225            
1226                if (false)
1227                {
1228 tony  1.6          PEG_METHOD_EXIT();
1229 karl  1.5          throw CIMInvalidParameterException(
1230                        "Invalid key property: " + propertyName.getString());
1231                }
1232 tony  1.6      PEG_METHOD_EXIT();
1233            }
1234 karl  1.5  
1235 karl  1.11 /** completes a property in the defined instance either
1236                by adding the complete property if it does not exist
1237                or by adding the value if the property does exist.
1238                Used to make sure that key properties for things
1239                like systemcreationclass are included in the 
1240                creation of new instances and that the
1241                values are logical for the CIMOM.
1242            */
1243            Boolean _completeProperty(CIMInstance& instance,
1244                const CIMName& propertyName,
1245                const String& value)
1246            {
1247            
1248                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1249                        "InteropProvider::_completeProperty()");
1250            
1251                Uint32 pos;
1252            
1253                if (!_validateRequiredProperty(instance,
1254                            propertyName,
1255                            value))
1256 karl  1.11     {
1257                    if ((pos = instance.findProperty (propertyName)) == PEG_NOT_FOUND)
1258                    {
1259                        // Add the property.  Should be from the class.
1260                        PEG_METHOD_EXIT();
1261                        return(false);
1262                    }
1263                    else
1264                    {
1265                        //
1266                        _setPropertyValue(instance, propertyName, value);
1267                    }
1268                }
1269            
1270                PEG_METHOD_EXIT();
1271                return(true);
1272            }
1273            Boolean _completeCIMNamespaceKeys(CIMInstance& instance)
1274            {
1275            
1276                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1277 karl  1.11             "InteropProvider::_completeCIMNamespaceKeys");
1278            
1279                Boolean valid = true;
1280                CIMName propertyName;
1281            
1282                if (!_completeProperty(instance,
1283                            CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME,
1284                            System::getSystemCreationClassName ()))
1285                {
1286            
1287                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME;
1288                    valid = false;
1289                }
1290            
1291                if (!_completeProperty(instance,
1292                            CIM_NAMESPACE_PROPERTY_SYSTEMNAME,
1293                            System::getHostName()))
1294                {
1295                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMNAME;
1296                    valid = false;
1297                }
1298 karl  1.11 
1299                if (!_completeProperty(instance,
1300                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME,
1301                            CIM_OBJECTMANAGER_CLASSNAME.getString()))
1302                {
1303                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME;
1304                    valid = false;
1305                }
1306            
1307                if (!_completeProperty(instance,
1308                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME,
1309                            String::EMPTY))
1310                {
1311                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME;
1312                    valid = false;
1313                }
1314                if (!_completeProperty(instance,
1315                            CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME,
1316                            System::getHostName()))
1317                {
1318                    propertyName = CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME;
1319 karl  1.11         valid = false;
1320                }
1321            
1322                if (!_completeProperty(instance,
1323                            CIM_NAMESPACE_PROPERTY_NAME,
1324                            String::EMPTY))
1325                {
1326                    propertyName = CIM_NAMESPACE_PROPERTY_NAME;
1327                    valid = false;
1328                }
1329            
1330                if (!valid)
1331                {
1332                    PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1333                        "Invalid CIM_Namespace Key Property " +  propertyName.getString());
1334                    PEG_METHOD_EXIT();
1335                    throw CIMInvalidParameterException(
1336                        "Invalid CIM_Namespace key property: " + propertyName.getString());
1337                }
1338                PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4, "CIM_Namespace Keys Valid");
1339                PEG_METHOD_EXIT();
1340 karl  1.11     return(valid);
1341            }
1342            
1343            
1344 karl  1.5  void _validateCIMNamespaceKeys(const CIMInstance& instance)
1345            {
1346 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1347                        "InteropProvider::_validateCIMNamespaceKeys");
1348 karl  1.5      Boolean valid = true;
1349                CIMName propertyName;
1350                if (!_validateRequiredProperty(instance,
1351                            CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME,
1352                            System::getSystemCreationClassName ()))
1353                {
1354                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMCREATIONCLASSNAME;
1355                    valid = false;
1356                }
1357            
1358                if (!_validateRequiredProperty(instance,
1359                            CIM_NAMESPACE_PROPERTY_SYSTEMNAME,
1360                            System::getHostName()))
1361                {
1362                    propertyName = CIM_NAMESPACE_PROPERTY_SYSTEMNAME;
1363                    valid = false;
1364                }
1365            
1366                if (!_validateRequiredProperty(instance,
1367                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME,
1368                            CIM_OBJECTMANAGER_CLASSNAME.getString()))
1369 karl  1.5      {
1370                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERCREATIONCLASSNAME;
1371                    valid = false;
1372                }
1373            
1374                // ATTN: This one still a problem.  We have to get the name first
1375                if (!_validateRequiredProperty(instance,
1376                            CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME,
1377                            String::EMPTY))
1378                {
1379                    propertyName = CIM_NAMESPACE_PROPERTY_OBJECTMANAGERNAME;
1380                    valid = false;
1381                }
1382                if (!_validateRequiredProperty(instance,
1383                            CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME,
1384                            System::getHostName()))
1385                {
1386                    propertyName = CIM_NAMESPACE_PROPERTY_CREATIONCLASSNAME;
1387                    valid = false;
1388                }
1389            
1390 karl  1.5      if (!_validateRequiredProperty(instance,
1391                            CIM_NAMESPACE_PROPERTY_NAME,
1392                            String::EMPTY))
1393                {
1394                    propertyName = CIM_NAMESPACE_PROPERTY_NAME;
1395                    valid = false;
1396                }
1397            
1398                if (false)
1399                {
1400 tony  1.6          PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1401                        "Invalid CIM_Namespace Key Property " +  propertyName.getString());
1402                    PEG_METHOD_EXIT();
1403 karl  1.5          throw CIMInvalidParameterException(
1404 tony  1.6              "Invalid CIM_Namespace key property: " + propertyName.getString());
1405 karl  1.5      }
1406 tony  1.6      PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4, "CIM_Namespace Keys Valid");
1407                PEG_METHOD_EXIT();
1408            }
1409            
1410            /** builds complete object path from instance and classinfo by building the full path
1411                with host and namespace names included.
1412            */
1413            CIMObjectPath InteropProvider::_buildObjectPath(const CIMNamespaceName& name,
1414                                                            const CIMName& className,
1415                                                            const CIMInstance& instance)
1416            {
1417 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1418                        "InteropProvider::_buildObjectPath");
1419            
1420 tony  1.6      CIMObjectPath objectPath;
1421                objectPath = _buildInstancePath(name,className,instance);
1422            
1423                objectPath.setHost(System::getHostName());
1424            
1425                objectPath.setNameSpace(name);
1426 karl  1.10 
1427                PEG_METHOD_EXIT();
1428 tony  1.6      return(objectPath);
1429 karl  1.5  }
1430            
1431 tony  1.6  /* Given a class and instance build the instance path for a
1432 karl  1.1     the object.  This builds all components of the path
1433               @param namespace name to build
1434               @return CIMObjectPath containing namespace, class and keybinding 
1435               components of path
1436 tony  1.6     @exceptions - Passes repository exceptions.
1437 karl  1.1  */
1438            
1439            CIMObjectPath InteropProvider::_buildInstancePath(const CIMNamespaceName& name,
1440 tony  1.6                                             const CIMName& className, 
1441 karl  1.1                                             const CIMInstance& instance)
1442            {
1443                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1444 tony  1.6              "InteropProvider::_buildInstancePath");
1445 karl  1.1  
1446                // get the class CIM_Namespace class to use in building path
1447 tony  1.6      // Exception out if Class does not exist in this namespace
1448                CIMClass thisClass = _getClass(name, className);
1449 karl  1.1  
1450                CIMObjectPath ref = instance.buildPath(thisClass);
1451                
1452                PEG_METHOD_EXIT();
1453                return(ref);
1454            }
1455            
1456            /* _isNamespace determines if the namespace in the second
1457               parameter is in the array in the first parameter.
1458                @param array of possible namespaces
1459                @param canidate namespace
1460                @return - true if found
1461            */
1462            Boolean _isNamespace(
1463 tony  1.6              Array<CIMNamespaceName>& namespaceNames,
1464            	        CIMNamespaceName& namespaceName)
1465 karl  1.1  {
1466 karl  1.10     PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1467                        "InteropProvider::_isNamespace");
1468            
1469 karl  1.1       Boolean found = false;
1470                 for(Uint32 i = 0; i < namespaceNames.size(); i++)
1471                 {
1472 tony  1.6          if(namespaceNames[i].equal ( namespaceName ))
1473 karl  1.1              return true;
1474                 }
1475 karl  1.10 
1476                 PEG_METHOD_EXIT();
1477 karl  1.1       return false;
1478            }
1479            
1480            //**************************************************************
1481            // Overloaded functions to get key value with different params
1482            //**************************************************************
1483            
1484 tony  1.6  /*  find the name key in the keybindings and return the value.
1485 karl  1.1      Executes exception if the key not found
1486                @param object path we will search
1487                @param keyName - Name of the key to find.
1488                @return value of name property
1489                @exceptions CIMInvalidParameterException
1490            */
1491            String _getKeyValue(const CIMObjectPath& instanceName, const CIMName& keyName)
1492            {
1493                Array<CIMKeyBinding> kbArray = instanceName.getKeyBindings();
1494            
1495                // find the correct key binding
1496                for (Uint32 i = 0; i < kbArray.size(); i++)
1497                {
1498                    if (kbArray[i].getName() == keyName)
1499                        return (kbArray[i].getValue());
1500                }
1501 tony  1.6  
1502 karl  1.1      throw CIMInvalidParameterException("Invalid key property: " + keyName.getString());
1503            }
1504            
1505            String _getKeyValue(const CIMInstance& instance, const CIMName& keyName)
1506            {
1507                Uint32 pos;
1508                CIMValue propertyValue;
1509            
1510                pos = instance.findProperty(keyName);
1511                if (pos == PEG_NOT_FOUND)
1512                   throw CIMPropertyNotFoundException
1513                       (NAMESPACE_PROPERTYNAME.getString());
1514                
1515                propertyValue = instance.getProperty(pos).getValue();
1516                if (propertyValue.getType() != CIMTYPE_STRING)
1517                   throw CIMInvalidParameterException("Invalid type for property: "
1518                                         + NAMESPACE_PROPERTYNAME.getString());
1519                String name;
1520                propertyValue.get(name);
1521                return(name);
1522                //ATTN: KS Returns String whereas below returns CIMNamespaceName.
1523 karl  1.1  }
1524            
1525            //***************************************************************************
1526            //  The following section is the Instance Operation processors
1527            //***************************************************************************
1528            //                createInstance
1529            //***************************************************************************
1530            void InteropProvider::createInstance(
1531            	const OperationContext & context,
1532            	const CIMObjectPath & instanceReference,
1533                const CIMInstance& myInstance,
1534            	ObjectPathResponseHandler & handler)
1535                {
1536                    PEG_METHOD_ENTER(TRC_CONTROLPROVIDER, "InteropProvider::createInstance()");
1537                    
1538 karl  1.11         handler.processing();
1539 karl  1.1          CIMNamespaceName newNamespaceName;
1540                    CDEBUG("CreateInstance " << instanceReference.toString());
1541                    // operation namespace needed internally to get class.
1542                    _operationNamespace = instanceReference.getNameSpace();
1543                    
1544                    // Verify that ClassName is correct and get value
1545 karl  1.11         targetClass classEnum  = _verifyValidClassInput(instanceReference.getClassName());
1546            
1547 karl  1.1          String userName = _validateUserID(context);
1548                    CIMObjectPath newInstanceReference;
1549 karl  1.11 
1550 karl  1.5          if ((classEnum == CIM_OBJECTMANAGER) || 
1551 tony  1.6              (classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM))
1552 karl  1.5              throw CIMNotSupportedException("InteropProvider, Create Not allowed");
1553 karl  1.1  
1554 karl  1.8          if (classEnum == PG_NAMESPACE)
1555 karl  1.1          {
1556 karl  1.11             // Create local instance to complete any keys.
1557                        CIMInstance localInstance = myInstance.clone();
1558            
1559                        _completeCIMNamespaceKeys(localInstance);
1560 tony  1.6              // Validate that keys are as required. Does its own exception.
1561 karl  1.11             newNamespaceName = _getKeyValue(myInstance, CIM_NAMESPACE_PROPERTY_NAME);
1562            
1563                        newInstanceReference = _buildInstancePath(_operationNamespace,
1564                                                    PG_NAMESPACE_CLASSNAME, localInstance);
1565 karl  1.1          }
1566 tony  1.6  
1567 karl  1.11         else   // Invalid class for the create functions.
1568 karl  1.1          {
1569 karl  1.10             PEGASUS_ASSERT(false);
1570 karl  1.1          }
1571 karl  1.10 
1572 karl  1.1          // Create the new namespace
1573                    try
1574                    {
1575 tony  1.6              PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1576                            "Namespace = " + newNamespaceName.getString() + 
1577                                " to be created.");
1578 karl  1.10             Boolean updatesAllowed = false;
1579                        Boolean shareable = false;
1580                        String parent = String::EMPTY;
1581 karl  1.11 
1582 karl  1.8              CIMRepository::NameSpaceAttributes attributes;
1583 karl  1.10             // optional property.  Set false if not found.
1584                        // ATTN: Should set to class default.
1585 karl  1.8              if (myInstance.findProperty(PG_NAMESPACE_PROPERTY_ISSHAREABLE) != PEG_NOT_FOUND)
1586                        {
1587                            if (_getPropertyValue(myInstance, PG_NAMESPACE_PROPERTY_ISSHAREABLE, false))
1588 karl  1.10                 {
1589 karl  1.8                      attributes.insert("shareable","true");
1590 karl  1.10                     shareable = true;
1591                            }
1592 karl  1.8                  else
1593 karl  1.10                     attributes.insert("shareable", "false");
1594 karl  1.8              }
1595                        else
1596 karl  1.10                 attributes.insert("shareable", "false");
1597 karl  1.8  
1598 karl  1.10             // Optional property.  Set false if not found.
1599 karl  1.8              if (myInstance.findProperty(PG_NAMESPACE_PROPERTY_SCHEMAUPDATESALLOWED) != PEG_NOT_FOUND)
1600                        {
1601                            if (_getPropertyValue(myInstance, PG_NAMESPACE_PROPERTY_SCHEMAUPDATESALLOWED, false))
1602 karl  1.10                 {
1603 karl  1.8                      attributes.insert("updatesAllowed","true");
1604 karl  1.10                     updatesAllowed = true;
1605                            }
1606 karl  1.8                  else
1607                                attributes.insert("updatesAllowed", "false");
1608                        }
1609                        else
1610                            attributes.insert("updatesAllowed", "false");
1611            
1612 karl  1.10             // ATTN: Need to reflect and dependencies between these properties. Right now
1613                        // this lets anything happen.
1614 karl  1.8              if (myInstance.findProperty(PG_NAMESPACE_PROPERTY_PARENTNAMESPACE) != PEG_NOT_FOUND)
1615                        {
1616                            String parent = _getPropertyValue(myInstance, PG_NAMESPACE_PROPERTY_PARENTNAMESPACE, String::EMPTY);
1617                            if (parent != String::EMPTY)
1618 karl  1.10                     attributes.insert("parent",parent);
1619 karl  1.8              }
1620                        _repository->createNameSpace(newNamespaceName, attributes);
1621 karl  1.1          
1622                        PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1623                            "Namespace = " + newNamespaceName.getString() + 
1624                                " successfully created.");
1625 karl  1.10             Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1626                            "Create Namespace: Shareable = $0, Updates allows: $1,  Parent: $2",
1627                            newNamespaceName.getString(), shareable? "true" : "false", shareable? "true" : "false", parent );
1628 karl  1.11 
1629 karl  1.1          }
1630                    catch(CIMException& e)
1631                    {
1632                       PEG_METHOD_EXIT();
1633                       throw e;
1634                    }
1635                    catch(Exception& e)
1636                    {
1637                       PEG_METHOD_EXIT();
1638                       throw e;
1639                    }
1640                    
1641                    // begin processing the request
1642            
1643                   handler.deliver(newInstanceReference);
1644            
1645                   // complete processing the request
1646                   handler.complete();
1647            
1648                   PEG_METHOD_EXIT();
1649                   return;
1650 karl  1.1     }
1651            
1652            //***************************************************************************
1653            //                deleteInstance
1654            //***************************************************************************
1655            void InteropProvider::deleteInstance(
1656            	const OperationContext & context,
1657            	const CIMObjectPath & instanceName,
1658            	ResponseHandler & handler)
1659                {
1660                    PEG_METHOD_ENTER(TRC_CONTROLPROVIDER, "InteropProvider::deleteInstance");
1661 tony  1.6  
1662 karl  1.1          CIMNamespaceName childNamespaceName;
1663                    CIMNamespaceName deleteNamespaceName;
1664                    
1665 tony  1.6          _operationNamespace = instanceName.getNameSpace();
1666                    handler.processing();
1667 karl  1.1          // Verify that ClassName is correct and get value
1668 karl  1.5          targetClass classEnum  = _verifyValidClassInput(instanceName.getClassName());    
1669 karl  1.1          
1670                    String userName = _validateUserID(context);
1671 tony  1.6          
1672                    
1673                    if ((classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM))
1674                        throw CIMNotSupportedException("Delete Not allowed");
1675                    
1676                    // Delete the instance since it may be in persistent storage
1677                    if ((classEnum == CIM_OBJECTMANAGER))
1678                    {
1679                        CIMInstance instance;
1680                        try
1681                        {
1682                        instance = _repository->getInstance(_operationNamespace, instanceName);
1683            
1684                        // If instance found, then delete it.
1685                        _repository->deleteInstance(_operationNamespace,instanceName);
1686            
1687                        PEG_METHOD_EXIT();
1688                        handler.complete();
1689                        return;
1690                        }
1691                        catch(CIMException& e)
1692 tony  1.6              {
1693                            PEG_METHOD_EXIT();
1694                            throw e;
1695                        }
1696                    }
1697 karl  1.1  
1698                    Array<CIMNamespaceName> namespaceNames;
1699                    namespaceNames = _enumerateNameSpaces();
1700 karl  1.8          if (classEnum == PG_NAMESPACE)
1701 karl  1.1          {
1702 karl  1.5              // validate requred keys.  Exception out if not valid
1703                        _validateCIMNamespaceKeys(instanceName);
1704                        
1705 karl  1.1              deleteNamespaceName = _getKeyValue(instanceName, CIM_NAMESPACE_PROPERTY_NAME);
1706                        CDEBUG("Delete namespace = " << deleteNamespaceName );
1707                    }
1708            
1709            	    // ATTN: KS Why THis??? 
1710                    if (deleteNamespaceName.equal (ROOTNS))
1711                   {
1712                       throw CIMNotSupportedException("root namespace cannot be deleted.");
1713                   }
1714            
1715            	   _repository->deleteNameSpace(deleteNamespaceName);
1716            
1717            	   PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1718            	       "Namespace = " + deleteNamespaceName.getString() + 
1719                           " successfully deleted.");
1720 karl  1.5  
1721                   Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1722                       "Interop Provider Delete Namespace: $0",
1723                       deleteNamespaceName.getString());
1724            
1725 karl  1.1         handler.processing();
1726            
1727                   // complete processing the request
1728                   handler.complete();
1729            
1730                   PEG_METHOD_EXIT();
1731                   return ;
1732                }
1733            
1734            //***************************************************************************
1735            //                getInstance
1736            //***************************************************************************
1737            void InteropProvider::getInstance(
1738                const OperationContext & context,
1739                const CIMObjectPath & instanceName,
1740                const Boolean includeQualifiers,
1741                const Boolean includeClassOrigin,
1742 tony  1.6      const CIMPropertyList & propertyList,
1743 karl  1.1      InstanceResponseHandler & handler)
1744                {
1745                    PEG_METHOD_ENTER(TRC_CONTROLPROVIDER, "InteropProvider::getInstance");
1746                    
1747                    // Verify that ClassName is correct and get value
1748 karl  1.5          targetClass classEnum  = _verifyValidClassInput(instanceName.getClassName());    
1749 karl  1.1          
1750                    String userName = _validateUserID(context);
1751                    
1752                    // begin processing the request
1753                    handler.processing();
1754                    if (classEnum == CIM_OBJECTMANAGER)
1755                    {
1756 tony  1.6              CIMInstance instance = _buildInstanceCIMObjectManager(includeQualifiers,
1757                                                    includeClassOrigin, propertyList);
1758 karl  1.1              handler.deliver(instance);
1759                        handler.complete();
1760                        PEG_METHOD_EXIT();
1761                        return;
1762                    }
1763                    
1764 tony  1.6          if (classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM)
1765 karl  1.1          {
1766 tony  1.6              // ATTN: test for correct instance KS: Priority 1    
1767                        Array <CIMInstance> instances = _buildInstancesPGCIMXMLCommunicationMechanism(
1768                                                includeQualifiers,
1769                                                includeClassOrigin, propertyList);
1770                        handler.deliver(instances[0]);
1771 karl  1.1              handler.complete();
1772                        PEG_METHOD_EXIT();
1773                        return;
1774                    }
1775                    
1776                    // Get List of namespaces
1777                    Array<CIMNamespaceName> namespaceNames;
1778                    namespaceNames = _enumerateNameSpaces();
1779                    CIMInstance instance;
1780                    
1781 karl  1.8          if (classEnum == PG_NAMESPACE)
1782 karl  1.1          {
1783                        // Not clear what we have to take into account here.
1784                        // get the namespace from the name value.
1785                        // should check the other keys to see if valid.
1786                        CIMNamespaceName namespaceName;
1787                        namespaceName = _getKeyValue(instanceName, CIM_NAMESPACE_PROPERTY_NAME);
1788 tony  1.6  
1789 karl  1.1              // ATTN: Why this CIMNamespaceName parentNamespaceName = instanceName.getNameSpace();
1790                        if (!_isNamespace(namespaceNames, namespaceName))
1791                        {
1792                            throw CIMObjectNotFoundException("Namespace does not exist: "
1793                                                 + namespaceName.getString());
1794                        }
1795                        PEG_TRACE_STRING(TRC_CONTROLPROVIDER, Tracer::LEVEL4,
1796                           "Namespace = " + namespaceName.getString() + " successfully found.");
1797 tony  1.6  
1798                        instance = _getInstanceCIMNamespace(namespaceName);
1799 karl  1.1          }
1800                    else  // processing for __Namespace
1801                    {
1802 karl  1.10             PEGASUS_ASSERT(false);
1803 karl  1.8          }
1804 karl  1.1  
1805                   handler.deliver(instance);
1806            
1807                   // complete processing the request
1808                   handler.complete();
1809            
1810                   PEG_METHOD_EXIT();
1811                   return ;
1812                }
1813            
1814            //***************************************************************************
1815            //                enumerateInstances
1816            //***************************************************************************
1817            void InteropProvider::enumerateInstances(
1818                const OperationContext & context,
1819                const CIMObjectPath & ref,
1820                const Boolean includeQualifiers,
1821                const Boolean includeClassOrigin,
1822                const CIMPropertyList& propertyList,
1823                InstanceResponseHandler & handler)
1824                {
1825 karl  1.1          PEG_METHOD_ENTER(TRC_CONTROLPROVIDER, "InteropProvider::enumerateInstances()");
1826                    // Verify that ClassName is correct and get value
1827 tony  1.6  
1828 karl  1.5          targetClass classEnum  = _verifyValidClassInput(ref.getClassName());    
1829 karl  1.1          
1830 tony  1.6          // operation namespace needed internally to get class.
1831                    _operationNamespace = ref.getNameSpace();
1832                    //String userName = _validateUserID(context);
1833 karl  1.1          
1834                    // The following 3 classes deliver a single instance because
1835                    // that is all there is today.
1836                    if (classEnum == CIM_OBJECTMANAGER)
1837                    {
1838 tony  1.6              CIMInstance instance = _buildInstanceCIMObjectManager(includeQualifiers,
1839                                                includeClassOrigin,
1840                                                propertyList);
1841 karl  1.10 
1842                        //Array<Sint8> tmp;
1843                        ///XmlWriter::appendInstanceElement(tmp, instance);
1844                        //tmp.append('\0');
1845                        //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1846                        //        "Instance - XML content: $0", tmp.getData());
1847                        ///XmlWriter::printInstanceElement(instance);
1848 karl  1.1              handler.deliver(instance);
1849                        handler.complete();
1850                        PEG_METHOD_EXIT();
1851                        return;
1852                    }
1853                    
1854 tony  1.6          if (classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM)
1855 karl  1.1          {
1856 tony  1.6              Array<CIMInstance> instances = _buildInstancesPGCIMXMLCommunicationMechanism(includeQualifiers,
1857                                                includeClassOrigin, propertyList);
1858                        CDEBUG("Build instances of PGCIMXML. count= " << instances.size());
1859                        handler.deliver(instances);
1860 karl  1.1              handler.complete();
1861                        PEG_METHOD_EXIT();
1862                        return;
1863                    }
1864            
1865            
1866 karl  1.8          if (classEnum == PG_NAMESPACE)
1867 karl  1.1          {
1868 tony  1.6              Array<CIMInstance> instances = _getInstancesCIMNamespace(includeQualifiers,
1869                                                includeClassOrigin, propertyList);
1870            
1871                        handler.deliver(instances);
1872 karl  1.1              handler.complete();
1873                        PEG_METHOD_EXIT();
1874                        return;
1875                    }
1876            
1877                    handler.complete();
1878                    
1879                    PEG_METHOD_EXIT();
1880                }
1881            
1882 karl  1.10 void InteropProvider::modifyObjectManagerInstance(const OperationContext & context,
1883                const CIMObjectPath & instanceReference,
1884                const CIMInstance& modifiedIns,
1885                const Boolean includeQualifiers,
1886                const CIMPropertyList& propertyList,
1887                ResponseHandler & handler)
1888            {
1889                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1890                        "InteropProvider::modifyInstanceManagerInstance");
1891                // the only allowed modification is this one property, statistical data
1892                if (modifiedIns.findProperty(OM_GATHERSTATISTICALDATA) != PEG_NOT_FOUND)
1893                {
1894 karl  1.11         // ATTN: This function is a design problem.
1895                    // ATTN: Should the ifdef include everything????
1896 karl  1.10         // the following is a temporary hack to set the value of the statistics
1897                    // gathering function dynamically.  We simply get the  value from input
1898                    // and call the internal method to set it each time this object is
1899                    // built.
1900            #ifdef PEGASUS_HAS_PERFINST
1901                    StatisticalData* sd = StatisticalData::current();
1902                    Boolean statisticsFlag = _getPropertyValue(modifiedIns, OM_GATHERSTATISTICALDATA, false);  
1903                    sd->setCopyGSD(statisticsFlag);
1904                    if ( ! _getInstanceCIMObjectManager(false, false, CIMPropertyList()))
1905                    {
1906                        _buildInstanceCIMObjectManager(true, true, CIMPropertyList());
1907                    }
1908            
1909                    // ATTN: Think we need to clone here to avoid any issues of overwriting.
1910                    _setPropertyValue(instanceOfCIMObjectManager, OM_GATHERSTATISTICALDATA, statisticsFlag);  
1911                    CIMObjectPath instancePath;
1912 karl  1.11 
1913                    // Modify the object on disk
1914 karl  1.10         try
1915                    {
1916                        _repository->modifyInstance(_operationNamespace,
1917                                       instanceOfCIMObjectManager );
1918                    }
1919                    catch(CIMException& e)
1920                    {
1921                        // ATTN: KS generate log error if this not possible
1922                        PEG_METHOD_EXIT();
1923                        throw e;
1924                    }
1925                    catch(Exception& e)
1926                    {
1927                        // ATTN: Generate log error.
1928                        PEG_METHOD_EXIT();
1929                        throw e;
1930                    }
1931                    Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
1932                        "Interop Provider Set Statistics gathering in CIM_ObjectManager: $0",
1933                        (statisticsFlag? "true" : "false"));
1934 karl  1.11         // modify returns nothing normally.
1935 karl  1.10         return;
1936            #endif
1937 karl  1.8  
1938 karl  1.10     }
1939                PEG_METHOD_EXIT();
1940 karl  1.11     // ATTN Expand this defintion to be more precise since it allows only mod of
1941                // one property and that property MUST be in the instance to be modifiable.
1942 karl  1.10     throw CIMNotSupportedException
1943                    (OM_GATHERSTATISTICALDATA.getString() + " modify operation not supported by Interop Provider");
1944            }
1945 karl  1.1  //***************************************************************************
1946 karl  1.10 //                modifyInstance
1947 karl  1.1  //***************************************************************************
1948 karl  1.8  void InteropProvider::modifyInstance(const OperationContext & context,
1949                const CIMObjectPath & instanceReference,
1950                const CIMInstance& modifiedIns,
1951                const Boolean includeQualifiers,
1952                const CIMPropertyList& propertyList,
1953                ResponseHandler & handler)
1954            {
1955            
1956                PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
1957 karl  1.10             "InteropProvider::modifyInstance");
1958 karl  1.8  
1959                // operation namespace needed internally to get class.
1960 karl  1.10 
1961                // ATTN: KS 31 August 2004. This must test for privileged user.
1962 karl  1.8      _operationNamespace = instanceReference.getNameSpace();
1963                CIMName className =  instanceReference.getClassName();
1964                targetClass classEnum  = _verifyValidClassInput(instanceReference.getClassName());    
1965            
1966                String userName = _validateUserID(context);
1967                // begin processing the request
1968                handler.processing();
1969            
1970                if (classEnum == CIM_OBJECTMANAGER)
1971                {
1972 karl  1.10         modifyObjectManagerInstance(context, instanceReference,modifiedIns,
1973                        includeQualifiers, propertyList, handler);
1974 karl  1.8          // for the moment allow modification of the statistics property only
1975                }
1976            
1977 karl  1.10     else if (classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM)
1978 karl  1.8      {
1979            
1980                    PEG_METHOD_EXIT();
1981                    throw CIMNotSupportedException
1982                        (className.getString() + " not supported by Interop Provider");
1983                }
1984 karl  1.10     else if (classEnum == PG_NAMESPACE)
1985 karl  1.8      {
1986 karl  1.10         // for the moment allow modification of the statistics property only
1987 karl  1.8          PEG_METHOD_EXIT();
1988                    throw CIMNotSupportedException
1989                        (className.getString() + " not supported by Interop Provider");
1990                }
1991 karl  1.10     else
1992                {
1993                    PEGASUS_ASSERT(false);  // should never get here.
1994                }
1995 karl  1.8  
1996 karl  1.10     handler.complete();
1997 karl  1.8      PEG_METHOD_EXIT();
1998                return;
1999            }
2000            
2001 karl  1.10 //***************************************************************************
2002            //                enumerateInstanceNames
2003            //***************************************************************************
2004 karl  1.1  void InteropProvider::enumerateInstanceNames(
2005            	const OperationContext & context,
2006            	const CIMObjectPath & classReference,
2007                    ObjectPathResponseHandler & handler)
2008                {
2009                	PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
2010                            "InteropProvider::enumerateInstanceNames()");
2011            
2012                    // operation namespace needed internally to get class.
2013                    _operationNamespace = classReference.getNameSpace();
2014            
2015 karl  1.5          targetClass classEnum  = _verifyValidClassInput(classReference.getClassName());    
2016 karl  1.1      
2017 tony  1.6          String userName = _validateUserID(context);
2018 karl  1.11 
2019 karl  1.1          // begin processing the request
2020                    handler.processing();
2021                    
2022 karl  1.11         // Deliver a single instance because there should only be one instance.
2023 karl  1.1          if (classEnum == CIM_OBJECTMANAGER)
2024                    {
2025 tony  1.6              CIMInstance instance = _buildInstanceCIMObjectManager( true, true, CIMPropertyList());
2026                        CIMObjectPath ref = _buildInstancePath(_operationNamespace,
2027 karl  1.1                  CIM_OBJECTMANAGER_CLASSNAME, instance);
2028                        handler.deliver(ref);
2029                        handler.complete();
2030                        PEG_METHOD_EXIT();
2031                        return;
2032                    }
2033 karl  1.11 
2034                    // Deliver all possible instances of this class
2035 tony  1.6          if (classEnum == PG_CIMXMLCOMMUNICATIONMECHANISM)
2036 karl  1.1          {
2037 tony  1.6              Array<CIMInstance> instances = _buildInstancesPGCIMXMLCommunicationMechanism(true,
2038                             true, CIMPropertyList());
2039            
2040                        for (Uint32 i = 0 ; i < instances.size() ; i++)
2041                        {
2042                            CIMObjectPath ref = _buildInstancePath(_operationNamespace,
2043                                PG_CIMXMLCOMMUNICATIONMECHANISM_CLASSNAME, instances[i]);
2044                            handler.deliver(ref);
2045                        }
2046 karl  1.1              handler.complete();
2047                        PEG_METHOD_EXIT();
2048                        return;
2049                    }
2050            
2051 karl  1.8          if (classEnum == PG_NAMESPACE)
2052 tony  1.6          {
2053                        Array<CIMInstance> instances = _getInstancesCIMNamespace(false,
2054                                                false, CIMPropertyList());
2055                        CDEBUG("EvalNames. Found instances. Count= " << instances.size());
2056                        for (Uint32 i = 0 ; i < instances.size() ; i++)
2057                        {
2058                            CIMObjectPath ref = _buildInstancePath(_operationNamespace,
2059                                                        CIM_NAMESPACE_CLASSNAME, instances[i]);
2060                            handler.deliver(ref);
2061                        }
2062 karl  1.1  
2063                        handler.complete();
2064                        PEG_METHOD_EXIT();
2065                        return;
2066                    }
2067            
2068 karl  1.11         if (classEnum == CIM_COMMMECHANISMFORMANAGERINST)
2069                    {
2070                        Array<CIMInstance> instances = _buildInstancesCommMechanismForManager();
2071                        for (Uint32 i = 0 ; i < instances.size() ; i++ )
2072                        {
2073                            CIMObjectPath ref = _buildObjectPath(_operationNamespace,
2074                                    CIM_COMMMECHANISMFORMANAGER_CLASSNAME, instances[i]);
2075                            handler.deliver(ref);
2076                        }
2077                    }
2078            
2079                    if (classEnum == CIM_NAMESPACEINMANAGERINST)
2080                    {
2081                        Array<CIMInstance> instances = _buildInstancesNamespaceInManager();
2082                        for (Uint32 i = 0 ; i < instances.size() ; i++ )
2083                        {
2084                            CIMObjectPath ref = _buildObjectPath(_operationNamespace,
2085                                    CIM_NAMESPACEINMANAGER_CLASSNAME, instances[i]);
2086                            handler.deliver(ref);
2087                        }
2088                    }
2089 karl  1.11 
2090            
2091 karl  1.8          // ATTN: Exception response because of error
2092 karl  1.1          PEG_METHOD_EXIT();
2093                }
2094            
2095            //**************************************************************
2096            //**************************************************************
2097            // Association Functions
2098            //**************************************************************
2099            //**************************************************************
2100            
2101            void InteropProvider::associators(
2102            	const OperationContext & context,
2103            	const CIMObjectPath & objectName,
2104            	const CIMName & associationClass,
2105            	const CIMName & resultClass,
2106            	const String & role,
2107            	const String & resultRole,
2108            	const Boolean includeQualifiers,
2109            	const Boolean includeClassOrigin,
2110            	const CIMPropertyList & propertyList,
2111            	ObjectResponseHandler & handler)
2112            {
2113 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
2114                        "InteropProvider::associatorNames()");
2115 karl  1.1  	throw CIMNotSupportedException("AssociationProvider::associators");
2116            }
2117            
2118            void InteropProvider::associatorNames(
2119            	const OperationContext & context,
2120            	const CIMObjectPath & objectName,
2121            	const CIMName & associationClass,
2122            	const CIMName & resultClass,
2123            	const String & role,
2124            	const String & resultRole,
2125            	ObjectPathResponseHandler & handler)
2126            {
2127 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
2128                        "InteropProvider::associatorNames()");
2129 karl  1.1  	throw CIMNotSupportedException("AssociationProvider::associatorNames");
2130            }
2131            
2132            void InteropProvider::references(
2133            	const OperationContext & context,
2134            	const CIMObjectPath & objectName,
2135            	const CIMName & resultClass,
2136            	const String & role,
2137            	const Boolean includeQualifiers,
2138            	const Boolean includeClassOrigin,
2139            	const CIMPropertyList & propertyList,
2140            	ObjectResponseHandler & handler)
2141            {
2142 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
2143                        "InteropProvider::references()");
2144 karl  1.1  	throw CIMNotSupportedException("AssociationProvider::references");
2145            }
2146            
2147 tony  1.6  void _filterAssocInstances(Array<CIMInstance>& instances,
2148                                  CIMName assocClassName,
2149                                  String assocRole,
2150                                  CIMName resultClassName = CIMName(),
2151                                  String resultRole = String::EMPTY)
2152            {
2153                return;
2154            }
2155 karl  1.11 
2156 karl  1.1  void InteropProvider::referenceNames(
2157            	const OperationContext & context,
2158            	const CIMObjectPath & objectName,
2159            	const CIMName & resultClass,
2160            	const String & role,
2161            	ObjectPathResponseHandler & handler)
2162            {
2163 tony  1.6      PEG_METHOD_ENTER(TRC_CONTROLPROVIDER,
2164                        "InteropProvider::referenceNames()");
2165                CDEBUG("::referenceNames(): object= " << objectName.toString() << " result Class= " << resultClass.getString());
2166                                
2167                // operation namespace needed internally to get class.
2168                _operationNamespace = objectName.getNameSpace();
2169                String userName = _validateUserID(context);
2170                // begin processing the request
2171                handler.processing();
2172            
2173                // determine if valid class result class
2174            
2175                CIMName targetAssocClassName = resultClass;
2176                
2177                CIMName targetClassName = objectName.getClassName();
2178            
2179                targetAssocClass classEnum  = _verifyValidAssocClassInput(targetAssocClassName);
2180            
2181                Array<CIMInstance> assocInstances;
2182            
2183                if (classEnum == CIM_COMMMECHANISMFORMANAGER)
2184 tony  1.6          assocInstances = _buildInstancesCommMechanismForManager();
2185            
2186                if (classEnum == CIM_NAMESPACEINMANAGER)
2187                    assocInstances = _buildInstancesNamespaceInManager();
2188            
2189                _filterAssocInstances(assocInstances, resultClass, role);
2190            
2191                for (Uint32 i = 0 ; i < assocInstances.size() ; i++ )
2192                {
2193                    CIMObjectPath ref = _buildObjectPath(_operationNamespace,
2194                            targetAssocClassName, assocInstances[i]);
2195                    CDEBUG("referenceNames returns: " << ref.toString());
2196                    handler.deliver(ref);
2197 karl  1.11     }
2198 tony  1.6  
2199                handler.complete();
2200            
2201                PEG_METHOD_EXIT();
2202                // Convert the instances to referenceNames response
2203 karl  1.1  }
2204            
2205            PEGASUS_NAMESPACE_END
2206            // END_OF_FILE

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2