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

File: [Pegasus] / pegasus / src / Pegasus / Provider / CIMOMHandle.cpp (download)
Revision: 1.9, Mon Jan 21 19:36:39 2002 UTC (22 years, 5 months ago) by chip
Branch: MAIN
CVS Tags: pre-meta-dispatcher, VERSION_1_07
Changes since 1.8: +5 -3 lines
fixed inputQueue and wait timeout

//%/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM
//
// 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.
//
//==============================================================================
//
// Author: Chip Vincent (cvincent@us.ibm.com)
//
// Modified By: Mike Brasher (mbrasher@bmc.com)
//              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
//              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
//
//%/////////////////////////////////////////////////////////////////////////////

#include "CIMOMHandle.h"
#include <Pegasus/Common/Config.h>
#include <Pegasus/Common/XmlWriter.h>
#include <Pegasus/Common/CIMMessage.h>
#include <Pegasus/Common/Destroyer.h>
#include <Pegasus/Common/System.h>

PEGASUS_NAMESPACE_BEGIN

CIMOMHandle::CIMOMHandle(void) : _outputQueue(0), _inputQueue(0)
{
	_outputQueue = MessageQueue::lookup("CIMOpRequestDispatcher");
	
	PEGASUS_ASSERT(_outputQueue != 0);

	_inputQueue = new MessageQueue;

	PEGASUS_ASSERT(_inputQueue != 0);
}

CIMOMHandle::~CIMOMHandle(void)
{
	delete _inputQueue;
}

CIMOMHandle& CIMOMHandle::operator=(const CIMOMHandle& handle)
{
	if(this == &handle)
	{
		return(*this);
	}

	_outputQueue = handle._outputQueue;
	
	// do not assign a new input queue. each instance has its own
	//_inputQueue = handle._inputQueue;

	return(*this);
}

CIMClass CIMOMHandle::getClass(
	const OperationContext & context,
	const String& nameSpace,
	const String& className,
	Boolean localOnly,
	Boolean includeQualifiers,
	Boolean includeClassOrigin,
	const CIMPropertyList& propertyList)
{
	// encode request
	Message* request = new CIMGetClassRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		localOnly,
		includeQualifiers,
		includeClassOrigin,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_GET_CLASS_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMGetClassResponseMessage* response = (CIMGetClassResponseMessage*)message;

	Destroyer<CIMGetClassResponseMessage> destroyer(response);
	
	_checkError(response);

	return(response->cimClass);
}

void CIMOMHandle::getClassAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
    Boolean localOnly,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
    const CIMPropertyList& propertyList,
	ResponseHandler<CIMClass> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMClass> CIMOMHandle::enumerateClasses(
	const OperationContext & context,
	const String& nameSpace,
	const String& className,
	Boolean deepInheritance,
	Boolean localOnly,
	Boolean includeQualifiers,
	Boolean includeClassOrigin)
{
	Message* request = new CIMEnumerateClassesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		deepInheritance,
		localOnly,
		includeQualifiers,
		includeClassOrigin,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMEnumerateClassesResponseMessage* response = (CIMEnumerateClassesResponseMessage*)message;

	Destroyer<CIMEnumerateClassesResponseMessage> destroyer(response);

	_checkError(response);

	return(response->cimClasses);
}

void CIMOMHandle::enumerateClassesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
    Boolean deepInheritance,
    Boolean localOnly,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
	ResponseHandler<CIMClass> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<String> CIMOMHandle::enumerateClassNames(
	const OperationContext & context,
	const String& nameSpace,
	const String& className,
	Boolean deepInheritance)
{
	Message* request = new CIMEnumerateClassNamesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		deepInheritance,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMEnumerateClassNamesResponseMessage* response = (CIMEnumerateClassNamesResponseMessage*)message;

	Destroyer<CIMEnumerateClassNamesResponseMessage> destroyer(response);

	_checkError(response);

	return(response->classNames);
}

void CIMOMHandle::enumerateClassNamesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
    Boolean deepInheritance,
	ResponseHandler<CIMReference> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::createClass(
	const OperationContext & context,
	const String& nameSpace,
	const CIMClass& newClass)
{
	Message* request = new CIMCreateClassRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		newClass,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_CREATE_CLASS_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMCreateClassResponseMessage* response = (CIMCreateClassResponseMessage*)message;

	Destroyer<CIMCreateClassResponseMessage> destroyer(response);

	_checkError(response);
}

void CIMOMHandle::createClassAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMClass& newClass,
	ResponseHandler<CIMClass> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::modifyClass(
	const OperationContext & context,
	const String& nameSpace,
	const CIMClass& modifiedClass)
{
	Message* request = new CIMModifyClassRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		modifiedClass,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_MODIFY_CLASS_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMModifyClassResponseMessage* response = (CIMModifyClassResponseMessage*)message;

	Destroyer<CIMModifyClassResponseMessage> destroyer(response);

	_checkError(response);
}

void CIMOMHandle::modifyClassAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMClass& modifiedClass,
	ResponseHandler<CIMClass> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::deleteClass(
	const OperationContext & context,
	const String& nameSpace,
	const String& className)
{
	// encode request
	Message* request = new CIMDeleteClassRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_DELETE_CLASS_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMDeleteClassResponseMessage* response = (CIMDeleteClassResponseMessage*)message;

	Destroyer<CIMDeleteClassResponseMessage> destroyer(response);
	
	_checkError(response);
}

void CIMOMHandle::deleteClassAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
	ResponseHandler<CIMClass> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

CIMInstance CIMOMHandle::getInstance(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& instanceName,
	Boolean localOnly,
	Boolean includeQualifiers,
	Boolean includeClassOrigin,
	const CIMPropertyList& propertyList)
{
	// encode request
	Message* request = new CIMGetInstanceRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		instanceName,
		localOnly,
		includeQualifiers,
		includeClassOrigin,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_GET_INSTANCE_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMGetInstanceResponseMessage* response = (CIMGetInstanceResponseMessage*)message;

	Destroyer<CIMGetInstanceResponseMessage> destroyer(response);
	
	_checkError(response);

	return(response->cimInstance);
}

void CIMOMHandle::getInstanceAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& instanceName,
    Boolean localOnly,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
    const CIMPropertyList& propertyList,
	ResponseHandler<CIMInstance> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMInstance> CIMOMHandle::enumerateInstances(
	const OperationContext & context,
	const String& nameSpace,
	const String& className,
	Boolean deepInheritance,
	Boolean localOnly,
	Boolean includeQualifiers,
	Boolean includeClassOrigin,
	const CIMPropertyList& propertyList)
{
	Message* request = new CIMEnumerateInstancesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		deepInheritance,
		localOnly,
		includeQualifiers,
		includeClassOrigin,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMEnumerateInstancesResponseMessage* response = (CIMEnumerateInstancesResponseMessage*)message;

	Destroyer<CIMEnumerateInstancesResponseMessage> destroyer(response);

	_checkError(response);

	Array<CIMInstance> cimInstances;

	for(Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
	{
		cimInstances.append(response->cimNamedInstances[i].getInstance());
	}

	return(cimInstances);
}

void CIMOMHandle::enumerateInstancesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
    Boolean deepInheritance,
    Boolean localOnly,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
    const CIMPropertyList& propertyList,
	ResponseHandler<CIMInstance> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMReference> CIMOMHandle::enumerateInstanceNames(
	const OperationContext & context,
	const String& nameSpace,
	const String& className)
{
	Message* request = new CIMEnumerateInstanceNamesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		className,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMEnumerateInstanceNamesResponseMessage* response = (CIMEnumerateInstanceNamesResponseMessage*)message;

	Destroyer<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);

	_checkError(response);

	return(response->instanceNames);
}

void CIMOMHandle::enumerateInstanceNamesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const String& className,
	ResponseHandler<CIMReference> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

CIMReference CIMOMHandle::createInstance(
	const OperationContext & context,
	const String& nameSpace,
	const CIMInstance& newInstance)
{
	Message* request = new CIMCreateInstanceRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		newInstance,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_CREATE_INSTANCE_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMCreateInstanceResponseMessage* response = (CIMCreateInstanceResponseMessage*)message;

	Destroyer<CIMCreateInstanceResponseMessage> destroyer(response);

	_checkError(response);

	return(response->instanceName);
}

void CIMOMHandle::createInstanceAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMInstance& newInstance,
	ResponseHandler<CIMInstance> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::modifyInstance(
	const OperationContext & context,
	const String& nameSpace,
	const CIMInstance& modifiedInstance,
	Boolean includeQualifiers,
	const CIMPropertyList& propertyList)
{
	Message* request = new CIMModifyInstanceRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		//modifiedInstance,
		CIMNamedInstance(),
		includeQualifiers,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMModifyInstanceResponseMessage* response = (CIMModifyInstanceResponseMessage*)message;

	Destroyer<CIMModifyInstanceResponseMessage> destroyer(response);

	_checkError(response);
}

void CIMOMHandle::modifyInstanceAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMInstance& modifiedInstance,
    Boolean includeQualifiers,
	const CIMPropertyList& propertyList,
	ResponseHandler<CIMInstance> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::deleteInstance(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& instanceName)
{
	Message* request = new CIMDeleteInstanceRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		instanceName,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_DELETE_INSTANCE_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMDeleteInstanceResponseMessage* response = (CIMDeleteInstanceResponseMessage*)message;

	Destroyer<CIMDeleteInstanceResponseMessage> destroyer(response);

	_checkError(response);
}

void CIMOMHandle::deleteInstanceAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& instanceName,
	ResponseHandler<CIMInstance> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMInstance> CIMOMHandle::execQuery(
	const OperationContext & context,
	const String& queryLanguage,
	const String& query)
{
	Message* request = new CIMExecQueryRequestMessage(
		XmlWriter::getNextMessageId(),
		queryLanguage,
		query,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_EXEC_QUERY_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMExecQueryResponseMessage* response = (CIMExecQueryResponseMessage*)message;

	Destroyer<CIMExecQueryResponseMessage> destroyer(response);

	_checkError(response);

	return(response->cimInstances);
}

void CIMOMHandle::execQueryAsync(
	const OperationContext & context,
    const String& queryLanguage,
    const String& query,
	ResponseHandler<CIMObject> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMObject> CIMOMHandle::associators(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& objectName,
	const String& assocClass,
	const String& resultClass,
	const String& role,
	const String& resultRole,
	Boolean includeQualifiers,
	Boolean includeClassOrigin,
	const CIMPropertyList& propertyList)
{
	Message* request = new CIMAssociatorsRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		objectName,
		assocClass,
		resultClass,
		role,
		resultRole,
		includeQualifiers,
		includeClassOrigin,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ASSOCIATORS_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMAssociatorsResponseMessage* response = (CIMAssociatorsResponseMessage*)message;

	Destroyer<CIMAssociatorsResponseMessage> destroyer(response);

	_checkError(response);

	Array<CIMObject> cimObjects;

	for(Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
	{
		cimObjects.append(response->cimObjects[i].getObject());
	}

	return(cimObjects);
}

void CIMOMHandle::associatorsAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& objectName,
    const String& assocClass,
    const String& resultClass,
    const String& role,
    const String& resultRole,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
    const CIMPropertyList& propertyList,
	ResponseHandler<CIMObject> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMReference> CIMOMHandle::associatorNames(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& objectName,
	const String& assocClass,
	const String& resultClass,
	const String& role,
	const String& resultRole)
{
	Message* request = new CIMAssociatorNamesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		objectName,
		assocClass,
		resultClass,
		role,
		resultRole,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMAssociatorNamesResponseMessage* response = (CIMAssociatorNamesResponseMessage*)message;

	Destroyer<CIMAssociatorNamesResponseMessage> destroyer(response);

	_checkError(response);

	return(response->objectNames);
}

void CIMOMHandle::associatorNamesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& objectName,
    const String& assocClass,
    const String& resultClass,
    const String& role,
    const String& resultRole,
	ResponseHandler<CIMReference> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMObject> CIMOMHandle::references(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& objectName,
	const String& resultClass,
	const String& role,
	Boolean includeQualifiers,
	Boolean includeClassOrigin,
	const CIMPropertyList& propertyList)
{
	Message* request = new CIMReferencesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		objectName,
		resultClass,
		role,
		includeQualifiers,
		includeClassOrigin,
		propertyList,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();

	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_REFERENCES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMReferencesResponseMessage* response = (CIMReferencesResponseMessage*)message;

	Destroyer<CIMReferencesResponseMessage> destroyer(response);

	_checkError(response);

	Array<CIMObject> cimObjects;

	for(Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
	{
		cimObjects.append(response->cimObjects[i].getObject());
	}

	return(cimObjects);
}

void CIMOMHandle::referencesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& objectName,
    const String& resultClass,
    const String& role,
    Boolean includeQualifiers,
    Boolean includeClassOrigin,
    const CIMPropertyList& propertyList,
    ResponseHandler<CIMObject> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

Array<CIMReference> CIMOMHandle::referenceNames(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& objectName,
	const String& resultClass,
	const String& role)
{
	Message* request = new CIMReferenceNamesRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		objectName,
		resultClass,
		role,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_REFERENCE_NAMES_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMReferenceNamesResponseMessage* response = (CIMReferenceNamesResponseMessage*)message;

	Destroyer<CIMReferenceNamesResponseMessage> destroyer(response);

	_checkError(response);

	return(response->objectNames);
}

void CIMOMHandle::referenceNamesAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& objectName,
    const String& resultClass,
    const String& role,
	ResponseHandler<CIMReference> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

CIMValue CIMOMHandle::getProperty(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& instanceName,
	const String& propertyName)
{
	Message* request = new CIMGetPropertyRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		instanceName,
		propertyName,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_GET_PROPERTY_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMGetPropertyResponseMessage* response = (CIMGetPropertyResponseMessage*)message;

	Destroyer<CIMGetPropertyResponseMessage> destroyer(response);

	_checkError(response);

	return(response->value);
}

void CIMOMHandle::getPropertyAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& instanceName,
    const String& propertyName,
	ResponseHandler<CIMValue> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

void CIMOMHandle::setProperty(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& instanceName,
	const String& propertyName,
	const CIMValue& newValue)
{
	Message* request = new CIMSetPropertyRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		instanceName,
		propertyName,
		newValue,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_SET_PROPERTY_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMSetPropertyResponseMessage* response = (CIMSetPropertyResponseMessage*)message;

	Destroyer<CIMSetPropertyResponseMessage> destroyer(response);

	_checkError(response);
}

void CIMOMHandle::setPropertyAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& instanceName,
    const String& propertyName,
    const CIMValue& newValue,
	ResponseHandler<CIMValue> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}

/*
CIMValue CIMOMHandle::invokeMethod(
	const OperationContext & context,
	const String& nameSpace,
	const CIMReference& instanceName,
	const String& methodName,
	const Array<CIMParamValue>& inParameters,
	Array<CIMParamValue>& outParameters)
{
	Message* request = new CIMInvokeMethodRequestMessage(
		XmlWriter::getNextMessageId(),
		nameSpace,
		instanceName,
		methodName,
		inParameters,
		QueueIdStack(_inputQueue->getQueueId()));

	// save message key
	Uint32 messageKey = request->getKey();
	
	// send request
	_outputQueue->enqueue(request);

	// wait for response
	Message* message = _waitForResponse(CIM_INVOKE_METHOD_RESPONSE_MESSAGE, messageKey);

	// decode response
	CIMInvokeMethodResponseMessage* response = (CIMInvokeMethodResponseMessage*)message;

	Destroyer<CIMInvokeMethodResponseMessage> destroyer(response);

	_checkError(response);

	outParameters = response->outParameters;
	
	return(response->retValue);
}

void CIMOMHandle::invokeMethodAsync(
	const OperationContext & context,
    const String& nameSpace,
    const CIMReference& instanceName,
    const String& methodName,
    const Array<CIMParamValue>& inParameters,
    Array<CIMParamValue>& outParameters,
	ResponseHandler<CIMValue> & handler)
{
    throw CIMException(CIM_ERR_NOT_SUPPORTED);
}
*/

Message * CIMOMHandle::_waitForResponse(
	const Uint32 messageType,
	const Uint32 messageKey,
	const Uint32 timeout)
{
	if(_inputQueue == 0) {
		throw UnitializedHandle();
	}
	
	// immediately attempt to locate a message of the requested type
	Message * message = _inputQueue->find(messageType, messageKey);

	// if the message is null and the timeout is greater than 0, go into
	// a sleep retry mode until the
	// timeout expires or a message of the requested type arrives. a timeout value of 0xffffffff represents
	// infinity.
	for(Uint32 i = 0; ((i < timeout) || (timeout == 0xffffffff)) && (message == 0); i++)
	{
		System::sleep(1);
		
		message = _inputQueue->find(messageType, messageKey);
	}

	if(message == 0) {
		throw CIMException(CIM_ERR_FAILED, __FILE__, __LINE__, "queue underflow");
	}

	_inputQueue->remove(message);

	return(message);
}

void CIMOMHandle::_checkError(const CIMResponseMessage* responseMessage)
{
    if (responseMessage && (responseMessage->errorCode != CIM_ERR_SUCCESS))
    {
	throw CIMException(responseMessage->errorCode,
	    __FILE__, __LINE__, responseMessage->errorDescription);
    }
}

PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2