(file) Return to WMIValue.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / WMIMapper / WMIProvider

   1 karl  1.9 //%2006////////////////////////////////////////////////////////////////////////
   2 kumpf 1.1 //
   3 karl  1.6 // 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.4 // IBM Corp.; EMC Corporation, The Open Group.
   7 karl  1.6 // 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.7 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10           // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 karl  1.9 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12           // EMC Corporation; Symantec Corporation; The Open Group.
  13 kumpf 1.1 //
  14           // Permission is hereby granted, free of charge, to any person obtaining a copy
  15           // of this software and associated documentation files (the "Software"), to
  16           // deal in the Software without restriction, including without limitation the
  17           // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  18           // sell copies of the Software, and to permit persons to whom the Software is
  19           // furnished to do so, subject to the following conditions:
  20           // 
  21           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  22           // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  23           // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  24           // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  25           // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  26           // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  27           // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28           // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29           //
  30           //==============================================================================
  31           //
  32           // Author: Chip Vincent (cvincent@us.ibm.com)
  33           //
  34 kumpf 1.1 // Modified By:	Barbara Packard (barbara_packard@hp.com)
  35 kumpf 1.3 //              Paulo Sehn (paulo_sehn@hp.com)
  36           //              Adriano Zanuz (adriano.zanuz@hp.com)
  37           //              Jair Santos, Hewlett-Packard Company (jair.santos@hp.com)
  38 kumpf 1.5 //              Terry Martin, Hewlett-Packard Company (terry.martin@hp.com)
  39 kumpf 1.3 //
  40 kumpf 1.1 //%/////////////////////////////////////////////////////////////////////////////
  41           
  42           #include "StdAfx.h"
  43           
  44           #include "WMIValue.h"
  45           #include "WMIString.h"
  46           #include "WMIType.h"
  47           #include "WMIDateTime.h"
  48           #include "WMIObjectPath.h"
  49           
  50           PEGASUS_NAMESPACE_BEGIN
  51           
  52           static const char _NULL_INTERVAL_TYPE_STRING[] = "00000000000000.000000:000";
  53           static const char _NULL_DATE_TYPE_STRING[] = "00000000000000.000000-000";
  54           
  55           WMIValue::WMIValue(const CIMValue & value) : CIMValue(value)
  56           {
  57           }
  58           
  59           WMIValue::WMIValue(const CComVariant & vValue)
  60           {
  61 kumpf 1.1 	CIMValue val;
  62           	val = getValue(vValue);
  63           	*this = CIMValue(val);
  64           }
  65           
  66           WMIValue::WMIValue(VARTYPE vt, void *pVal)
  67           {
  68           	CIMValue val;
  69           	val = getCIMValueFromVariant(vt, pVal); 
  70           	*this = CIMValue(val);
  71           }
  72           
  73           WMIValue::WMIValue(VARTYPE vt, void *pVal, const CIMTYPE type)
  74           {
  75           	CIMValue val;
  76           	val = getCIMValueFromVariant(vt, pVal, type); 
  77           	*this = CIMValue(val);
  78           }
  79           
  80           
  81           WMIValue::WMIValue(const VARIANT & value, const CIMTYPE type)
  82 kumpf 1.1 {
  83           	CIMValue val;
  84           	CComVariant vValue;
  85           	vValue = value;
  86           
  87           	if ((vValue.vt != VT_NULL) && ((type & ~CIM_FLAG_ARRAY) != CIM_REFERENCE)) 
  88           	{
  89           		val = getValue(vValue, type);
  90           	}
  91           	else
  92           	{
  93 kumpf 1.2 		// for class definitions, the value will be null and will except
  94 kumpf 1.1 		_variant_t vt(value);
  95           
  96           		switch(type & ~CIM_FLAG_ARRAY)
  97           		{
  98           		case CIM_BOOLEAN:
  99           			try
 100           			{
 101           				val.set(Boolean(bool(vt)));
 102           			}
 103           			catch(...)
 104           			{
 105           				val.setNullValue(CIMTYPE_BOOLEAN, false, 0);
 106           			}
 107           
 108           			break;
 109           		case CIM_BOOLEAN | CIM_FLAG_ARRAY:
 110           			//val.setNullValue(CIMType(CIMTYPE_BOOLEAN), true. 0);
 111           
 112           			break;
 113           		case CIM_SINT8:
 114           			try
 115 kumpf 1.1 			{
 116           				val.set(Sint8(BYTE(vt)));
 117           			}
 118           			catch(...)
 119           			{
 120           				val.setNullValue(CIMTYPE_SINT8, false, 0);
 121           			}
 122           
 123           			break;
 124           		case CIM_SINT8 | CIM_FLAG_ARRAY:
 125           			//val.setNullValue(CIMTYPE_SINT8, true. 0);
 126           
 127           			break;
 128           		case CIM_UINT8:
 129           			try
 130           			{
 131           				val.set(Uint8(BYTE(vt)));
 132           			}
 133           			catch(...)
 134           			{
 135 kumpf 1.2 				val.setNullValue(CIMTYPE_UINT8, false, 0);
 136 kumpf 1.1 			}
 137           
 138           			break;
 139           		case CIM_UINT8 | CIM_FLAG_ARRAY:
 140           			//val.setNullValue(CIMTYPE_UINT8, true. 0);
 141           
 142           			break;
 143           		case CIM_SINT16:
 144           			try
 145           			{
 146           				val.set(Sint16(short(vt)));
 147           			}
 148           			catch(...)
 149           			{
 150           				val.setNullValue(CIMTYPE_SINT16, false, 0);
 151           			}
 152           
 153           			break;
 154           		case CIM_SINT16 | CIM_FLAG_ARRAY:
 155           			//val.setNullValue(CIMTYPE_SINT16, true. 0);
 156           
 157 kumpf 1.1 			break;
 158           		case CIM_UINT16:
 159           			try
 160           			{
 161           				val.set(Uint16(short(vt)));
 162           			}
 163           			catch(...)
 164           			{
 165           				val.setNullValue(CIMTYPE_UINT16, false, 0);
 166           			}
 167           
 168           			break;
 169           		case CIM_UINT16 | CIM_FLAG_ARRAY:
 170           			//val.setNullValue(CIMTYPE_UINT16, true. 0);
 171           
 172           			break;
 173           		case CIM_SINT32:
 174           			try
 175           			{
 176           				val.set(Sint32(long(vt)));
 177           			}
 178 kumpf 1.1 			catch(...)
 179           			{
 180           				val.setNullValue(CIMTYPE_SINT32, false, 0);
 181           			}
 182           
 183           			break;
 184           		case CIM_SINT32 | CIM_FLAG_ARRAY:
 185           			//val.setNullValue(CIMTYPE_SINT32, true. 0);
 186           
 187           			break;
 188           		case CIM_UINT32:
 189           			try
 190           			{
 191           				val.set(Uint32(long(vt)));
 192           			}
 193           			catch(...)
 194           			{
 195           				val.setNullValue(CIMTYPE_UINT32, false);
 196           			}
 197           
 198           			break;
 199 kumpf 1.1 		case CIM_UINT32 | CIM_FLAG_ARRAY:
 200           			//val.setNullValue(CIMTYPE_UINT32, true. 0);
 201           
 202           			break;
 203           		case CIM_SINT64:
 204           			try
 205           			{
 206           				_bstr_t bstr(vt);
 207           
 208           				val.set(Sint64(_wtoi64(bstr)));
 209           			}
 210           			catch(...)
 211           			{
 212           				val.setNullValue(CIMTYPE_SINT64, false, 0);
 213           			}
 214           
 215           			break;
 216           		case CIM_SINT64 | CIM_FLAG_ARRAY:
 217           			//val.setNullValue(CIMTYPE_SINT64, true. 0);
 218           
 219           			break;
 220 kumpf 1.1 		case CIM_UINT64:
 221           			try
 222           			{
 223           				_bstr_t bstr(vt);
 224           
 225           				val.set(Uint64(_wtoi64(bstr)));
 226           			}
 227           			catch(...)
 228           			{
 229           				val.setNullValue(CIMTYPE_UINT64, false, 0);
 230           			}
 231           
 232           			break;
 233           		case CIM_UINT64 | CIM_FLAG_ARRAY:
 234           			//val.setNullValue(CIMTYPE_UINT64, true. 0);
 235           
 236           			break;
 237           		case CIM_REAL32:
 238           			try
 239           			{
 240           				val.set(Real32(float(vt)));
 241 kumpf 1.1 			}
 242           			catch(...)
 243           			{
 244           				val.setNullValue(CIMTYPE_REAL32, false, 0);
 245           			}
 246           
 247           			break;
 248           		case CIM_REAL32 | CIM_FLAG_ARRAY:
 249           			//val.setNullValue(CIMTYPE_REAL32, true. 0);
 250           
 251           			break;
 252           		case CIM_REAL64:
 253           			try
 254           			{
 255           				val.set(Real64(double(vt)));
 256           			}
 257           			catch(...)
 258           			{
 259           				val.setNullValue(CIMTYPE_REAL64, false, 0);
 260           			}
 261           
 262 kumpf 1.1 			break;
 263           		case CIM_REAL64 | CIM_FLAG_ARRAY:
 264           			//val.setNullValue(CIMTYPE_REAL64, true. 0);
 265           
 266           			break;
 267           		case CIM_STRING:
 268           			try
 269           			{
 270           				val.set(WMIString(_bstr_t(vt)));
 271           			}
 272           			catch(...)
 273           			{
 274 marek 1.11 				PEG_TRACE_CSTRING(TRC_WMIPROVIDER, Tracer::LEVEL3,
 275            					"WMIValue::WMIValue - Constructor failed; setting NULL string");
 276 kumpf 1.3  					val.setNullValue(CIMTYPE_STRING, false, 0);
 277 kumpf 1.1  			}
 278            
 279            			break;
 280            		case CIM_STRING | CIM_FLAG_ARRAY:
 281            			//val.setNullValue(CIMTYPE_STRING, true. 0);
 282            
 283            			break;
 284            		case CIM_DATETIME:
 285            			try
 286            			{
 287            				val.set(WMIDateTime(_bstr_t(vt)));
 288            			}
 289            			catch(...)
 290            			{
 291            				val.setNullValue(CIMTYPE_DATETIME, false, 0);
 292            			}
 293            
 294            			break;
 295            		case CIM_DATETIME | CIM_FLAG_ARRAY:
 296            			//val.setNullValue(CIMTYPE_DATETIME, true. 0);
 297            
 298 kumpf 1.1  			break;
 299            		case CIM_REFERENCE:
 300            			try
 301            			{
 302            				val.set(WMIObjectPath(_bstr_t(vt)));
 303            			}
 304            			catch(...)
 305            			{
 306            				val.setNullValue(CIMTYPE_REFERENCE, false);
 307            			}
 308            
 309            			break;
 310            		case CIM_CHAR16:
 311            			try
 312            			{
 313            				val.set(Char16(short(vt)));
 314            			}
 315            			catch(...)
 316            			{
 317            				val.setNullValue(CIMTYPE_CHAR16, false);
 318            			}
 319 kumpf 1.1  
 320            			break;
 321            		case CIM_CHAR16 | CIM_FLAG_ARRAY:
 322            			//val.setNullValue(CIMTYPE_CHAR16, true. 0);
 323            
 324            			break;
 325            		case CIM_OBJECT:
 326            
 327            			break;
 328            		case CIM_EMPTY:
 329            
 330            			break;
 331            		case CIM_ILLEGAL:
 332            		default:
 333            
 334            			break;
 335            		}
 336 kumpf 1.3  	}
 337            	
 338 kumpf 1.5  	vValue.Clear();
 339 kumpf 1.1  	*this = CIMValue(val);
 340            }
 341            
 342            /////////////////////////////////////////////////////////////////////////////
 343            // WMIValue::getCIMValueFromVariant - helper function to convert a variant 
 344            //		value to a CIM value
 345            //
 346            // ///////////////////////////////////////////////////////////////////////////
 347            CIMValue WMIValue::getCIMValueFromVariant(VARTYPE vt, void *pVal, const CIMTYPE Type)
 348            {
 349 kumpf 1.5  	PEG_METHOD_ENTER(TRC_WMIPROVIDER,"WMIValue::getCIMValueFromVariant()");
 350            
 351 kumpf 1.1  	CIMValue cimValue;
 352 kumpf 1.5  	String str;
 353 kumpf 1.1  
 354            	switch (vt)
 355            	{
 356 kumpf 1.2  		case VT_I2:
 357            			// have to screw around here because automation type
 358            			// is not necessarily the mof type...
 359            			if (CIM_SINT8 == Type)
 360            			{
 361            				return (CIMValue((Sint8)*((BYTE *)pVal)));
 362            			}
 363            			else if (CIM_CHAR16 == Type)
 364            			{
 365            				return (CIMValue((Char16)*((short *)pVal)));
 366            			}
 367            			else
 368            			{
 369            				return (CIMValue((Sint16)*((short *)pVal)));
 370            			}
 371            			
 372            			break;
 373 kumpf 1.1  
 374 kumpf 1.2  		case VT_I4:
 375            			// have to screw around here because automation type
 376            			// is not necessarily the mof type...
 377            			if (CIM_UINT16 == Type)
 378            			{
 379            				return (CIMValue((Uint16)*((unsigned short *)pVal)));
 380            			}
 381            			else if (CIM_UINT32 == Type)
 382            			{
 383            				return (CIMValue((Uint32)*((unsigned long *)pVal)));
 384            			}
 385            			else
 386            			{
 387            				return (CIMValue((Sint32)*((int *)pVal)));
 388            			}
 389            			break;
 390            
 391            		case VT_R4:
 392            			return (CIMValue((Real32)*((float *)pVal)));
 393            			break;
 394            
 395 kumpf 1.2  		case VT_R8:
 396            			return (CIMValue((Real64)*((double *)pVal)));
 397            			break;
 398 kumpf 1.1  
 399 kumpf 1.2  		case VT_DATE:
 400 kumpf 1.1  		{
 401 kumpf 1.2  			////ATTN: it needs to be checked to see if this really
 402            			// works!!
 403            			DATE date;
 404            			CIMDateTime tmp;
 405            			SYSTEMTIME sTime;
 406 kumpf 1.5  			
 407 kumpf 1.2  			date = *(DATE *)pVal;
 408 kumpf 1.1  
 409 kumpf 1.2  			if (VariantTimeToSystemTime(date, &sTime))
 410            			{
 411            				WBEMTime wTime(sTime);
 412 kumpf 1.5  				BSTR bs = wTime.GetDMTF();
 413            				str = (LPCTSTR)_bstr_t(bs, FALSE);
 414                            SysFreeString(bs);
 415            
 416 marek 1.10 				PEG_TRACE((TRC_WMIPROVIDER,Tracer::LEVEL3,
 417            					"WMIValue::getValue() - Date is %s", (LPCSTR)str.getCString()));
 418 kumpf 1.2  			}
 419            			else
 420            			{
 421 kumpf 1.5  				//ATTN: just to have something for now
 422            				str = _NULL_INTERVAL_TYPE_STRING;
 423 kumpf 1.2  			}
 424 kumpf 1.1  
 425 kumpf 1.5  			tmp.set(str);
 426            
 427 kumpf 1.2  			return CIMValue(tmp);
 428            		}
 429 kumpf 1.1  		break;
 430            
 431 kumpf 1.2  		case VT_BSTR:
 432 kumpf 1.5          {
 433                        BSTR bsTemp = *((BSTR *)pVal);
 434                        // Not making a copy when constructing the _bstr_t,
 435                        // For some reason, setting fCopy to TRUE causes a memory leak
 436                        // to be reported (even though the destructor is freeing the string!)
 437                        // This seems to work, but needs to be looked at closer some day:
 438                        _bstr_t bstr(bsTemp, FALSE);
 439 mateus.baur 1.8              str.assign((Char16*)((wchar_t*)bstr));
 440 kumpf       1.2  			
 441                  			//By Jair - Due to Windows automation limitations
 442                  			//the 64 integer bit numbers and the datetime routine
 443                  			//are being cast as strings. We must to handle this in 
 444                  			//order to correctly answer the dispatcher.
 445                  			if (CIM_SINT64 == Type)
 446                  			{
 447 kumpf       1.5  				return (CIMValue(Sint64(_wtoi64(bstr))));
 448 kumpf       1.2  			}
 449                  			else if (CIM_UINT64 == Type)
 450                  			{
 451 kumpf       1.5  				return (CIMValue(Uint64(_wtoi64(bstr))));
 452 kumpf       1.2  			}
 453                  			else if (CIM_DATETIME == Type)
 454                  			{
 455                  				CIMDateTime dt;
 456                  				
 457                  				//By Jair - Exchanging asterisks for zeros
 458                  				Uint32 iCount = 0;
 459 kumpf       1.1  
 460 kumpf       1.5  				for (Uint32 i = 0; i < str.size(); i++)
 461 kumpf       1.2  				{
 462                  					if (str[i] == '*') 
 463                  					{
 464                  						str[i] = '0';
 465                  						iCount++;
 466                  					}
 467                  				}
 468 kumpf       1.1  
 469 kumpf       1.2  				//if there are only asterisks, then pass a NULL interval
 470 kumpf       1.5  				if (iCount == str.size() - 2)
 471 kumpf       1.2  				{
 472 kumpf       1.5  					str = _NULL_INTERVAL_TYPE_STRING;
 473 kumpf       1.2  				}
 474 kumpf       1.1  
 475 kumpf       1.5  				dt.set(str);
 476 kumpf       1.3  
 477 kumpf       1.2  				return (CIMValue(WMIDateTime(dt)));
 478                  			}
 479                  			else
 480                  			{
 481 kumpf       1.5  				if (0 == str.size())
 482 kumpf       1.2  				{
 483                  					return CIMValue(String(""));
 484                  				}
 485                  				else
 486                  				{
 487 kumpf       1.5  					return CIMValue(str);
 488 kumpf       1.2  				}
 489                  			}
 490 kumpf       1.5          }
 491                  		break;
 492 kumpf       1.1  
 493 kumpf       1.2  		case VT_BOOL:
 494                  			return ((*(VARIANT_BOOL *)pVal) ? CIMValue(true) : CIMValue(false));
 495                  			break;
 496 kumpf       1.1  
 497 kumpf       1.2  		case VT_I1:	
 498                  			return (CIMValue((Sint8)*((char *)pVal)));
 499                  			break;
 500 kumpf       1.1  
 501 kumpf       1.2  		case VT_UI1:	
 502                  			return (CIMValue((Uint8)*((BYTE *)pVal)));
 503                  			break;
 504 kumpf       1.1  
 505 kumpf       1.2  		case VT_UI2:	
 506                  			return (CIMValue((Uint16)*((unsigned short *)pVal)));
 507                  			break;
 508 kumpf       1.1  
 509 kumpf       1.2  		case VT_UI4:	
 510                  			return (CIMValue((Uint32)*((unsigned long *)pVal)));
 511                  			break;
 512 kumpf       1.1  
 513 kumpf       1.2  		case VT_I8:
 514                  			////ATTN: Will this conversion work??
 515                  			return (CIMValue((Sint64)*((_int64 *)pVal)));
 516                  			break;
 517 kumpf       1.1  
 518 kumpf       1.2  		case VT_UI8:	
 519                  			////ATTN: Will this conversion work??
 520                  			return (CIMValue((Uint64)*((unsigned _int64 *)pVal)));
 521                  			break;
 522 kumpf       1.1  
 523 kumpf       1.2  		case VT_INT:	
 524                  			if (sizeof(int) == 8)
 525                  			{
 526                  				return (CIMValue((Sint64)*((_int64 *)pVal)));
 527                  			}
 528                  			else
 529                  			{
 530                  				return (CIMValue((Sint32)*((long *)pVal)));
 531                  			}
 532                  			break;
 533 kumpf       1.1  
 534 kumpf       1.2  		case VT_UINT:	
 535                  			if (sizeof(int) == 8)
 536                  			{
 537                  				return (CIMValue((Uint64)*((unsigned _int64 *)pVal)));
 538                  			}
 539                  			else
 540                  			{
 541                  				return (CIMValue((Uint32)*((unsigned long *)pVal)));
 542                  			}
 543                  			break;
 544 kumpf       1.1  
 545 kumpf       1.2  		default:
 546                  			throw TypeMismatchException();
 547                  			break;
 548 kumpf       1.1      };
 549                  }
 550                  
 551                  /////////////////////////////////////////////////////////////////////////////
 552                  // WMIValue::getValue - converts a variant to a Pegasus CIMValue
 553                  //
 554                  // ///////////////////////////////////////////////////////////////////////////
 555                  CIMValue WMIValue::getValue(const CComVariant & vValue, const CIMTYPE Type)
 556                  {
 557                  	bool isRef = isReferenceType(vValue.vt);
 558                  	bool isArray = isArrayType(vValue.vt);
 559                  
 560                  	if (isArray) 
 561                  	{
 562                  		return getArrayValue(vValue, Type);
 563                  	}
 564                  
 565                  	VARTYPE vt = isRef ? vValue.vt ^ VT_BYREF : vValue.vt;
 566                  
 567                  	void *pValue;
 568                  	
 569 kumpf       1.1  	// just getting the address of the value field, type doesn't matter
 570 kumpf       1.2  	if (isRef)
 571 kumpf       1.1  	{
 572                  		pValue = (void *)vValue.plVal;
 573                  	}
 574                  	else
 575                  	{
 576                  		pValue = (void *)&(vValue.lVal);
 577                  	}
 578                  
 579 kumpf       1.2  	return (getCIMValueFromVariant(vt, pValue, Type));
 580 kumpf       1.1  }
 581                  
 582                  /////////////////////////////////////////////////////////////////////////////
 583                  // WMICollector::getArrayValueAux - helper function for getArrayValue 
 584                  //
 585                  // ///////////////////////////////////////////////////////////////////////////
 586                  template<class T>
 587                  CIMValue getArrayValueAux(LPSAFEARRAY psa, VARTYPE vt, const CIMTYPE Type, T*) 
 588                  {
 589                  	long index, numElements, i;
 590                  	UINT uSize;
 591                  	BYTE *pValue;
 592                  	HRESULT hr;
 593                  
 594                  	Array <T> array;
 595                  
 596                  	index = psa->rgsabound[0].lLbound;	// get the beginning index
 597                  	numElements = psa->rgsabound[0].cElements;	// elements in the array
 598                  	uSize = SafeArrayGetElemsize(psa);		// size of each element	
 599                  
 600                  	pValue = new BYTE[uSize];
 601 kumpf       1.1  	void *pVal = (void *)pValue;
 602                  
 603                  	hr = SafeArrayGetVartype(psa, &vt);
 604                  
 605 kumpf       1.2  	for (i = 0; ((i < numElements) && (SUCCEEDED(hr))); i++, index++)
 606 kumpf       1.1  	{
 607                  		hr = SafeArrayGetElement(psa, &index, pVal);
 608                  
 609                  		if (SUCCEEDED(hr))
 610                  		{
 611                  			CIMValue cimValue = WMIValue(vt, pVal, Type);
 612                  
 613                  			T x;
 614                  			cimValue.get(x);
 615                  			array.append(x);
 616                  		}
 617                  	}
 618                  
 619                  	delete [] pValue;
 620                  
 621                  	if (SUCCEEDED(hr))
 622                  	{
 623                  		return CIMValue(array);
 624                  	}
 625                  	else
 626                  	{
 627 marek       1.10 		PEG_TRACE((TRC_WMIPROVIDER,Tracer::LEVEL3,
 628                  			"WMIValue::getArrayValueAux() - SafeArray result is %x",  hr));
 629 kumpf       1.3  		throw CIMException(CIM_ERR_FAILED, "getArrayValueAux()");
 630 kumpf       1.1  	}
 631                  }
 632                  
 633                  /////////////////////////////////////////////////////////////////////////////
 634                  // WMIValue::getArrayValue- converts a variant array to a 
 635                  //		Pegasus CIMValue of type array
 636                  //		- uses all the SafeArray garbage
 637                  //	NOTE:
 638                  //		We are assuming one-dimensional arrays
 639                  //
 640                  // ///////////////////////////////////////////////////////////////////////////
 641                  CIMValue WMIValue::getArrayValue(const CComVariant& vValue, const CIMTYPE Type)
 642                  {
 643                  
 644                  	LPSAFEARRAY psa = NULL;
 645                  	HRESULT hr;
 646                  
 647                  	CIMTYPE type = Type & (~CIM_FLAG_ARRAY);
 648                  
 649                  	if (!(isArrayType(vValue.vt)))
 650                  	{
 651 kumpf       1.1  		return (getValue(vValue));
 652                  	}
 653                  
 654                  	if (isReferenceType(vValue.vt))
 655                  	{
 656                  		psa = *V_ARRAYREF(&vValue);
 657                  	}
 658                  	else
 659                  	{
 660                  		psa = V_ARRAY(&vValue);
 661                  	}
 662                  
 663                  	VARTYPE vt = VT_NULL;
 664                  	CIMType cimType;
 665                  
 666                  	hr = SafeArrayGetVartype(psa, &vt);
 667                  
 668 kumpf       1.2  	// check for Mof and Automation type discrepancy
 669 kumpf       1.1  	if (VT_I4 == vt)
 670                  	{
 671                  		if (CIM_UINT16 == type)
 672                  		{
 673                  			cimType = CIMTYPE_UINT16;
 674                  		}
 675                  		else if (CIM_UINT32 == type)
 676                  		{
 677                  			cimType = CIMTYPE_UINT32;
 678                  		}
 679                  		else
 680                  		{
 681                  			cimType = vartypeToCIMType(vt);
 682                  		}
 683                  	}
 684 kumpf       1.2  	else if (VT_I2 == vt)
 685                  	{
 686                  		if (CIM_SINT8 == type)
 687                  		{
 688                  			cimType = CIMTYPE_SINT8;
 689                  		}
 690                  		else if (CIM_CHAR16 == type)
 691                  		{
 692                  			cimType = CIMTYPE_CHAR16;
 693                  		}
 694                  		else
 695                  		{
 696                  			cimType = vartypeToCIMType(vt);
 697                  		}
 698                  	}
 699                  	else if (VT_BSTR == vt)
 700                  	{
 701                  		if (CIM_SINT64 == type)
 702                  		{
 703                  			cimType = CIMTYPE_SINT64;
 704                  		}
 705 kumpf       1.2  		else if (CIM_UINT64 == type)
 706                  		{
 707                  			cimType = CIMTYPE_UINT64;
 708                  		}
 709                  		else if (CIM_DATETIME == type)
 710                  		{
 711                  			cimType = CIMTYPE_DATETIME;
 712                  		}
 713                  		else
 714                  		{
 715                  			cimType = vartypeToCIMType(vt);
 716                  		}
 717                  	}
 718 kumpf       1.1  	else
 719                  	{
 720                  		cimType = vartypeToCIMType(vt);
 721                  	}
 722                  
 723                  	if (SUCCEEDED(hr))
 724                  	{
 725                          switch (cimType)
 726                          {
 727 kumpf       1.2  			case CIMTYPE_BOOLEAN: 
 728                  				return getArrayValueAux(psa, vt, type, (Boolean*)0);
 729 kumpf       1.1  
 730 kumpf       1.2  			case CIMTYPE_STRING:
 731                  				return getArrayValueAux(psa, vt, type, (String*)0);
 732 kumpf       1.1  
 733 kumpf       1.2  			case CIMTYPE_CHAR16:
 734                  				return getArrayValueAux(psa, vt, type, (Char16*)0);
 735 kumpf       1.1  
 736 kumpf       1.2  			case CIMTYPE_UINT8:
 737                  				return getArrayValueAux(psa, vt, type, (Uint8*)0);
 738 kumpf       1.1  
 739 kumpf       1.2  			case CIMTYPE_UINT16:
 740                  				return getArrayValueAux(psa, vt, type, (Uint16*)0);
 741 kumpf       1.1  
 742 kumpf       1.2  			case CIMTYPE_UINT32:
 743                  				return getArrayValueAux(psa, vt, type, (Uint32*)0);
 744 kumpf       1.1  
 745 kumpf       1.2  			case CIMTYPE_UINT64:
 746                  				return getArrayValueAux(psa, vt, type, (Uint64*)0);
 747 kumpf       1.1  
 748 kumpf       1.2  			case CIMTYPE_SINT8:
 749                  				return getArrayValueAux(psa, vt, type, (Sint8*)0);
 750 kumpf       1.1  
 751 kumpf       1.2  			case CIMTYPE_SINT16:
 752                  				return getArrayValueAux(psa, vt, type, (Sint16*)0);
 753 kumpf       1.1  
 754 kumpf       1.2  			case CIMTYPE_SINT32:
 755                  				return getArrayValueAux(psa, vt, type, (Sint32*)0);
 756 kumpf       1.1  
 757 kumpf       1.2  			case CIMTYPE_SINT64:
 758                  				return getArrayValueAux(psa, vt, type, (Sint64*)0);
 759 kumpf       1.1  
 760 kumpf       1.2  			case CIMTYPE_DATETIME:
 761                  				return getArrayValueAux(psa, vt, type, (CIMDateTime*)0);
 762 kumpf       1.1  
 763 kumpf       1.2  			case CIMTYPE_REAL32:
 764                  				return getArrayValueAux(psa, vt, type, (Real32*)0);
 765 kumpf       1.1  
 766 kumpf       1.2  			case CIMTYPE_REAL64:
 767                  				return getArrayValueAux(psa, vt, type, (Real64*)0);
 768 kumpf       1.1  
 769 kumpf       1.2  			default:
 770                  				break;
 771 kumpf       1.1  		}
 772                      }
 773                  
 774                  	// if we get here, we are in trouble...
 775 kumpf       1.3  	throw CIMException(CIM_ERR_FAILED, "getArrayValue()");
 776 kumpf       1.1  }
 777                  
 778                  
 779                  VARIANT WMIValue::toVariant()
 780                  {
 781                  	CComVariant cv;
 782                  	VARIANT v;
 783                  	cv.Detach(&v);
 784 kumpf       1.5  	cv.Clear();
 785 kumpf       1.1  	return v;
 786                  
 787                  }
 788 kumpf       1.2  
 789                  /////////////////////////////////////////////////////////////////////////////
 790                  // WMIValue::getAsVariant - helper function to convert a CIM value
 791                  //		     to a variant including arrays
 792                  //
 793                  // ///////////////////////////////////////////////////////////////////////////
 794 kumpf       1.3  void WMIValue::getAsVariant(CComVariant *var)
 795 kumpf       1.2  {
 796                  	HRESULT hr;
 797                  	CMyString tmp;
 798 kumpf       1.1  	
 799 kumpf       1.2  	SAFEARRAY * pSA = NULL;
 800                  	SAFEARRAYBOUND rgsabound;
 801                  	
 802                  	switch (CIMTypeToWMIType(getType()))
 803                  	{
 804                  	   case CIM_BOOLEAN:
 805                  			if (!isArray())
 806                  			{
 807                  				Boolean value;
 808                  
 809                  				var->vt = VT_BOOL;
 810                  				get(value);
 811                  				var->boolVal = value;
 812                  			}
 813                  			else
 814                  			{
 815                  				//creates the safearray
 816                  				rgsabound.lLbound = 0;
 817                  				rgsabound.cElements = getArraySize();
 818                  				pSA = SafeArrayCreate(VT_BOOL, 1, &rgsabound);
 819                  				  
 820 kumpf       1.2  				if (!pSA)
 821                  				{
 822                  					throw CIMException (CIM_ERR_FAILED);
 823                  				}
 824                  
 825                  				Array<Boolean> arValue;
 826                  				get(arValue);
 827                  
 828                  				//sets the values to the array
 829                  				for (long i = 0; i < getArraySize(); i++)
 830                  				{
 831                  					if (hr = SafeArrayPutElement(pSA, &i, &arValue[i]))
 832                  					{
 833                  					  SafeArrayDestroy(pSA);
 834                  					  throw CIMException(CIM_ERR_FAILED);
 835                  					}
 836                  				}
 837                  
 838                  				//sets the value to the variant
 839                  				// by Jair - due to WMI coercion rules
 840                  				// the array of boolean must be set as an array of uint8.
 841 kumpf       1.2  				var->vt = VT_ARRAY | VT_UI1;
 842                  				var->parray = pSA;
 843 kumpf       1.3  				
 844 kumpf       1.2  			}
 845                  			break;
 846                  
 847                  		case CIM_SINT8:
 848                  			if (!isArray())
 849                  			{
 850                  				Sint8 value;
 851                  
 852                  				var->vt = VT_I2;
 853                  				get(value);
 854                  				var->iVal = value;
 855                  			}
 856                  			else
 857                  			{
 858                  				//creates the safearray
 859                  				rgsabound.lLbound = 0;
 860                  				rgsabound.cElements = getArraySize();
 861                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
 862                  
 863                  				if (!pSA)
 864                  				{
 865 kumpf       1.2  					throw CIMException (CIM_ERR_FAILED);
 866                  				}
 867                  
 868                  				Array<Sint8> arValue;
 869                  				get(arValue);
 870                  
 871                  				//put the values to the array
 872                  				for (long i = 0; i < getArraySize(); i++)
 873                  				{
 874                  					tmp.Format("%d", 21, arValue[i]);
 875                  
 876                  					CComVariant vOut;
 877                  					vOut.vt = VT_BSTR;
 878                  					vOut.bstrVal = tmp.Bstr();
 879                  
 880                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
 881                  					{
 882                  						SafeArrayDestroy(pSA);
 883                  						throw CIMException (CIM_ERR_FAILED);
 884                  					}
 885 kumpf       1.5  					vOut.Clear();
 886 kumpf       1.2  				}
 887                  						  
 888                  				// by Jair - due to WMI coercion rules
 889                  				// the array of boolean must be set as an array of uint8.
 890                  				var->vt = VT_ARRAY | VT_BSTR;
 891                  				var->parray = pSA;
 892 kumpf       1.3  				
 893 kumpf       1.2  			}
 894                  			break;
 895                  
 896                  		case CIM_UINT8:
 897                  			if (!isArray())
 898                  			{
 899                  				Uint8 value;
 900                  
 901                  				var->vt = VT_UI1;
 902                  				get(value);
 903                  				var->bVal = value;
 904                  			}
 905                  			else 
 906                  			{
 907                  				//create the safearray
 908                  				rgsabound.lLbound = 0;
 909                  				rgsabound.cElements = getArraySize();
 910                  				pSA = SafeArrayCreate(VT_UI1, 1, &rgsabound);
 911                  
 912                  				if (!pSA)
 913                  				{
 914 kumpf       1.2  					throw CIMException(CIM_ERR_FAILED);
 915                  				}
 916                  			  
 917                  				Array<Uint8> arValue;
 918                  				get(arValue);
 919                  
 920                  			  //put the values into the safearray
 921                  			  for (long i = 0; i < getArraySize(); i++)
 922                  			  {
 923                  				  if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
 924                  				  {
 925                  					  SafeArrayDestroy(pSA);
 926                  					  throw CIMException(CIM_ERR_FAILED);
 927                  				  }
 928                  			  }
 929                  			
 930                  			  //sets the value to the variant
 931                  			  var->vt = VT_ARRAY | VT_UI1;
 932                  			  var->parray = pSA;
 933 kumpf       1.3  			  
 934 kumpf       1.2  		  }
 935                  		  break;
 936                  
 937                  	   case CIM_SINT16:
 938                  		  if (!isArray ())
 939                  		  {
 940                  			  Sint16 value;
 941                  
 942                  			  var->vt = VT_I2;
 943                  			  get(value);
 944                  			  var->iVal = value;
 945                  		  }
 946                  		  else
 947                  		  {
 948                  			  rgsabound.lLbound = 0;
 949                  			  rgsabound.cElements = getArraySize();
 950                  			  pSA = SafeArrayCreate(VT_I2, 1, &rgsabound);
 951                  			  
 952                  			  if (!pSA)
 953                  			  {
 954                  				  throw CIMException (CIM_ERR_FAILED);
 955 kumpf       1.2  			  }
 956                  			  
 957                  			  Array<Sint16> arValue;
 958                  			  get(arValue);
 959                  			  
 960                  			  for (long i = 0; i < getArraySize(); i++)
 961                  			  {
 962                  				  if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
 963                  				  {
 964                  					  SafeArrayDestroy(pSA);
 965                  					  throw CIMException(CIM_ERR_FAILED);
 966                  				  }
 967                  			  }
 968                  
 969                  			  var->vt = VT_ARRAY | VT_I2;
 970                  			  var->parray = pSA;
 971 kumpf       1.3  			  
 972 kumpf       1.2  		  }
 973                  		  break;
 974                  
 975                  		case CIM_UINT16:
 976                  			if (!isArray())
 977                  			{
 978                  				Uint16 value;
 979                  
 980                  				var->vt = VT_I4;
 981                  				get(value);
 982                  				var->lVal = value;
 983                  			}
 984                  			else
 985                  			{
 986                  				rgsabound.lLbound = 0;
 987                  				rgsabound.cElements = getArraySize();
 988                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
 989                  
 990                  				if (!pSA)
 991                  				{
 992                  					throw CIMException (CIM_ERR_FAILED);
 993 kumpf       1.2  				}
 994                  			  
 995                  				Array<Uint16> arValue;
 996                  				get(arValue);
 997                  
 998                  				for (long i = 0; i < getArraySize(); i++)
 999                  				{
1000                  					tmp.Format("%u", 21, arValue[i]);
1001                  
1002                  					CComVariant vOut;
1003                  					vOut.vt = VT_BSTR;
1004                  					vOut.bstrVal = tmp.Bstr();
1005                  
1006                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
1007                  					{
1008                  						SafeArrayDestroy(pSA);
1009                  						throw CIMException(CIM_ERR_FAILED);
1010                  					}
1011 kumpf       1.5  					vOut.Clear();
1012 kumpf       1.2  				}
1013                  
1014                  				var->vt = VT_ARRAY | VT_BSTR;
1015                  				var->parray = pSA;
1016 kumpf       1.3  				
1017 kumpf       1.2  			}
1018                  			break;
1019                  
1020                  		case CIM_SINT32:
1021                  			if (!isArray())
1022                  			{
1023                  				Sint32 value;
1024                  
1025                  				var->vt = VT_I4;
1026                  				get(value);
1027                  				var->lVal = value;
1028                  			}
1029                  			else
1030                  			{
1031                  				rgsabound.lLbound = 0;
1032                  				rgsabound.cElements = getArraySize();
1033                  				pSA = SafeArrayCreate(VT_I4, 1, &rgsabound);
1034                  
1035                  				if (!pSA)
1036                  				{
1037                  					throw CIMException (CIM_ERR_FAILED);
1038 kumpf       1.2  				}
1039                  			  
1040                  				Array<Sint32> arValue;
1041                  				get(arValue);
1042                  			  
1043                  				for (long i = 0; i < getArraySize(); i++)
1044                  				{
1045                  					if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
1046                  					{
1047                  						SafeArrayDestroy(pSA);
1048                  						throw CIMException(CIM_ERR_FAILED);
1049                  					}
1050                  				}
1051                  			  
1052                  				var->vt = VT_ARRAY | VT_I4;
1053                  				var->parray = pSA;
1054 kumpf       1.3  				
1055 kumpf       1.2  			}
1056                  			break;
1057                  
1058                  		case CIM_UINT32:
1059                  			if (!isArray ())
1060                  			{
1061                  				Uint32 value;
1062                  
1063                  				var->vt = VT_I4;
1064                  				get(value);
1065                  				var->lVal = value;
1066                  			}	  
1067                  			else
1068                  			{
1069                  				rgsabound.lLbound = 0;
1070                  				rgsabound.cElements = getArraySize();
1071                  				pSA = SafeArrayCreate(VT_I4, 1, &rgsabound);
1072                  			  
1073                  				if (!pSA)
1074                  				{
1075                  					throw CIMException (CIM_ERR_FAILED);
1076 kumpf       1.2  				}
1077                  			  
1078                  				Array<Uint32> arValue;
1079                  				get(arValue);
1080                  			  
1081                  				for (long i = 0; i < getArraySize(); i++)
1082                  				{
1083                  					if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
1084                  					{
1085                  						SafeArrayDestroy(pSA);
1086                  						throw CIMException(CIM_ERR_FAILED);
1087                  					}
1088                  				}
1089                  			  
1090                  				var->vt = VT_ARRAY | VT_I4;
1091                  				var->parray = pSA;
1092 kumpf       1.3  				
1093 kumpf       1.2  			}
1094                  			break;
1095                  
1096                  		case CIM_UINT64:
1097                  			if (!isArray())
1098                  			{
1099                  				Uint64 value;
1100                  				
1101                  				get(value);
1102                  				tmp.Format("%I64u", 21, value);
1103                  				var->vt = VT_BSTR;
1104                  				var->bstrVal = tmp.Bstr();
1105                  			}
1106                  			else
1107                  			{
1108                  				rgsabound.lLbound = 0;
1109                  				rgsabound.cElements = getArraySize();
1110                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
1111                  			  
1112                  				if (!pSA)
1113                  				{
1114 kumpf       1.2  					throw CIMException(CIM_ERR_FAILED);
1115                  				}
1116                  			  
1117                  				Array<Uint64> arValue;
1118                  				get(arValue);
1119                  							  
1120                  				for (long i = 0; i < getArraySize(); i++)
1121                  				{
1122                  					tmp.Format("%I64u", 21, arValue[i]);
1123                  
1124                  					CComVariant vOut;
1125                  					vOut.vt = VT_BSTR;
1126                  					vOut.bstrVal = tmp.Bstr();
1127                  
1128                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
1129                  					{
1130                  						SafeArrayDestroy(pSA);
1131                  						throw CIMException (CIM_ERR_FAILED);
1132                  					}
1133 kumpf       1.5  					vOut.Clear();
1134 kumpf       1.2  				}
1135                  			  
1136                  				var->vt = VT_ARRAY | VT_BSTR;
1137                  				var->parray = pSA;
1138 kumpf       1.3  				
1139 kumpf       1.2  			}
1140                  			break;
1141                  
1142                  		case CIM_SINT64:
1143                  			if (!isArray ())
1144                  			{
1145                  				Sint64 value;
1146                  
1147                  				get(value);
1148                  				tmp.Format("%I64d", 21, value);
1149                  				var->vt = VT_BSTR;
1150                  				var->bstrVal = tmp.Bstr();
1151                  			}
1152                  			else
1153                  			{ 
1154                  				rgsabound.lLbound = 0;
1155                  				rgsabound.cElements = getArraySize();
1156                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
1157                  			  
1158                  				if (!pSA)
1159                  				{
1160 kumpf       1.2  					throw CIMException (CIM_ERR_FAILED);
1161                  				}
1162                  			  
1163                  				Array<Sint64> arValue;
1164                  				get(arValue);
1165                  			  
1166                  				for (long i = 0; i < getArraySize(); i++)
1167                  				{
1168                  					CComVariant vOut;
1169                  
1170                  					tmp.Format("%I64d", 21, arValue[i]);
1171                  					vOut.vt = VT_BSTR;
1172                  					vOut.bstrVal = tmp.Bstr();
1173                  
1174                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
1175                  					{
1176                  						SafeArrayDestroy(pSA);
1177                  						throw CIMException(CIM_ERR_FAILED);
1178                  					}
1179 kumpf       1.5  					vOut.Clear();
1180 kumpf       1.2  				}
1181                  			  
1182                  				var->vt = VT_ARRAY | VT_BSTR;
1183                  				var->parray = pSA;
1184 kumpf       1.3  				
1185 kumpf       1.2  			}
1186                  			break;
1187                  
1188                  		case CIM_REAL32:
1189                  			if (!isArray ())
1190                  			{
1191                  				Real32 value;
1192                  
1193                  				var->vt = VT_R4;
1194                  				get(value);
1195                  				var->fltVal = value;
1196                  			}
1197                  			else
1198                  			{
1199                  				rgsabound.lLbound = 0;
1200                  				rgsabound.cElements = getArraySize();
1201                  				pSA = SafeArrayCreate(VT_R4, 1, &rgsabound);
1202                  			  
1203                  				if (!pSA)
1204                  				{
1205                  					throw CIMException (CIM_ERR_FAILED);
1206 kumpf       1.2  				}
1207                  			  
1208                  				Array<Real32> arValue;
1209                  				get(arValue);
1210                  			  
1211                  				for (long i = 0; i < getArraySize(); i++)
1212                  				{
1213                  					if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
1214                  					{
1215                  						SafeArrayDestroy(pSA);
1216                  						throw CIMException(CIM_ERR_FAILED);
1217                  					}
1218                  				}
1219                  			  
1220                  				var->vt = VT_ARRAY | VT_R4;
1221                  				var->parray = pSA;
1222 kumpf       1.3  				
1223 kumpf       1.2  			}
1224                  			break;
1225                  
1226                  		case CIM_REAL64:
1227                  			if (!isArray ())
1228                  			{
1229                  				Real64 value;
1230                  
1231                  				var->vt = VT_R8;
1232                  				get(value);
1233                  				var->dblVal = value;
1234                  			}
1235                  			else
1236                  			{
1237                  				rgsabound.lLbound = 0;
1238                  				rgsabound.cElements = getArraySize();
1239                  				pSA = SafeArrayCreate(VT_R8, 1, &rgsabound);
1240                  			  
1241                  				if (!pSA)
1242                  				{
1243                  					throw CIMException (CIM_ERR_FAILED);
1244 kumpf       1.2  				}
1245                  
1246                  				Array<Real64> arValue;
1247                  				get(arValue);
1248                  			  
1249                  				for (long i = 0; i < getArraySize(); i++)
1250                  				{
1251                  					if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
1252                  					{
1253                  						  SafeArrayDestroy(pSA);
1254                  						throw CIMException(CIM_ERR_FAILED);
1255                  					}
1256                  				}
1257                  			  
1258                  				var->vt = VT_ARRAY | VT_R8;
1259                  				var->parray = pSA;
1260 kumpf       1.3  				
1261 kumpf       1.2  			}
1262                  			break;
1263                  
1264                  		case CIM_CHAR16:
1265                  			if (!isArray ())
1266                  			{
1267                  				Char16 value;
1268                  
1269                  				var->vt = VT_I2;
1270                  				get(value);
1271                  				var->iVal = value;
1272                  			}
1273                  			else
1274                  			{	
1275                  				rgsabound.lLbound = 0;
1276                  				rgsabound.cElements = getArraySize();
1277                  				pSA = SafeArrayCreate(VT_I2, 1, &rgsabound);
1278                  			  
1279                  				if (!pSA)
1280                  				{
1281                  					throw CIMException (CIM_ERR_FAILED);
1282 kumpf       1.2  				}
1283                  			  
1284                  				Array<Char16> arValue;
1285                  				get(arValue);
1286                  			  
1287                  				for (long i = 0; i < getArraySize(); i++)
1288                  				{
1289                  					if ((hr = SafeArrayPutElement(pSA, &i, &arValue[i])))
1290                  					{
1291                  						SafeArrayDestroy(pSA);
1292                  						throw CIMException(CIM_ERR_FAILED);
1293                  					}
1294                  				}
1295                  			  
1296                  				var->vt = VT_ARRAY | VT_I2;
1297                  				var->parray = pSA;
1298 kumpf       1.3  				
1299 kumpf       1.2  			}
1300                  			break;
1301                  
1302                  		case CIM_STRING:
1303                  			if (!isArray())
1304                  			{
1305                  				String data;
1306                  
1307                  				get (data);
1308                  				var->vt = VT_BSTR;
1309 mateus.baur 1.8  				var->bstrVal = SysAllocString((const WCHAR *)data.getChar16Data());
1310 kumpf       1.2  			}
1311                  			else
1312                  			{	  
1313                  				// creates an array of BSTRs
1314                  				rgsabound.lLbound = 0;
1315                  				rgsabound.cElements = getArraySize();
1316                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
1317                  			  
1318                  				if (!pSA)
1319                  				{
1320                  					throw CIMException (CIM_ERR_FAILED);
1321                  				}
1322                  			  
1323                  				Array<String> arValue;
1324                  				get(arValue);
1325                  				
1326                  				for (long i = 0; i < getArraySize(); i++)
1327                  				{
1328                  					CComVariant vOut;
1329                  					
1330                  					vOut.vt = VT_BSTR;  // set type
1331 mateus.baur 1.8  					vOut.bstrVal = SysAllocString((const WCHAR *)arValue[i].getChar16Data());
1332 kumpf       1.2  				  
1333                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
1334                  					{
1335                  						SafeArrayDestroy(pSA);
1336                  						throw CIMException(CIM_ERR_FAILED);
1337                  					}
1338 kumpf       1.5  					vOut.Clear();
1339 kumpf       1.2  				}
1340                  			  
1341                  				var->vt = VT_ARRAY | VT_BSTR;
1342                  				var->parray = pSA;
1343 kumpf       1.3  				
1344 kumpf       1.2  			}
1345                  			break;
1346                  
1347                  		case CIM_DATETIME:
1348                  			if(!isArray())
1349                  			{
1350                  				CIMDateTime value;
1351                  
1352                  				get(value);
1353                  				tmp = value.toString();
1354                  				var->vt = VT_BSTR;
1355                  				var->bstrVal = tmp.Bstr();
1356                  			}
1357                  			else
1358                  			{	  
1359                  				// creates an array of BSTRs
1360                  				rgsabound.lLbound = 0;
1361                  				rgsabound.cElements = getArraySize();
1362                  				pSA = SafeArrayCreate(VT_BSTR, 1, &rgsabound);
1363                  			  
1364                  				if (!pSA)
1365 kumpf       1.2  				{
1366                  					throw CIMException (CIM_ERR_FAILED);
1367                  				}
1368                  			  
1369                  				Array<CIMDateTime> arValue;
1370                  				get(arValue);
1371                  
1372                  				for (long i = 0; i < getArraySize(); i++)
1373                  				{
1374                  					CComVariant vOut;
1375                  
1376                  					tmp = arValue[i].toString();
1377                  					vOut.vt = VT_BSTR;  // set type
1378                  					vOut.bstrVal = tmp.Bstr();
1379                  				  
1380                  					if ((hr = SafeArrayPutElement(pSA, &i, vOut.bstrVal)))
1381                  					{
1382                  						SafeArrayDestroy(pSA);
1383                  						throw CIMException(CIM_ERR_FAILED);
1384                  					}
1385 kumpf       1.5  					vOut.Clear();
1386 kumpf       1.2  				}
1387                  			  
1388                  				var->vt = VT_ARRAY | VT_BSTR;
1389                  				var->parray = pSA;
1390                  			}
1391                  			break;
1392                  
1393                  		case CIM_REFERENCE:
1394                  			{
1395                  				CIMObjectPath value;
1396                  				String sObjName;
1397                  
1398                  				get(value);
1399                  				sObjName = value.toString();
1400                  
1401                  				// Check if has =R".." for a reference instance and
1402                  				//	if so, remove the R
1403                  				Uint32 pos = sObjName.find(qString(Q_REF_KEY));
1404                  				bool bHaveReference = (PEG_NOT_FOUND != pos);
1405                  			  
1406                  				if (bHaveReference)
1407 kumpf       1.2  				{
1408                  					while (PEG_NOT_FOUND != pos)
1409                  					{ 
1410                  						sObjName.remove(pos + 1, 1);	//removing R
1411                  						pos = sObjName.find(qString(Q_REF_KEY));
1412                  					}
1413                  				}
1414                  				tmp = sObjName;
1415                  			  
1416                  				var->vt = VT_BSTR;
1417                  				var->bstrVal = tmp.Bstr();
1418                  			}
1419                  			break;
1420                  
1421                  		case CIM_OBJECT:
1422                  		case CIM_FLAG_ARRAY:
1423                  		case CIM_EMPTY:
1424                  		case CIM_ILLEGAL:
1425                  		default:
1426                  			throw TypeMismatchException();
1427                  
1428 kumpf       1.2  		break;
1429                  	}
1430                  }
1431 kumpf       1.1  
1432                  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2