(file) Return to CMPI_BrokerEnc.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

File: [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI / CMPI_BrokerEnc.cpp (download)
Revision: 1.47, Wed Apr 4 11:36:11 2007 UTC (17 years, 3 months ago) by marek
Branch: MAIN
CVS Tags: TASK-PEP286_PRIVILEGE_SEPARATION-root, TASK-PEP286_PRIVILEGE_SEPARATION-branch, TASK-PEP274_dacim-root, TASK-PEP274_dacim-merged_out_to_branch, TASK-PEP274_dacim-merged_out_from_trunk, TASK-PEP274_dacim-merged_in_to_trunk, TASK-PEP274_dacim-merged_in_from_branch, TASK-PEP274_dacim-branch, TASK-Bug2102Final-root, TASK-Bug2102Final-merged_out_to_branch, TASK-Bug2102Final-merged_out_from_trunk, TASK-Bug2102Final-merged_in_to_trunk, TASK-Bug2102Final-merged_in_from_branch, TASK-Bug2102Final-branch
Changes since 1.46: +47 -45 lines
BUG#:6301
TITLE: Tracing integration of CMPI into OpenPegasus at least questionable

DESCRIPTION:

//%2006////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
// IBM Corp.; EMC Corporation, The Open Group.
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
// EMC Corporation; VERITAS Software Corporation; The Open Group.
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
// EMC Corporation; Symantec Corporation; The Open Group.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//==============================================================================
//
//%/////////////////////////////////////////////////////////////////////////////

#include <Pegasus/Common/CIMNameUnchecked.h>
#include "CMPI_Version.h"

#include "CMPI_Object.h"
#include "CMPI_Broker.h"
#include "CMPI_Ftabs.h"
#include "CMPI_String.h"
#include "CMPI_SelectExp.h"

#include <Pegasus/Common/CIMName.h>
#include <Pegasus/Common/CIMPropertyList.h>
#if defined (CMPI_VER_85)
#include <Pegasus/Common/MessageLoader.h>
#include <Pegasus/Common/LanguageParser.h>
#endif
#if defined(CMPI_VER_100)
#include <Pegasus/Common/Logger.h>
#include <Pegasus/Common/TraceComponents.h>
#include <Pegasus/Common/Tracer.h>
#endif

#include <Pegasus/Provider/CIMOMHandle.h>
#include <Pegasus/WQL/WQLSelectStatement.h>
#include <Pegasus/WQL/WQLParser.h>

#ifndef PEGASUS_DISABLE_CQL
#include <Pegasus/Provider/CIMOMHandleQueryContext.h>
#include <Pegasus/CQL/CQLSelectStatement.h>
#include <Pegasus/CQL/CQLParser.h>
#include <Pegasus/CQL/CQLChainedIdentifier.h>
#include <Pegasus/Provider/CMPI/cmpi_cql.h>
#endif

#include <stdarg.h>
#include <string.h>

PEGASUS_USING_STD;
PEGASUS_NAMESPACE_BEGIN
#define DDD(X)   if (_cmpi_trace) X;

extern int _cmpi_trace;

#if defined(PEGASUS_OS_TYPE_WINDOWS)
   #define lloonngg __int64
#else
   #define lloonngg long long int
#endif

// Factory section

static String typeToString(CIMType t) {
   switch (t) {
	   case CIMTYPE_BOOLEAN:   return "boolean";
	   case CIMTYPE_UINT8:     return "uint8";
	   case CIMTYPE_SINT8:     return "sint8";
	   case CIMTYPE_UINT16:    return "uint16";
	   case CIMTYPE_SINT16:    return "sint16";
	   case CIMTYPE_UINT32:    return "uint32";
	   case CIMTYPE_SINT32:    return "sint32";
	   case CIMTYPE_UINT64:    return "sint64";
	   case CIMTYPE_SINT64:    return "sint64";
	   case CIMTYPE_REAL32:    return "real32";
	   case CIMTYPE_REAL64:    return "real64";
	   case CIMTYPE_CHAR16:    return "char16";
	   case CIMTYPE_STRING:    return "string";
	   case CIMTYPE_DATETIME:  return "datetime";
       case CIMTYPE_REFERENCE: return "reference";
       case CIMTYPE_OBJECT:    return "object";
#ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
       case CIMTYPE_INSTANCE:    return "instance";
#endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
      default: return "???";
   }
}

#define CMPIInstance_str "CMPIInstance"
#define CMPIInstance_str_l 13

#define CMPIObjectPath_str "CMPIObjectPath"
#define CMPIObjectPath_str_l 16

#define CMPIArgs_str "CMPIArgs"
#define CMPIArgs_str_l 8

#define CMPIContext_str "CMPIContext"
#define CMPIContext_str_l 11

#define CMPIResult_str "CMPIResult"
#define CMPIResult_str_l 12

#define CMPIDateTime_str "CMPIDateTime"
#define CMPIDateTime_str_l 12

#define CMPIArray_str "CMPIArray"
#define CMPIArray_str_l 9

#define CMPIString_str "CMPIString"
#define CMPIString_str_l 10

#define CMPISelectExp_str "CMPISelectExp"
#define CMPISelectExp_str_l 13

#define CMPISelectCond_str "CMPISelectCond"
#define CMPISelectCond_str_l 14

#define CMPISubCond_str "CMPISubCond"
#define CMPISubCond_str_l 11

#define CMPIPredicate_str "CMPIPredicate"
#define CMPIPredicate_str_l 13

#define CMPIBroker_str "CMPIBroker"
#define CMPIBroker_str_l 10

#define CMPIEnumeration_str "CMPIEnumeration"
#define CMPIEnumeration_str_l 15



static Formatter::Arg formatValue(va_list *argptr, CMPIStatus *rc, int *err) {

   CMPIType type=va_arg(*argptr,int);
   if (rc) CMSetStatus(rc,CMPI_RC_OK);

   if (*err) return Formatter::Arg("*failed*");

   switch(type) {
   case CMPI_sint8:
   case CMPI_sint16:
   case CMPI_sint32:
      return Formatter::Arg((int)va_arg(*argptr,int));
   case CMPI_uint8:
   case CMPI_uint16:
   case CMPI_uint32:
      return Formatter::Arg((unsigned int)va_arg(*argptr,unsigned int));
   case CMPI_boolean:
      return Formatter::Arg((Boolean)va_arg(*argptr,int));
   case CMPI_real32:
   case CMPI_real64:
      return Formatter::Arg((double)va_arg(*argptr,double));
   case CMPI_sint64:
      return Formatter::Arg((lloonngg)va_arg(*argptr,lloonngg));
   case CMPI_uint64:
      return Formatter::Arg((unsigned lloonngg)va_arg(*argptr,unsigned lloonngg));
   case CMPI_chars:
      return Formatter::Arg((char*)va_arg(*argptr,char*));
   case CMPI_string: {
      CMPIString *s=va_arg(*argptr,CMPIString*);
      return Formatter::Arg((char*)CMGetCharsPtr(s,NULL));
   }
   default:
      *err=1;
      if (rc) rc->rc=CMPI_RC_ERR_INVALID_PARAMETER;
      return Formatter::Arg("*bad value type*");
   }
}


static inline CIMNamespaceName NameSpaceName(const char *ns) {

    CIMNamespaceName n;
    if (ns==NULL) return n;
    try  {
       n = CIMNamespaceName(ns);
    } catch (...)
    {
         // n won't be assigned to anything yet, so it is safe
         // to send it off.
    }
    return n;
}

static inline CIMName Name(const char *n) {
    CIMName name;
    if (n==NULL) return name;
    try {
       name = CIMNameUnchecked(n);
     } catch ( ...)
     {
     }
     return name;
}


extern "C" {

   static CMPIString* mbEncToString(const CMPIBroker*,const void *o, CMPIStatus *rc);

   static CMPIInstance* mbEncNewInstance(const CMPIBroker* mb, const CMPIObjectPath* eCop,
                                       CMPIStatus *rc) {
      if (!eCop) {
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	    return NULL;
	  }
      CIMObjectPath* cop=(CIMObjectPath*)eCop->hdl;
	  if (!cop) {
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	    return NULL;
	  }

   //   cout<<"--- mbEncNewInstance() "<<cop->getClassName()<<"-"<<cop->getNameSpace()<<endl;
      CIMClass *cls=mbGetClass(mb,*cop);
      CIMInstance *ci=NULL;

      if (cls) {
         const CMPIContext *ctx=CMPI_ThreadContext::getContext();
         CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,rc).value.uint32;
         CIMInstance newInst = cls->buildInstance(
             Boolean(flgs & CMPI_FLAG_IncludeQualifiers),
             false,
             CIMPropertyList());

         ci = new CIMInstance(newInst);
      }
      else {
         if (rc) CMSetStatus(rc,CMPI_RC_ERR_NOT_FOUND);
         return NULL;
      }

      ci->setPath(*cop);
      CMPIInstance* neInst=reinterpret_cast<CMPIInstance*>(new CMPI_Object(ci));
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
   //   CMPIString *str=mbEncToString(mb,neInst,NULL);
      return neInst;
   }

   static CMPIObjectPath* mbEncNewObjectPath(const CMPIBroker* mb, const char *ns, const char *cls,
                     CMPIStatus *rc) {
   //   cout<<"--- mbEncNewObjectPath() "<<ns<<"-"<<cls<<endl;
      Array<CIMKeyBinding> keyBindings;
      String host;
      CIMName className;
	  if (cls)	className=Name(cls);
		else
				className=Name("");
      CIMNamespaceName nameSpace;
	  if (ns)	nameSpace =NameSpaceName(ns);
		else
				nameSpace=NameSpaceName("");
      CIMObjectPath *cop=new CIMObjectPath(host,nameSpace,className,keyBindings);
      CMPIObjectPath *nePath=reinterpret_cast<CMPIObjectPath*>(new CMPI_Object(cop));
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      return nePath;
   }

   static CMPIArgs* mbEncNewArgs(const CMPIBroker* mb, CMPIStatus *rc) {
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      return reinterpret_cast<CMPIArgs*>(new CMPI_Object(new Array<CIMParamValue>()));
   }

   static CMPIString* mbEncNewString(const CMPIBroker* mb, const char *cStr, CMPIStatus *rc) {
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
	  if (cStr == NULL)
      	return reinterpret_cast<CMPIString*>(new CMPI_Object((char*)NULL));
      return reinterpret_cast<CMPIString*>(new CMPI_Object(cStr));
   }

   CMPIString* mbIntNewString(const char *s) {
      return mbEncNewString(NULL,s,NULL);
   }

   CMPIArray* mbEncNewArray(const CMPIBroker* mb, CMPICount count, CMPIType type,
                                 CMPIStatus *rc) {
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      CMPIData *dta=new CMPIData[count+1];
      dta->type=type;
      dta->value.uint32=count;
      for (unsigned int i=1; i<=count; i++) {
         dta[i].type=type;
         dta[i].state=CMPI_nullValue;
         dta[i].value.uint64=0;
      }
      return reinterpret_cast<CMPIArray*>(new CMPI_Object(dta));
   }

   extern CMPIDateTime *newDateTime();

   static CMPIDateTime* mbEncNewDateTime(const CMPIBroker* mb, CMPIStatus *rc) {
   // cout<<"--- mbEncNewDateTime()"<<endl;
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      return newDateTime();
   }

   extern CMPIDateTime *newDateTimeBin(CMPIUint64,CMPIBoolean);

   static CMPIDateTime* mbEncNewDateTimeFromBinary(const CMPIBroker* mb, CMPIUint64 time,
         CMPIBoolean interval ,CMPIStatus *rc) {
   // cout<<"--- mbEncNewDateTimeFromBinary()"<<endl;
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      return newDateTimeBin(time,interval);
   }

   extern CMPIDateTime *newDateTimeChar(const char*);

   static CMPIDateTime* mbEncNewDateTimeFromString(const CMPIBroker* mb, const char *t ,CMPIStatus *rc) {
   //   cout<<"--- mbEncNewDateTimeFromString()"<<endl;
	  CMPIDateTime *date = NULL;
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      date=newDateTimeChar(t);
	  if (!date)
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	  return date;
   }

#if defined(CMPI_VER_200)
  extern CMPIError *newCMPIError(const char*, const char*, const char*,
      const CMPIErrorSeverity, const CMPIErrorProbableCause, const CMPIrc);

  static CMPIError* mbEncNewCMPIError (const CMPIBroker* mb, 
      const char* owner, const char* msgID, const char* msg,
      const CMPIErrorSeverity sev, const CMPIErrorProbableCause pc,
      const CMPIrc cimStatusCode, CMPIStatus* rc)
  {
      CMPIError* cmpiError;
      if (rc)
      {
          CMSetStatus(rc,CMPI_RC_OK);
      }
      cmpiError = newCMPIError(owner, msgID, msg, sev, pc, cimStatusCode);
	  if (!cmpiError)
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
      return cmpiError;
  }
#endif

   static CMPIString* mbEncToString(const CMPIBroker*,const void *o, CMPIStatus *rc) {
      CMPI_Object *obj=(CMPI_Object*)o;
      String str;
      char msg[128];
      if (obj==NULL) {
         sprintf(msg,"** Null object ptr (%p) **",o);
         if (rc) CMSetStatus(rc,CMPI_RC_ERR_FAILED);
         return reinterpret_cast<CMPIString*>(new CMPI_Object(msg));
      }

      if (obj->getHdl()==NULL) {
         sprintf(msg,"** Null object hdl (%p) **",o);
         if (rc) CMSetStatus(rc,CMPI_RC_ERR_FAILED);
         return reinterpret_cast<CMPIString*>(new CMPI_Object(msg));
      }

      if (obj->getFtab()==(void*)CMPI_Instance_Ftab ||
         obj->getFtab()==(void*)CMPI_InstanceOnStack_Ftab) {
         CIMInstance *ci=(CIMInstance*)obj->getHdl();
         str="Instance of "+ci->getClassName().getString()+" {\n";
         for (int i=0,m=ci->getPropertyCount(); i<m; i++) {
            CIMConstProperty p=ci->getProperty(i);
            str.append("  "+typeToString(p.getType())+
               " "+p.getName().getString()+
               " = "+p.getValue().toString()+";\n");
         }
         str.append("};\n");
      }

      else if (obj->getFtab()==(void*)CMPI_ObjectPath_Ftab ||
         obj->getFtab()==(void*)CMPI_ObjectPathOnStack_Ftab) {
         str=((CIMObjectPath*)obj->getHdl())->toString();
      }
	  else if (obj->getFtab()==(void*)CMPI_String_Ftab) {
		str=String((const char*)obj->getHdl());
	  }
	  else if (obj->getFtab()==(void*)CMPI_Args_Ftab ||
			  obj->getFtab()==(void*)CMPI_ArgsOnStack_Ftab)
			  {
			      const Array<CIMParamValue>* arg=(Array<CIMParamValue>*)obj->getHdl();
				  for (int i=0,m=arg->size(); i < m; i++) {
						  const CIMParamValue &p=(*arg)[i];
				  		  str.append(p.getParameterName()+":"+p.getValue().toString()+"\n");
				 }
			  }
      else {
         sprintf(msg,"** Object not recognized (%p) **",o);
         if (rc) CMSetStatus(rc,CMPI_RC_ERR_FAILED);
         return reinterpret_cast<CMPIString*>(new CMPI_Object(msg));
      }

      sprintf(msg,"%p: ",o);
      return reinterpret_cast<CMPIString*>(new CMPI_Object(String(msg)+str));
   }

   static CMPIBoolean mbEncClassPathIsA(const CMPIBroker *mb, const CMPIObjectPath *eCp, const char *type, CMPIStatus *rc) {

	  if ((eCp==NULL) || (type==NULL)) {
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	    return false;
	  }
      if (CIMName::legal(type) == false)
		{
      if (rc) CMSetStatus(rc,CMPI_RC_ERR_INVALID_CLASS);
	   return 0;
		}
      CIMObjectPath* cop=(CIMObjectPath*)eCp->hdl;

      const CIMName tcn(type);

      if (tcn==cop->getClassName()) return 1;

      CIMClass *cc=mbGetClass(mb,*cop);
      if (cc==NULL) return 0;
      CIMObjectPath  scp(*cop);
      scp.setClassName(cc->getSuperClassName());

      for (; !scp.getClassName().isNull(); ) {
         cc=mbGetClass(mb,scp);
         if (cc==NULL) return 0;
         if (cc->getClassName()==tcn) return 1;
         scp.setClassName(cc->getSuperClassName());
      };
      return 0;
   }

   static CMPIBoolean mbEncIsOfType(const CMPIBroker *mb, const void *o, const char *type, CMPIStatus *rc) {
      CMPI_Object *obj=(CMPI_Object*)o;
      char msg[128];
      void *Ftab = NULL;

      if (obj==NULL) {
         sprintf(msg,"** Null object ptr (%p) **",o);
         if (rc) { CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg); }
         return 0;
      }

      if (rc) CMSetStatus(rc,CMPI_RC_OK);

      Ftab = obj->getFtab();

      if (((Ftab==(void*)CMPI_Instance_Ftab) || (Ftab==(void*)CMPI_InstanceOnStack_Ftab)) &&
            strncmp(type,CMPIInstance_str, CMPIInstance_str_l)==0) return 1;
      if (((Ftab==(void*)CMPI_ObjectPath_Ftab) || (Ftab==(void*)CMPI_ObjectPathOnStack_Ftab)) &&
            strncmp(type,CMPIObjectPath_str, CMPIObjectPath_str_l)==0) return 1;

      if (((Ftab==(void*)CMPI_Args_Ftab) || (Ftab==(void*)CMPI_ArgsOnStack_Ftab)) &&
            strncmp(type,CMPIArgs_str, CMPIArgs_str_l)==0) return 1;

      if (((Ftab==(void*)CMPI_Context_Ftab) || (Ftab==(void*)CMPI_ContextOnStack_Ftab)) &&
            strncmp(type,CMPIContext_str, CMPIContext_str_l)==0) return 1;

      if (((Ftab==(void*)CMPI_ResultRefOnStack_Ftab) || (Ftab==(void*)CMPI_ResultInstOnStack_Ftab) ||
		   (Ftab==(void*)CMPI_ResultData_Ftab) || (Ftab==(void*)CMPI_ResultMethOnStack_Ftab) ||
           (Ftab==(void*)CMPI_ResultResponseOnStack_Ftab) || (Ftab==(void*)CMPI_ResultExecQueryOnStack_Ftab)) &&
            strncmp(type,CMPIResult_str, CMPIResult_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_DateTime_Ftab &&
            strncmp(type,CMPIDateTime_str, CMPIDateTime_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_Array_Ftab &&
            strncmp(type,CMPIArray_str, CMPIArray_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_String_Ftab &&
            strncmp(type,CMPIString_str, CMPIString_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_SelectExp_Ftab &&
            strncmp(type,CMPISelectExp_str, CMPISelectExp_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_SelectCond_Ftab &&
            strncmp(type,CMPISelectCond_str, CMPISelectCond_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_SubCond_Ftab &&
            strncmp(type,CMPISubCond_str, CMPISubCond_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_Predicate_Ftab &&
            strncmp(type,CMPIPredicate_str, CMPIPredicate_str_l)==0) return 1;

      if (Ftab==(void*)CMPI_Broker_Ftab &&
            strncmp(type,CMPIBroker_str, CMPIBroker_str_l)==0) return 1;

      if (((Ftab==(void*)CMPI_ObjEnumeration_Ftab) ||
		  (Ftab==(void*)CMPI_InstEnumeration_Ftab) ||
          (Ftab==(void*)CMPI_OpEnumeration_Ftab)) &&
            strncmp(type,CMPIEnumeration_str, CMPIEnumeration_str_l)==0) return 1;

      sprintf(msg,"** Object not recognized (%p) **",o);
      if (rc) { CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg); }
      return 0;
   }

   static CMPIString* mbEncGetType(const CMPIBroker *mb,const  void* o, CMPIStatus *rc) {
      CMPI_Object *obj=(CMPI_Object*)o;
      char msg[128];
      void *Ftab= NULL;

      if (obj==NULL) {
         sprintf(msg,"** Null object ptr (%p) **",o);
         if (rc) { CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg); }
         return 0;
      }

      if (rc) CMSetStatus(rc,CMPI_RC_OK);
	  Ftab = obj->getFtab();

      if ((Ftab==(void*)CMPI_Instance_Ftab) || (Ftab==(void*)CMPI_InstanceOnStack_Ftab))
            return mb->eft->newString(mb,CMPIInstance_str,rc);

      if ((Ftab==(void*)CMPI_ObjectPath_Ftab) || (Ftab==(void*)CMPI_ObjectPathOnStack_Ftab))
            return mb->eft->newString(mb,CMPIObjectPath_str,rc);

      if ((Ftab==(void*)CMPI_Args_Ftab) || (Ftab==(void*)CMPI_ArgsOnStack_Ftab))
            return mb->eft->newString(mb,CMPIArgs_str,rc);

      if ((Ftab==(void*)CMPI_Context_Ftab) || (Ftab==(void*)CMPI_ContextOnStack_Ftab))
            return mb->eft->newString(mb,CMPIContext_str,rc);

      if ((Ftab==(void*)CMPI_ResultRefOnStack_Ftab) || (Ftab==(void*)CMPI_ResultInstOnStack_Ftab) ||
		   (Ftab==(void*)CMPI_ResultData_Ftab) || (Ftab==(void*)CMPI_ResultMethOnStack_Ftab) ||
           (Ftab==(void*)CMPI_ResultResponseOnStack_Ftab) || (Ftab==(void*)CMPI_ResultExecQueryOnStack_Ftab))
            return mb->eft->newString(mb,CMPIResult_str,rc);

      if (Ftab==(void*)CMPI_DateTime_Ftab)
            return mb->eft->newString(mb,CMPIDateTime_str,rc);

      if (Ftab==(void*)CMPI_Array_Ftab)
            return mb->eft->newString(mb,CMPIArray_str,rc);

      if (Ftab==(void*)CMPI_String_Ftab)
            return mb->eft->newString(mb,CMPIString_str,rc);

      if (Ftab==(void*)CMPI_SelectExp_Ftab)
            return mb->eft->newString(mb,CMPISelectExp_str,rc);

      if (Ftab==(void*)CMPI_SelectCond_Ftab)
            return mb->eft->newString(mb,CMPISelectCond_str,rc);

      if (Ftab==(void*)CMPI_SubCond_Ftab)
            return mb->eft->newString(mb,CMPISubCond_str,rc);

      if (Ftab==(void*)CMPI_Predicate_Ftab)
            return mb->eft->newString(mb,CMPIPredicate_str,rc);

      if (Ftab==(void*)CMPI_Broker_Ftab)
            return mb->eft->newString(mb,CMPIBroker_str,rc);

      if ((Ftab==(void*)CMPI_ObjEnumeration_Ftab) ||
		  (Ftab==(void*)CMPI_InstEnumeration_Ftab) ||
          (Ftab==(void*)CMPI_OpEnumeration_Ftab))
            return mb->eft->newString(mb,CMPIEnumeration_str,rc);

      sprintf(msg,"** Object not recognized (%p) **",o);
      if (rc) { CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,msg); }
      return 0;
   }

#if defined (CMPI_VER_85)

   static CMPIString* mbEncGetMessage(const CMPIBroker *mb, const char *msgId, const char *defMsg,
               CMPIStatus* rc, CMPICount count, ...) {

      MessageLoaderParms parms(msgId,defMsg);
      DDD(cout<<"--- mbEncGetMessage() count: "<<count<<endl);
      int err=0;
      if (rc) rc->rc=CMPI_RC_OK;

      if (count>0) {
         va_list argptr;
         va_start(argptr,count);
         for (;;) {
            if (count>0) parms.arg0=formatValue(&argptr,rc,&err);
            else break;
            if (count>1) parms.arg1=formatValue(&argptr,rc,&err);
            else break;
            if (count>2) parms.arg2=formatValue(&argptr,rc,&err);
            else break;
            if (count>3) parms.arg3=formatValue(&argptr,rc,&err);
            else break;
            if (count>4) parms.arg4=formatValue(&argptr,rc,&err);
            else break;
            if (count>5) parms.arg5=formatValue(&argptr,rc,&err);
            else break;
            if (count>6) parms.arg6=formatValue(&argptr,rc,&err);
            else break;
            if (count>7) parms.arg7=formatValue(&argptr,rc,&err);
            else break;
            if (count>8) parms.arg8=formatValue(&argptr,rc,&err);
            else break;
            if (count>9) parms.arg9=formatValue(&argptr,rc,&err);
            break;
         }
         va_end(argptr);
      }
      String nMsg=MessageLoader::getMessage(parms);
      return string2CMPIString(nMsg);
   }
#endif

#ifdef CMPI_VER_200
   static CMPIStatus mbEncOpenMessageFile(
      const CMPIBroker* mb,
      const char* msgFile,
      CMPIMsgFileHandle* msgFileHandle)
   {
      CMPIStatus rc = { CMPI_RC_OK, NULL };
      AutoPtr<MessageLoaderParms> parms(new MessageLoaderParms());
      parms->msg_src_path = msgFile;
      // Get the AcceptLanguage entry
      const CMPIContext *ctx = CMPI_ThreadContext::getContext();
      CMPIData data = ctx->ft->getEntry(ctx, CMPIAcceptLanguage, &rc);
      if (rc.rc != CMPI_RC_ERR_NO_SUCH_PROPERTY)
      {
          if (rc.rc == CMPI_RC_OK)
          {
              parms->acceptlanguages =
                  LanguageParser::parseAcceptLanguageHeader(
                      CMGetCharPtr(data.value.string));
          }
          else
          {
              return rc; // should be CMPI_RC_ERR_INVALID_HANDLE
          }
      }
      MessageLoader::openMessageFile(*parms.get());

      ContentLanguageList cll = parms->contentlanguages;
      // Check that we have at least one content language (ie. matching
      // resource bundle was found) before adding to Invocation Context.
      if (cll.size() > 0)
      {
          ctx->ft->addEntry(ctx,
              CMPIContentLanguage,
              (CMPIValue*)(const char*)
                  LanguageParser::buildContentLanguageHeader(cll).getCString(),
              CMPI_chars);
      }

      *msgFileHandle = (void *)parms.release();
      CMReturn(CMPI_RC_OK);
   }

   static CMPIStatus mbEncCloseMessageFile(const CMPIBroker *mb,
               const CMPIMsgFileHandle msgFileHandle) {
      MessageLoaderParms* parms;
      parms = (MessageLoaderParms*)msgFileHandle;
      MessageLoader::closeMessageFile(*parms);
      delete parms;
      CMReturn(CMPI_RC_OK);
   }

   static CMPIString* mbEncGetMessage2(const CMPIBroker *mb, const char *msgId, 
               const CMPIMsgFileHandle msgFileHandle, const char *defMsg,
               CMPIStatus* rc, CMPICount count, ...) {

      MessageLoaderParms* parms;
      parms = (MessageLoaderParms*)msgFileHandle;
      parms->msg_id = String(msgId);
      parms->default_msg = String(defMsg);
      DDD(cout<<"--- mbEncGetMessage2() count: "<<count<<endl);
      int err=0;
      if (rc) rc->rc=CMPI_RC_OK;

      if (count>0) {
         va_list argptr;
         va_start(argptr,count);
         for (;;) {
            if (count>0) parms->arg0=formatValue(&argptr,rc,&err);
            else break;
            if (count>1) parms->arg1=formatValue(&argptr,rc,&err);
            else break;
            if (count>2) parms->arg2=formatValue(&argptr,rc,&err);
            else break;
            if (count>3) parms->arg3=formatValue(&argptr,rc,&err);
            else break;
            if (count>4) parms->arg4=formatValue(&argptr,rc,&err);
            else break;
            if (count>5) parms->arg5=formatValue(&argptr,rc,&err);
            else break;
            if (count>6) parms->arg6=formatValue(&argptr,rc,&err);
            else break;
            if (count>7) parms->arg7=formatValue(&argptr,rc,&err);
            else break;
            if (count>8) parms->arg8=formatValue(&argptr,rc,&err);
            else break;
            if (count>9) parms->arg9=formatValue(&argptr,rc,&err);
            break;
         }
         va_end(argptr);
      }
      String nMsg=MessageLoader::getMessage2(*parms);
      return string2CMPIString(nMsg);
   }
#endif

#if defined(CMPI_VER_100)
  CMPIStatus mbEncLogMessage
       (const CMPIBroker*,int severity ,const char *id,
        const char *text, const CMPIString *string) {

	  if ( !id || !(text || string))
			  CMReturn(CMPI_RC_ERR_INVALID_PARAMETER);

	  String logString = id;
      Uint32 logSeverity = Logger::INFORMATION;


	  logString.append(":");

	  if (string)
		{
           logString.append( ( char*)CMGetCharsPtr(string,NULL));
		}
	  else
	    {
           logString.append( text );
		}
    // There are no notion in CMPI spec about what 'severity' means.
	// So we are going to try to map
	if (severity <= 1)
			logSeverity = Logger::INFORMATION;
	else if (severity == 2)
			logSeverity = Logger::WARNING;
	else if (severity == 3)
			logSeverity = Logger::SEVERE;
	else if (severity == 4)
			logSeverity = Logger::FATAL;

	Logger::put(Logger::STANDARD_LOG, id, logSeverity, logString);
    CMReturn ( CMPI_RC_OK);
  }

  inline Uint32 mapTraceLevel(int level)
  {
      // There are no notion in CMPI spec about what 'level' means.
      // So we are going to try to map . We don't want to map to LEVEL1
      // as it requires the PEG_METHOD_ENTER and PEG_METHOD_EXIT macros.
      switch(level)
      {
        case 1:
        case 2:
          return Tracer::LEVEL2;
          break;
        case 3:
          return Tracer::LEVEL3;
          break;
        case 4:
          return Tracer::LEVEL4;
          break;
        default:
          return Tracer::LEVEL4;
      }
  }

  inline const char* decideTraceString(const char *text, const CMPIString *string)
  {
      if (text)
      {
          return text;
      }
      return (const char*) CMGetCharsPtr(string,NULL);
  }

  CMPIStatus mbEncTracer(const CMPIBroker*,
                         int level,
                         const char *component,
                         const char *text,
                         const CMPIString *string)
  {
	if ( !component || !(text || string))
		  CMReturn(CMPI_RC_ERR_INVALID_PARAMETER);

    // emptiness of component checked at begin of mbEncTracer
    // don't have to expect a null pointer here

    // through the first check in mbEncTracer
    // we know that return from decideTraceString is not null
    PEG_TRACE( (TRC_CMPIPROVIDER, 
               mapTraceLevel(level),
               "%s: %s",
               component,
               decideTraceString(text, string))
             );

    CMReturn ( CMPI_RC_OK);
  }
#endif


  static CMPISelectExp *mbEncNewSelectExp (const CMPIBroker * mb, const char *query,
                                           const char *lang,
                                           CMPIArray ** projection,
                                           CMPIStatus * st)
  {
    int exception = 1;
    int useShortNames = 0;
    CMPIStatus rc = { CMPI_RC_OK, NULL };

    if (strncmp (lang, CALL_SIGN_WQL, CALL_SIGN_WQL_SIZE) == 0)
      {
        WQLSelectStatement *stmt = new WQLSelectStatement ();
        try
        {
          WQLParser::parse (query, *stmt);
          exception = 0;
        }
        catch (const ParseError &)
        {
          if (st)
            CMSetStatus (st, CMPI_RC_ERR_INVALID_QUERY);
        }
        catch (const MissingNullTerminator &)
        {
          if (st)
            CMSetStatus (st, CMPI_RC_ERR_INVALID_QUERY);
        }
        if (exception)
          {
            delete stmt;
            if (projection)
              *projection = NULL;
            return NULL;
          }
		if (projection)
			{
        if (stmt->getAllProperties ())
          {
            	*projection = NULL;
          }
        else
          {
            *projection =
              mbEncNewArray (mb, stmt->getSelectPropertyNameCount (),
                             CMPI_string, NULL);
            for (int i = 0, m = stmt->getSelectPropertyNameCount (); i < m;
                 i++)
              {
                const CIMName & n = stmt->getSelectPropertyName (i);
                //cerr << "Property: " << n.getString() << endl;
                // Since the array and the CIMName disappear when this function
                // exits we use CMPI data storage - the CMPI_Object keeps a list of
                // data and cleans it up when the provider API function is exited.
                CMPIString *str_data =
                  reinterpret_cast < CMPIString * >(new CMPI_Object (n.getString()));
                CMPIValue value;
                value.string = str_data;

                rc = CMSetArrayElementAt (*projection, i,
                                          &value, CMPI_string);
                if (rc.rc != CMPI_RC_OK)
                  {
                    if (st)
                      CMSetStatus (st, rc.rc);
                    return NULL;
				  }
              }
		    }
          }
        stmt->hasWhereClause ();
        if (st)
            CMSetStatus (st, CMPI_RC_OK);
        return (CMPISelectExp *) new CMPI_SelectExp (stmt);
      }
#ifndef PEGASUS_DISABLE_CQL
    if ((strncmp (lang, CALL_SIGN_CQL, CALL_SIGN_CQL_SIZE) == 0) ||
        (strncmp (lang, "CIMxCQL", 7) == 0) ||
        (strncmp (lang, "CIM:CQL", 7) == 0))
      {
        /* IBMKR: This will have to be removed when the CMPI spec is updated
           with a clear explanation of what properties array can have as
           strings. For right now, if useShortNames is set to true, _only_
           the last chained identifier is used. */
        if (strncmp (lang, CALL_SIGN_CQL, CALL_SIGN_CQL_SIZE) == 0)
		{
          useShortNames = 1;
		}
        // Get the namespace.
        const CMPIContext *ctx = CMPI_ThreadContext::getContext ();

        CMPIData data = ctx->ft->getEntry (ctx, CMPIInitNameSpace, &rc);
        if (rc.rc != CMPI_RC_OK)
          {
            if (st)
              CMSetStatus (st, CMPI_RC_ERR_FAILED);
            return NULL;
          }

        // Create the CIMOMHandle wrapper.
        CIMOMHandle *cm_handle = CM_CIMOM (mb);
        CIMOMHandleQueryContext
          qcontext (CIMNamespaceName (CMGetCharPtr (data.value.string)),
                    *cm_handle);

        String sLang (lang);
        String sQuery (query);

        CQLSelectStatement *selectStatement =
          new CQLSelectStatement (sLang, sQuery, qcontext);
        try
        {
          CQLParser::parse (query, *selectStatement);
          selectStatement->validate ();
          exception = 0;
        }
        catch (...)
        {
          if (st)
            CMSetStatus (st, CMPI_RC_ERR_INVALID_QUERY);
        }

        if (exception)
          {
            delete selectStatement;
            if (projection)
              *projection = NULL;
            return NULL;
          }
        else
          {
	    if (projection)
	      {
		Array < CQLChainedIdentifier > select_Array =
		  selectStatement->getSelectChainedIdentifiers ();

		// Special check. Remove it when useShortNames is not neccessary
		if ((select_Array.size() == 1) && (useShortNames) && (select_Array[0].getLastIdentifier().getName().getString() == String::EMPTY))

		  {
		    *projection= NULL;

		  }
		else {
		  *projection =
		    mbEncNewArray (mb, select_Array.size (), CMPI_string, NULL);

		  CQLIdentifier identifier;
		  String name;

		  for (Uint32 i = 0; i < select_Array.size (); i++)
		    {
		      if (useShortNames)
			{
			  identifier = select_Array[i].getLastIdentifier ();
			  name = identifier.getName ().getString ();
			}
		      else
			{
			  name = select_Array[i].toString ();
			}
		      // Since the array and the CIMName disappear when this function
		      // exits we use CMPI data storage - the CMPI_Object keeps a list of
		      // data and cleans it up when the provider API function is exited.
		      //cerr << "Property: " << name << endl;
		      CMPIString *str_data =
			reinterpret_cast < CMPIString * >(new CMPI_Object (name));
		      CMPIValue value;
		      value.string = str_data;

		      rc = CMSetArrayElementAt (*projection, i,
						&value, CMPI_string);

		      if (rc.rc != CMPI_RC_OK)
			{
			  if (st)
			    CMSetStatus (st, rc.rc);
			  return NULL;
			}
		    }
		}
	      }
          }
        if (st)
	  CMSetStatus (st, CMPI_RC_OK);
        return (CMPISelectExp *) new CMPI_SelectExp (selectStatement);
      }
#endif
    if (st)
      CMSetStatus (st, CMPI_RC_ERR_QUERY_LANGUAGE_NOT_SUPPORTED);
    return NULL;
  }

#if defined (CMPI_VER_90) && !defined(CMPI_VER_100)

   static CMPIArray * mbEncGetKeyList(CMPIBroker *mb, CMPIContext *ctx,
                  CMPIObjectPath *cop, CMPIStatus *rc) {
	  if ((cop==NULL) || (ctx==NULL)) {
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	    return NULL;
	  }
      CIMObjectPath *op=(CIMObjectPath*)cop->hdl;

	  if (!op) {
		if (rc) CMSetStatus(rc, CMPI_RC_ERR_INVALID_PARAMETER);
	    return NULL;
	  }
      CIMClass *cls=mbGetClass(mb,*op);
      Array<String> keys;
      for (int i=0,m=cls->getPropertyCount(); i<m; i++) {
         CIMConstProperty p=cls->getProperty(i);
         Uint32 k=p.findQualifier("key");
         if (k!=PEG_NOT_FOUND) {
            keys.append(p.getName().getString());
         }
      }
      CMPIArray *ar=mb->eft->newArray(mb,keys.size(),CMPI_string,NULL);
      for (Uint32 i=0,m=keys.size(); i<m; i++) {
         String s=keys[i];
         CMPIString *str=string2CMPIString(s);
         ar->ft->setElementAt(ar,i,(CMPIValue*)&str,CMPI_string);
      }
      if (rc) CMSetStatus(rc,CMPI_RC_OK);
      return ar;
   }


   #endif

}

static CMPIBrokerEncFT brokerEnc_FT={
     CMPICurrentVersion
     ,mbEncNewInstance
     ,mbEncNewObjectPath
     ,mbEncNewArgs
     ,mbEncNewString
     ,mbEncNewArray
     ,mbEncNewDateTime
     ,mbEncNewDateTimeFromBinary
     ,mbEncNewDateTimeFromString
     ,mbEncNewSelectExp
     ,mbEncClassPathIsA
     ,mbEncToString
     ,mbEncIsOfType
     ,mbEncGetType
#if defined (CMPI_VER_85)
     ,mbEncGetMessage
#endif
#if defined (CMPI_VER_90) && !defined(CMPI_VER_100)
     ,mbEncGetKeyList
#endif
#if defined (CMPI_VER_100)
     ,mbEncLogMessage
     ,mbEncTracer
#endif
#if defined (CMPI_VER_200)
     ,mbEncNewCMPIError
     ,mbEncOpenMessageFile
     ,mbEncCloseMessageFile
     ,mbEncGetMessage2
#endif
};

CMPIBrokerEncFT *CMPI_BrokerEnc_Ftab=&brokerEnc_FT;


PEGASUS_NAMESPACE_END




No CVS admin address has been configured
Powered by
ViewCVS 0.9.2