OW_CMPIAssociatorProviderProxy.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2003-2004 Vintela, Inc., IBM Corp.  All rights reserved.
00003 *
00004 * Redistribution and use in source and binary forms, with or without
00005 * modification, are permitted provided that the following conditions are met:
00006 *
00007 *  - Redistributions of source code must retain the above copyright notice,
00008 *    this list of conditions and the following disclaimer.
00009 *
00010 *  - Redistributions in binary form must reproduce the above copyright notice,
00011 *    this list of conditions and the following disclaimer in the documentation
00012 *    and/or other materials provided with the distribution.
00013 *
00014 *  - Neither the name of Vintela, Inc. nor the names of its
00015 *    contributors may be used to endorse or promote products derived from this
00016 *    software without specific prior written permission.
00017 *
00018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc. OR THE CONTRIBUTORS
00022 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028 * POSSIBILITY OF SUCH DAMAGE.
00029 *
00030 * Author:        Markus Mueller <sedgewick_de@yahoo.de>
00031 *
00032 *******************************************************************************/
00033 #include "OW_config.h"
00034 #include "OW_CMPIAssociatorProviderProxy.hpp"
00035 #include "OW_CIMClass.hpp"
00036 #include "OW_CIMException.hpp"
00037 #include "OW_Format.hpp"
00038 #include "OW_CMPIProviderIFCUtils.hpp"
00039 #include "OW_Logger.hpp"
00040 #include "cmpisrv.h"
00041 
00042 #ifdef OW_HAVE_ALLOCA_H
00043 #include <alloca.h>
00044 #endif
00045 #include <stdlib.h> // for alloca() on FreeBSD
00046 
00047 namespace OW_NAMESPACE
00048 {
00049 
00050 using namespace WBEMFlags;
00051 
00052 namespace
00053 {
00054    const String COMPONENT_NAME("ow.provider.cmpi.ifc");
00055 }
00057 void CMPIAssociatorProviderProxy::associatorNames(
00058    const ProviderEnvironmentIFCRef &env,
00059    CIMObjectPathResultHandlerIFC& result,
00060    const String& ns,
00061    const CIMObjectPath& objectName,
00062    const String& assocClass,
00063    const String& resultClass,
00064    const String& role,
00065    const String& resultRole)
00066 {
00067    OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "CMPIAssociatorProviderProxy::associatorNames()");
00068 
00069    m_ftable->lastAccessTime.setToCurrent();
00070 
00071    if (m_ftable->miVector.assocMI->ft->associatorNames != NULL)
00072    {
00073       CMPIStatus rc = {CMPI_RC_OK, NULL};
00074       ::CMPIOperationContext context;
00075       ProviderEnvironmentIFCRef env2(env);
00076       ::CMPI_Broker localBroker(m_ftable->broker);
00077       localBroker.hdl = static_cast<void *>(&env2);
00078       CMPI_ContextOnStack eCtx(context);
00079       CMPI_ThreadContext thr(&localBroker, &eCtx);
00080 
00081       // initialize path
00082       CIMObjectPath objectNameWithNS(objectName);
00083       objectNameWithNS.setNameSpace(ns);
00084       CMPI_ObjectPathOnStack eRef(objectNameWithNS);
00085       CMPI_ResultOnStack eRes(result);
00086 
00087       char *aClass = const_cast<char*>(assocClass.c_str());
00088 
00089       CMPIFlags flgs = 0;
00090       char *_resultClass = const_cast<char*>(resultClass.empty() ? 0 :
00091          resultClass.c_str());
00092 
00093       char *_role = const_cast<char*>(role.empty() ? 0 : role.c_str());
00094 
00095       char *_resultRole = const_cast<char*>(resultRole.empty() ? 0 :
00096          resultRole.c_str());
00097 
00098       eCtx.ft->addEntry(&eCtx, const_cast<char*>(CMPIInvocationFlags),
00099          (CMPIValue *)&flgs, CMPI_uint32);
00100 
00101 		::CMPIAssociationMI *mi = m_ftable->miVector.assocMI;
00102 
00103       rc = m_ftable->miVector.assocMI->ft->associatorNames(mi, &eCtx, &eRes,
00104          &eRef, aClass, _resultClass, _role, _resultRole);
00105 
00106       if (rc.rc != CMPI_RC_OK)
00107       {
00108          OW_THROWCIMMSG(CIMException::ErrNoType(rc.rc), rc.msg ? CMGetCharPtr(rc.msg) : "");
00109       }
00110    }
00111    else
00112    {
00113       OW_THROWCIMMSG(CIMException::FAILED,
00114          "Provider does not support associatorNames");
00115    }
00116 }
00118 void CMPIAssociatorProviderProxy::associators(
00119    const ProviderEnvironmentIFCRef &env,
00120    CIMInstanceResultHandlerIFC& result,
00121    const String& ns,
00122    const CIMObjectPath& objectName,
00123    const String& assocClass,
00124    const String& resultClass,
00125    const String& role,
00126    const String& resultRole,
00127    EIncludeQualifiersFlag includeQualifiers,
00128    EIncludeClassOriginFlag includeClassOrigin,
00129    const StringArray *propertyList)
00130 {
00131    OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "CMPIAssociatorProviderProxy::associators()");
00132 
00133    m_ftable->lastAccessTime.setToCurrent();
00134 
00135    if (m_ftable->miVector.assocMI->ft->associators != NULL)
00136    {
00137       const char **props = NULL;
00138       int pCount = 0;
00139 
00140       CMPIStatus rc = {CMPI_RC_OK, NULL};
00141       ::CMPIOperationContext context;
00142       ProviderEnvironmentIFCRef env2(env);
00143       ::CMPI_Broker localBroker(m_ftable->broker);
00144       localBroker.hdl = static_cast<void *>(&env2);
00145       CMPI_ContextOnStack eCtx(context);
00146       CMPI_ThreadContext thr(&localBroker, &eCtx);
00147       // initialize path
00148       CIMObjectPath objectNameWithNS(objectName);
00149       objectNameWithNS.setNameSpace(ns);
00150       CMPI_ObjectPathOnStack eRef(objectNameWithNS);
00151       CMPI_ResultOnStack eRes(result);
00152    
00153       char* aClass = const_cast<char*>(assocClass.c_str());
00154    
00155       if (propertyList && propertyList->size() > 0)
00156       {
00157          pCount = propertyList->size();
00158          props = reinterpret_cast<const char **>
00159             (alloca(1+pCount*sizeof(char *)));
00160    
00161          for (int i = 0; i < pCount; i++)
00162          {
00163             props[i]= const_cast<char*>((*propertyList)[i].c_str());
00164          }
00165    
00166          props[pCount]=NULL;
00167       }
00168    
00169       CMPIFlags flgs = 0;
00170    
00171       if (includeQualifiers)
00172       {
00173          flgs |= CMPI_FLAG_IncludeQualifiers;
00174       }
00175    
00176       if (includeClassOrigin)
00177       {
00178          flgs |= CMPI_FLAG_IncludeClassOrigin;
00179       }
00180    
00181       char *_resultClass = const_cast<char*>(resultClass.empty() ? 0 :
00182          resultClass.c_str());
00183    
00184       char *_role = const_cast<char*>(role.empty() ? 0 : role.c_str());
00185    
00186       char * _resultRole = const_cast<char*>(resultRole.empty() ? 0 :
00187          resultRole.c_str());
00188    
00189       eCtx.ft->addEntry(&eCtx, const_cast<char*>(CMPIInvocationFlags),
00190          (CMPIValue *)&flgs, CMPI_uint32);
00191 	
00192 		::CMPIAssociationMI * mi = m_ftable->miVector.assocMI;
00193    
00194       rc=m_ftable->miVector.assocMI->ft->associators(
00195          mi,&eCtx,&eRes,&eRef, aClass,
00196          _resultClass, _role, _resultRole, props);
00197    
00198       if (rc.rc != CMPI_RC_OK)
00199       {
00200          OW_THROWCIMMSG(CIMException::ErrNoType(rc.rc), rc.msg ? CMGetCharPtr(rc.msg) : "");
00201       }
00202    }
00203    else
00204    {
00205       OW_THROWCIMMSG(CIMException::FAILED,
00206          "Provider does not support associators");
00207    }
00208 }
00210 void CMPIAssociatorProviderProxy::references(
00211    const ProviderEnvironmentIFCRef &env,
00212    CIMInstanceResultHandlerIFC& result,
00213    const String& ns,
00214    const CIMObjectPath& objectName,
00215    const String& resultClass,
00216    const String& role,
00217    EIncludeQualifiersFlag includeQualifiers,
00218    EIncludeClassOriginFlag includeClassOrigin,
00219    const StringArray *propertyList)
00220 {
00221    OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "CMPIAssociatorProviderProxy::references()");
00222 
00223    m_ftable->lastAccessTime.setToCurrent();
00224 
00225    if (m_ftable->miVector.assocMI->ft->references != NULL)
00226    {
00227       const char **props = NULL;
00228       int pCount = 0;
00229 
00230       CMPIStatus rc = {CMPI_RC_OK, NULL};
00231       ::CMPIOperationContext context;
00232       ProviderEnvironmentIFCRef env2(env);
00233 
00234       ::CMPI_Broker localBroker(m_ftable->broker);
00235       localBroker.hdl = static_cast<void *>(&env2);
00236 
00237       CMPI_ContextOnStack eCtx(context);
00238       CMPI_ThreadContext thr(&localBroker, &eCtx);
00239       // initialize path
00240       CIMObjectPath objectNameWithNS(objectName);
00241       objectNameWithNS.setNameSpace(ns);
00242       CMPI_ObjectPathOnStack eRef(objectNameWithNS);
00243       CMPI_ResultOnStack eRes(result);
00244       char *aClass = const_cast<char*>(resultClass.c_str());
00245 
00246       if (propertyList)
00247       {
00248          if (propertyList->size() > 0)
00249          {
00250             pCount = propertyList->size();
00251             props = reinterpret_cast<const char **>
00252                (alloca(1+pCount*sizeof(char *)));
00253 
00254             for (int i = 0; i < pCount; i++)
00255             {
00256                props[i] = ((*propertyList)[i].c_str());
00257             }
00258 
00259             props[pCount] = NULL;
00260          }
00261       }
00262 
00263       CMPIFlags flgs = 0;
00264 
00265       if (includeQualifiers)
00266       {
00267          flgs |= CMPI_FLAG_IncludeQualifiers;
00268       }
00269 
00270       if (includeClassOrigin)
00271       {
00272          flgs |= CMPI_FLAG_IncludeClassOrigin;
00273       }
00274 
00275       char *_role = const_cast<char*>(role.empty() ? 0 : role.c_str());
00276       eCtx.ft->addEntry(&eCtx, const_cast<char*>(CMPIInvocationFlags),
00277          (CMPIValue *)&flgs, CMPI_uint32);
00278 
00279 		::CMPIAssociationMI *mi = m_ftable->miVector.assocMI;
00280       rc=m_ftable->miVector.assocMI->ft->references(mi, &eCtx, &eRes, &eRef,
00281          aClass, _role, props);
00282 
00283       if (rc.rc != CMPI_RC_OK)
00284       {
00285          OW_THROWCIMMSG(CIMException::ErrNoType(rc.rc), rc.msg ? CMGetCharPtr(rc.msg) : "");
00286       }
00287    }
00288    else
00289    {
00290       OW_THROWCIMMSG(CIMException::FAILED,
00291          "Provider does not support references");
00292    }
00293 }
00295 void CMPIAssociatorProviderProxy::referenceNames(
00296    const ProviderEnvironmentIFCRef &env,
00297    CIMObjectPathResultHandlerIFC& result,
00298    const String& ns,
00299    const CIMObjectPath& objectName,
00300    const String& resultClass,
00301    const String& role)
00302 {
00303    OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "CMPIAssociatorProviderProxy::referenceNames()");
00304 
00305    m_ftable->lastAccessTime.setToCurrent();
00306 
00307    if (m_ftable->miVector.assocMI->ft->referenceNames != NULL)
00308    {
00309       CMPIStatus rc = {CMPI_RC_OK, NULL};
00310       ::CMPIOperationContext context;
00311 
00312       ProviderEnvironmentIFCRef env2(env);
00313       ::CMPI_Broker localBroker(m_ftable->broker);
00314       localBroker.hdl = static_cast<void *>(&env2);
00315 
00316       CMPI_ContextOnStack eCtx(context);
00317       CMPI_ThreadContext thr(&localBroker, &eCtx);
00318 
00319       // initialize path
00320       CIMObjectPath objectNameWithNS(objectName);
00321       objectNameWithNS.setNameSpace(ns);
00322 
00323       CMPI_ObjectPathOnStack eRef(objectNameWithNS);
00324       CMPI_ResultOnStack eRes(result);
00325       char* aClass = const_cast<char*>(resultClass.c_str());
00326       CMPIFlags flgs = 0;
00327       char* _role = const_cast<char*>(role.empty() ? 0 : role.c_str());
00328       eCtx.ft->addEntry(&eCtx, const_cast<char*>(CMPIInvocationFlags),
00329          (CMPIValue *)&flgs, CMPI_uint32);
00330 
00331 		::CMPIAssociationMI * mi = m_ftable->miVector.assocMI;
00332       rc = m_ftable->miVector.assocMI->ft->referenceNames(
00333          mi, &eCtx, &eRes, &eRef, aClass, _role);
00334 
00335       if (rc.rc != CMPI_RC_OK)
00336       {
00337          OW_THROWCIMMSG(CIMException::ErrNoType(rc.rc), rc.msg ? CMGetCharPtr(rc.msg) : "");
00338       }
00339    }
00340    else
00341    {
00342       OW_THROWCIMMSG(CIMException::FAILED,
00343          "Provider does not support referenceNames");
00344    }
00345 }
00346 
00347 } // end namespace OW_NAMESPACE
00348 

Generated on Thu Feb 9 08:47:56 2006 for openwbem by  doxygen 1.4.6