version 1.11, 2006/01/10 19:41:19
|
version 1.18, 2008/01/15 22:10:54
|
|
|
//%2005//////////////////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development | // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. | // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
|
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. | // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; | // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
// EMC Corporation; VERITAS Software Corporation; The Open Group. | // 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 | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// |
|
// Author: Dong Xiang, EMC Corporation (xiang_dong@emc.com) |
|
// |
|
// Modified By: Seema Gupta (gseema@in.ibm.com) for PEP135 |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "CIMListenerIndicationDispatcher.h" | #include "CIMListenerIndicationDispatcher.h" |
|
|
ContentLanguageList _contentLangs; | ContentLanguageList _contentLangs; |
}; | }; |
| |
CIMListenerIndicationDispatchEvent::CIMListenerIndicationDispatchEvent(CIMIndicationConsumer* consumer, |
CIMListenerIndicationDispatchEvent::CIMListenerIndicationDispatchEvent( |
|
CIMIndicationConsumer* consumer, |
String url, | String url, |
CIMInstance instance, | CIMInstance instance, |
ContentLanguageList contentLangs) | ContentLanguageList contentLangs) |
|
|
{ | { |
return _instance; | return _instance; |
} | } |
ContentLanguageList CIMListenerIndicationDispatchEvent::getContentLanguages() const |
ContentLanguageList |
|
CIMListenerIndicationDispatchEvent::getContentLanguages() const |
{ | { |
return _contentLangs; | return _contentLangs; |
} | } |
|
|
Boolean addConsumer(CIMIndicationConsumer* consumer); | Boolean addConsumer(CIMIndicationConsumer* consumer); |
Boolean removeConsumer(CIMIndicationConsumer* consumer); | Boolean removeConsumer(CIMIndicationConsumer* consumer); |
| |
CIMExportIndicationResponseMessage* handleIndicationRequest(CIMExportIndicationRequestMessage* request); |
CIMExportIndicationResponseMessage* handleIndicationRequest( |
|
CIMExportIndicationRequestMessage* request); |
| |
| |
static PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL deliver_routine(void *param); |
static ThreadReturnType PEGASUS_THREAD_CDECL deliver_routine(void *param); |
| |
private: | private: |
void deliverIndication(String url, CIMInstance instance, ContentLanguageList contentLangs); |
void deliverIndication(String url, |
|
CIMInstance instance, |
|
ContentLanguageList contentLangs); |
| |
ThreadPool* _thread_pool; | ThreadPool* _thread_pool; |
PtrList* _consumers; | PtrList* _consumers; |
|
|
| |
CIMListenerIndicationDispatcherRep::CIMListenerIndicationDispatcherRep() | CIMListenerIndicationDispatcherRep::CIMListenerIndicationDispatcherRep() |
:_thread_pool(new ThreadPool(0, "ListenerIndicationDispatcher", 0, 0, | :_thread_pool(new ThreadPool(0, "ListenerIndicationDispatcher", 0, 0, |
deallocateWait)) |
deallocateWait)), _consumers(new PtrList()) |
,_consumers(new PtrList()) |
|
{ | { |
| |
} | } |
|
|
delete _consumers; | delete _consumers; |
} | } |
| |
Boolean CIMListenerIndicationDispatcherRep::addConsumer(CIMIndicationConsumer* consumer) |
Boolean CIMListenerIndicationDispatcherRep::addConsumer( |
|
CIMIndicationConsumer* consumer) |
{ | { |
_consumers->add(consumer); | _consumers->add(consumer); |
return true; | return true; |
} | } |
Boolean CIMListenerIndicationDispatcherRep::removeConsumer(CIMIndicationConsumer* consumer) |
Boolean CIMListenerIndicationDispatcherRep::removeConsumer( |
|
CIMIndicationConsumer* consumer) |
{ | { |
_consumers->remove(consumer); | _consumers->remove(consumer); |
return true; | return true; |
} | } |
CIMExportIndicationResponseMessage* CIMListenerIndicationDispatcherRep::handleIndicationRequest(CIMExportIndicationRequestMessage* request) |
CIMExportIndicationResponseMessage* |
|
CIMListenerIndicationDispatcherRep::handleIndicationRequest( |
|
CIMExportIndicationRequestMessage* request) |
{ | { |
PEG_METHOD_ENTER(TRC_SERVER, | PEG_METHOD_ENTER(TRC_SERVER, |
"CIMListenerIndicationDispatcherRep::handleIndicationRequest"); | "CIMListenerIndicationDispatcherRep::handleIndicationRequest"); |
| |
CIMInstance instance = request->indicationInstance; | CIMInstance instance = request->indicationInstance; |
String url = request->destinationPath; | String url = request->destinationPath; |
ContentLanguageList contentLangs =((ContentLanguageListContainer)request->operationContext. |
ContentLanguageList contentLangs = |
|
((ContentLanguageListContainer)request->operationContext. |
get(ContentLanguageListContainer::NAME)).getLanguages(); | get(ContentLanguageListContainer::NAME)).getLanguages(); |
| |
deliverIndication(url,instance,contentLangs); | deliverIndication(url,instance,contentLangs); |
|
|
// compose a response message | // compose a response message |
CIMException cimException; | CIMException cimException; |
| |
CIMExportIndicationResponseMessage* response = new CIMExportIndicationResponseMessage( |
CIMExportIndicationResponseMessage* response = |
request->messageId, |
dynamic_cast<CIMExportIndicationResponseMessage*>( |
cimException, |
request->buildResponse()); |
request->queueIds.copyAndPop()); |
response->cimException = cimException; |
|
|
response->dest = request->queueIds.top(); | response->dest = request->queueIds.top(); |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
CIMInstance instance, | CIMInstance instance, |
ContentLanguageList contentLangs) | ContentLanguageList contentLangs) |
{ | { |
// go thru all consumers and broadcast the result; should be run in seperate thread |
// go thru all consumers and broadcast the result; |
Iterator* it = _consumers->iterator(); |
// should be run in seperate thread |
|
AutoPtr<Iterator> it( _consumers->iterator() ); |
|
|
while(it->hasNext()==true) | while(it->hasNext()==true) |
{ | { |
CIMIndicationConsumer* consumer = static_cast<CIMIndicationConsumer*>(it->next()); |
CIMIndicationConsumer* consumer = |
CIMListenerIndicationDispatchEvent* event = new CIMListenerIndicationDispatchEvent( |
static_cast<CIMIndicationConsumer*>(it->next()); |
consumer, |
CIMListenerIndicationDispatchEvent* event = |
|
new CIMListenerIndicationDispatchEvent(consumer, |
url, | url, |
instance, | instance, |
contentLangs); | contentLangs); |
ThreadStatus rtn = _thread_pool->allocate_and_awaken(event,deliver_routine); |
ThreadStatus rtn = _thread_pool->allocate_and_awaken( |
|
event,deliver_routine); |
| |
if (rtn != PEGASUS_THREAD_OK) | if (rtn != PEGASUS_THREAD_OK) |
{ | { |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
Logger::put(Logger::STANDARD_LOG, System::CIMLISTENER, |
"Not enough threads to allocate a worker to deliver the event. "); |
Logger::TRACE, |
|
"Not enough threads to allocate a worker to deliver" |
Tracer::trace(TRC_SERVER, Tracer::LEVEL2, |
" the event. "); |
"Could not allocate thread to deliver event. Instead using current thread."); |
|
|
PEG_TRACE_CSTRING(TRC_SERVER, Tracer::LEVEL2, |
|
"Could not allocate thread to deliver event." |
|
" Instead using current thread."); |
delete event; | delete event; |
throw Exception(MessageLoaderParms("Listener.CIMListenerIndicationDispatcher.CANNOT_ALLOCATE_THREAD", |
throw Exception(MessageLoaderParms( |
"Not enough threads to allocate a worker to deliver the event.")); |
"Listener.CIMListenerIndicationDispatcher." |
|
"CANNOT_ALLOCATE_THREAD", |
|
"Not enough threads to allocate a worker to deliver the" |
|
" event.")); |
} | } |
} | } |
} | } |
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL CIMListenerIndicationDispatcherRep::deliver_routine(void *param) |
ThreadReturnType PEGASUS_THREAD_CDECL |
|
CIMListenerIndicationDispatcherRep::deliver_routine(void *param) |
{ | { |
CIMListenerIndicationDispatchEvent* event = static_cast<CIMListenerIndicationDispatchEvent*>(param); |
CIMListenerIndicationDispatchEvent* event = |
|
static_cast<CIMListenerIndicationDispatchEvent*>(param); |
| |
if(event!=NULL) | if(event!=NULL) |
{ | { |
CIMIndicationConsumer* consumer = event->getConsumer(); | CIMIndicationConsumer* consumer = event->getConsumer(); |
OperationContext context; | OperationContext context; |
context.insert(ContentLanguageListContainer(event->getContentLanguages())); |
context.insert(ContentLanguageListContainer( |
|
event->getContentLanguages())); |
if(consumer) | if(consumer) |
{ | { |
consumer->consumeIndication(context,event->getURL(),event->getIndicationInstance()); |
consumer->consumeIndication(context, |
|
event->getURL(),event->getIndicationInstance()); |
} | } |
| |
delete event; | delete event; |
|
|
| |
void CIMListenerIndicationDispatcher::handleEnqueue() | void CIMListenerIndicationDispatcher::handleEnqueue() |
{ | { |
PEG_METHOD_ENTER(TRC_SERVER, "CIMListenerIndicationDispatcher::handleEnqueue"); |
PEG_METHOD_ENTER(TRC_SERVER, |
|
"CIMListenerIndicationDispatcher::handleEnqueue"); |
| |
Message *message = dequeue(); | Message *message = dequeue(); |
if(message) | if(message) |
|
|
| |
void CIMListenerIndicationDispatcher::handleEnqueue(Message* message) | void CIMListenerIndicationDispatcher::handleEnqueue(Message* message) |
{ | { |
PEG_METHOD_ENTER(TRC_SERVER, "CIMListenerIndicationDispatcher::handleEnqueue"); |
PEG_METHOD_ENTER(TRC_SERVER, |
|
"CIMListenerIndicationDispatcher::handleEnqueue"); |
| |
if(message!=NULL) | if(message!=NULL) |
{ | { |
|
|
{ | { |
case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: | case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: |
{ | { |
CIMExportIndicationRequestMessage* request = (CIMExportIndicationRequestMessage*)message; |
CIMExportIndicationRequestMessage* request = |
|
(CIMExportIndicationRequestMessage*)message; |
| |
CIMExportIndicationResponseMessage* response = | CIMExportIndicationResponseMessage* response = |
static_cast<CIMListenerIndicationDispatcherRep*>(_rep)->handleIndicationRequest(request); |
static_cast<CIMListenerIndicationDispatcherRep*>(_rep)-> |
|
handleIndicationRequest(request); |
| |
_enqueueResponse(request, response); | _enqueueResponse(request, response); |
} | } |
|
|
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
Boolean CIMListenerIndicationDispatcher::addConsumer(CIMIndicationConsumer* consumer) |
Boolean CIMListenerIndicationDispatcher::addConsumer( |
|
CIMIndicationConsumer* consumer) |
{ | { |
return static_cast<CIMListenerIndicationDispatcherRep*>(_rep)->addConsumer(consumer); |
return static_cast<CIMListenerIndicationDispatcherRep*>(_rep)->addConsumer( |
|
consumer); |
} | } |
Boolean CIMListenerIndicationDispatcher::removeConsumer(CIMIndicationConsumer* consumer) |
Boolean CIMListenerIndicationDispatcher::removeConsumer( |
|
CIMIndicationConsumer* consumer) |
{ | { |
return static_cast<CIMListenerIndicationDispatcherRep*>(_rep)->removeConsumer(consumer); |
return static_cast<CIMListenerIndicationDispatcherRep*> |
|
(_rep)->removeConsumer(consumer); |
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |