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

  1 karl  1.54 //%2006////////////////////////////////////////////////////////////////////////
  2 mday  1.1  //
  3 karl  1.45 // 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.41 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.45 // 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.47 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl  1.54 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12            // EMC Corporation; Symantec Corporation; The Open Group.
 13 mday  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 karl  1.54 // 
 21 mday  1.1  // 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            //%/////////////////////////////////////////////////////////////////////////////
 33            
 34            #include "ModuleController.h"
 35 kumpf 1.62 #include <Pegasus/Common/MessageLoader.h>
 36            #include <Pegasus/Common/InternalException.h>
 37            
 38 mday  1.1  PEGASUS_NAMESPACE_BEGIN
 39            
 40            PEGASUS_USING_STD;
 41 david.dillard 1.51 
 42 kumpf         1.62 RegisteredModuleHandle::RegisteredModuleHandle(
 43                        const String& name,
 44                        void* module_address,
 45                        Message* (*receive_message)(Message *, void *),
 46                        void (*async_callback)(Uint32, Message *, void *))
 47                        : _name(name),
 48                          _module_address(module_address),
 49                          _module_receive_message(receive_message),
 50                          _async_callback(async_callback)
 51 mday          1.6  {
 52 kumpf         1.62     PEGASUS_ASSERT(_module_receive_message != 0);
 53 mday          1.6  }
 54                    
 55 kumpf         1.62 RegisteredModuleHandle::~RegisteredModuleHandle()
 56 mday          1.6  {
 57                    }
 58 david.dillard 1.51 
 59 kumpf         1.62 const String & RegisteredModuleHandle::get_name() const
 60 mday          1.6  {
 61 kumpf         1.62     return _name;
 62 mday          1.6  }
 63                    
 64 kumpf         1.62 Message* RegisteredModuleHandle::_receive_message(Message *msg)
 65 mday          1.2  {
 66 kumpf         1.62     return _module_receive_message(msg, _module_address);
 67 mday          1.2  }
 68                    
 69 kumpf         1.62 void RegisteredModuleHandle::_send_async_callback(
 70                        Uint32 msg_handle,
 71                        Message* msg,
 72                        void* parm)
 73 mday          1.2  {
 74 kumpf         1.62     // ATTN: Assert this condition?
 75                        if (_async_callback == 0)
 76                        {
 77                            throw NotImplemented("Module Async Receive");
 78                        }
 79 mday          1.1  
 80 kumpf         1.62     _async_callback(msg_handle, msg, parm);
 81 mday          1.6  }
 82                    
 83 mday          1.3  
 84                    ModuleController::ModuleController(const char *name )
 85 david.dillard 1.51    :Base(name, MessageQueue::getNextQueueId(),
 86 mday          1.4  	 module_capabilities::module_controller |
 87                    	 module_capabilities::async),
 88 mike          1.55     _modules()
 89 david.dillard 1.51 {
 90 mday          1.3  }
 91                    
 92 kumpf         1.5  ModuleController::~ModuleController()
 93                    {
 94                    
 95 kumpf         1.62    RegisteredModuleHandle *module;
 96 mday          1.40 
 97 david.dillard 1.51    try
 98 mday          1.40    {
 99 mike          1.55       module = _modules.remove_front();
100 mday          1.40       while(module)
101                          {
102                    	 delete module;
103 mike          1.55 	 module = _modules.remove_front();
104 mday          1.40       }
105                    
106                       }
107                       catch(...)
108 mday          1.6     {
109                       }
110 kumpf         1.5  }
111 mday          1.3  
112 david.dillard 1.51 // called by a module to register itself, returns a handle to the controller
113 kumpf         1.62 ModuleController & ModuleController::register_module(
114                        const String & controller_name,
115                        const String & module_name,
116                        void *module_address,
117                        Message * (*receive_message)(Message *, void *),
118                        void (*async_callback)(Uint32, Message *, void *),
119                        RegisteredModuleHandle** instance)
120 mday          1.3  {
121 kumpf         1.62    RegisteredModuleHandle *module;
122 mday          1.6     ModuleController *controller;
123 david.dillard 1.51 
124 mday          1.6     Array<Uint32> services;
125 david.dillard 1.51 
126 kumpf         1.37    MessageQueue *message_queue = MessageQueue::lookup(controller_name.getCString());
127 david.dillard 1.51 
128 mday          1.6     if ((message_queue == NULL) || ( false == message_queue->isAsync() ))
129                       {
130 kumpf         1.36       throw IncompatibleTypesException();
131 mday          1.6     }
132                    
133                       MessageQueueService *service = static_cast<MessageQueueService *>(message_queue);
134                       if( (service == NULL) ||  ! ( service->get_capabilities() & module_capabilities::module_controller ))
135 kumpf         1.7     {
136 kumpf         1.36       throw IncompatibleTypesException();
137 kumpf         1.7     }
138 mday          1.6  
139 kumpf         1.7     controller = static_cast<ModuleController *>(service);
140 david.dillard 1.51 
141 mday          1.40    {
142 david.dillard 1.51 
143 mday          1.4     // see if the module already exists in this controller.
144 mday          1.40    _module_lock lock(&(controller->_modules));
145 david.dillard 1.51 
146 mike          1.55    module = controller->_modules.front();
147 mday          1.4     while(module != NULL )
148                       {
149                          if(module->get_name() == module_name )
150                          {
151 humberto      1.39 	 MessageLoaderParms parms("Common.ModuleController.MODULE",
152                    	 						  "module \"$0\"",
153                    	 						  module_name);
154                    	 throw AlreadyExistsException(parms);
155 mday          1.4        }
156 mike          1.55       module = controller->_modules.next_of(module);
157 mday          1.4     }
158 david.dillard 1.51 
159 mday          1.40    }
160 david.dillard 1.51 
161 mday          1.4     // now reserve this module name with the meta dispatcher
162                    
163                       Uint32 result = 0 ;
164 kumpf         1.58    AutoPtr<RegisteredModule> request(new RegisteredModule(
165 david.dillard 1.51 			   0,
166                    			   true,
167 mday          1.25 			   controller->getQueueId(),
168 a.arora       1.43 			   module_name));
169 mday          1.21 
170                       request->dest = CIMOM_Q_ID;
171 david.dillard 1.51 
172 a.arora       1.43    AutoPtr<AsyncReply> response(controller->SendWait(request.get()));
173 david.dillard 1.51    if( response.get() != NULL)
174 mday          1.4        result  = response->result;
175 david.dillard 1.51 
176 a.arora       1.43    request.reset();
177                       response.reset();
178 kumpf         1.62    if ( result == async_results::MODULE_ALREADY_REGISTERED)
179                       {
180 humberto      1.39       MessageLoaderParms parms("Common.ModuleController.MODULE",
181 kumpf         1.62          "module \"$0\"", module_name);
182                          throw AlreadyExistsException(parms);
183 humberto      1.39    }
184 david.dillard 1.51 
185                       // the module does not exist, go ahead and create it.
186 kumpf         1.62    module = new RegisteredModuleHandle(
187 david.dillard 1.51 			       module_name,
188                    			       module_address,
189                    			       receive_message,
190 kumpf         1.62 			       async_callback);
191 david.dillard 1.51 
192 mike          1.55    controller->_modules.insert_back(module);
193 david.dillard 1.51 
194 mday          1.8     if(instance != NULL)
195                          *instance = module;
196 david.dillard 1.51 
197 mday          1.6     return *controller;
198 mday          1.3  }
199                    
200 mday          1.4  
201                    Boolean ModuleController::deregister_module(const String & module_name)
202                    {
203 kumpf         1.58    AutoPtr<DeRegisteredModule> request(new DeRegisteredModule(
204 mday          1.4  			     0,
205                    			     true,
206                    			     getQueueId(),
207 a.arora       1.43 			     module_name));
208 mday          1.4     request->dest = _meta_dispatcher->getQueueId();
209 david.dillard 1.51 
210 a.arora       1.43    AutoPtr<AsyncReply> response(SendWait(request.get()));
211 mday          1.4  
212 a.arora       1.43    request.reset();
213                       response.reset();
214 david.dillard 1.51 
215 kumpf         1.62    RegisteredModuleHandle *module;
216 mday          1.40 
217                       _module_lock lock(&_modules);
218 mike          1.55    module = _modules.front();
219 mday          1.4     while(module != NULL )
220                       {
221                          if( module->get_name() == module_name)
222                          {
223 mike          1.55 	 _modules.remove(module);
224 mday          1.40 	 return true;
225 mday          1.4        }
226 mike          1.55       module = _modules.next_of(module);
227 mday          1.4     }
228 mday          1.40    return false;
229 mday          1.4  }
230                    
231 kumpf         1.62 Boolean ModuleController::verify_handle(RegisteredModuleHandle *handle)
232 mday          1.4  {
233 kumpf         1.62    RegisteredModuleHandle *module;
234 david.dillard 1.51 
235 kumpf         1.62    if (handle->_module_address == (void *)this)
236 mday          1.16       return true;
237 david.dillard 1.51 
238 mday          1.40    _module_lock lock(&_modules);
239 david.dillard 1.51 
240 mike          1.55    module = _modules.front();
241 mday          1.4     while(module != NULL)
242                       {
243                          if ( module == handle)
244                          {
245 mday          1.40 	 return true;
246 mday          1.4        }
247 mike          1.55       module = _modules.next_of(module);
248 mday          1.4     }
249 mday          1.40    return false;
250 mday          1.4  }
251                    
252                    // given a name, find a service's queue id
253 kumpf         1.62 Uint32 ModuleController::find_service(
254                        const RegisteredModuleHandle & handle,
255                        const String & name)
256 mday          1.4  {
257                    
258 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
259 mike          1.63       throw Permission(Threads::self());
260 mday          1.4     Array<Uint32> services;
261                       Base::find_services(name, 0, 0, &services);
262                       return( services[0]);
263                    }
264                    
265                    
266 david.dillard 1.51 // returns the queue ID of the service hosting the named module,
267 mday          1.4  // zero otherwise
268                    
269 kumpf         1.62 Uint32 ModuleController::find_module_in_service(
270                        const RegisteredModuleHandle & handle,
271                        const String & name)
272 mday          1.4  {
273 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
274 mike          1.63       throw(Permission(Threads::self()));
275 david.dillard 1.51 
276 mday          1.4     Uint32 result = 0 ;
277                    
278 kumpf         1.58    AutoPtr<FindModuleInService> request(new FindModuleInService(
279 david.dillard 1.51 			      0,
280                    			      true,
281 mday          1.4  			      _meta_dispatcher->getQueueId(),
282 david.dillard 1.51 			      name));
283 mday          1.4     request->dest = _meta_dispatcher->getQueueId();
284 a.arora       1.43    AutoPtr<FindModuleInServiceResponse>
285                           response(static_cast<FindModuleInServiceResponse *>(SendWait(request.get())));
286                       if( response.get() != NULL)
287 mday          1.4        result = response->_module_service_queue;
288                    
289                       return result;
290                    }
291                    
292                    
293 david.dillard 1.51 AsyncReply *ModuleController::_send_wait(Uint32 destination_q,
294 mday          1.16 					 AsyncRequest *request)
295                    {
296                       request->dest = destination_q;
297                       AsyncReply *reply = Base::SendWait(request);
298                       return reply;
299                    }
300                    
301                    
302 mday          1.4  // sendwait to another service
303 kumpf         1.62 AsyncReply * ModuleController::ModuleSendWait(
304                        const RegisteredModuleHandle & handle,
305                        Uint32 destination_q,
306                        AsyncRequest *request)
307 mday          1.4  {
308 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
309 mike          1.63       throw(Permission(Threads::self()));
310 mday          1.4  
311 mday          1.16    return _send_wait(destination_q, request);
312 mday          1.4  }
313                    
314 david.dillard 1.51 AsyncReply *ModuleController::_send_wait(Uint32 destination_q,
315                    					 const String & destination_module,
316 mday          1.16 					 AsyncRequest *message)
317 mday          1.4  {
318 kumpf         1.58    AutoPtr<AsyncModuleOperationStart> request(new AsyncModuleOperationStart(
319 david.dillard 1.51 				    0,
320 mday          1.4  				    destination_q,
321                    				    getQueueId(),
322 david.dillard 1.51 				    true,
323 mday          1.4  				    destination_module,
324 a.arora       1.43 				    message));
325 david.dillard 1.51 
326 mday          1.4     request->dest = destination_q;
327 david.dillard 1.51    AutoPtr<AsyncModuleOperationResult>
328 a.arora       1.43       response(static_cast<AsyncModuleOperationResult *>(SendWait(request.get())));
329                    
330 mday          1.4     AsyncReply *ret = 0;
331 david.dillard 1.51 
332 a.arora       1.43    if (response.get() != NULL && response->getType() == async_messages::ASYNC_MODULE_OP_RESULT )
333 mday          1.4     {
334                          ret = static_cast<AsyncReply *>(response->get_result());
335                          //clear the request out of the envelope so it can be deleted by the module
336                       }
337 mday          1.26    request->get_action();
338 mday          1.4     return ret;
339                    }
340                    
341 mday          1.16 
342 david.dillard 1.51 // sendwait to another module controlled by another service.
343 mday          1.16 // throws Deadlock() if destination_q is this->queue_id
344 kumpf         1.62 AsyncReply * ModuleController::ModuleSendWait(
345                        const RegisteredModuleHandle & handle,
346                        Uint32 destination_q,
347                        const String & destination_module,
348                        AsyncRequest *message)
349 mday          1.16 {
350 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
351 mike          1.63       throw(Permission(Threads::self()));
352 david.dillard 1.51 
353 mday          1.16    return _send_wait(destination_q, destination_module, message);
354                    }
355                    
356 david.dillard 1.51 void ModuleController::_async_handleEnqueue(AsyncOpNode *op,
357                    					    MessageQueue *q,
358 mday          1.4  					    void *parm)
359                    {
360 david.dillard 1.51 
361 mday          1.4     ModuleController *myself = static_cast<ModuleController *>(q);
362 kumpf         1.61    Message *request = op->removeRequest();
363                       Message *response = op->removeResponse();
364 mday          1.16 
365 kumpf         1.64    if( request && (! (request->getMask() & MessageMask::ha_async)))
366 kumpf         1.36       throw TypeMismatchException();
367 mday          1.26 
368 kumpf         1.64    if( response && (! (response->getMask() & MessageMask::ha_async) ))
369 kumpf         1.36       throw TypeMismatchException();
370 david.dillard 1.51 
371 mday          1.17    op->release();
372 mday          1.6     myself->return_op(op);
373 david.dillard 1.51 
374                       // get rid of the module wrapper
375 mday          1.26    if( request && request->getType() == async_messages::ASYNC_MODULE_OP_START )
376 mday          1.6     {
377 mday          1.26       (static_cast<AsyncMessage *>(request))->op = NULL;
378 mday          1.6        AsyncModuleOperationStart *rq = static_cast<AsyncModuleOperationStart *>(request);
379                          request = rq->get_action();
380                          delete rq;
381                       }
382 david.dillard 1.51 
383                       // get rid of the module wrapper
384 mday          1.26    if(response && response->getType() == async_messages::ASYNC_MODULE_OP_RESULT )
385 mday          1.6     {
386 mday          1.26       (static_cast<AsyncMessage *>(response))->op = NULL;
387 mday          1.6        AsyncModuleOperationResult *rp = static_cast<AsyncModuleOperationResult *>(response);
388                          response = rp->get_result();
389                          delete rp;
390                       }
391 david.dillard 1.51 
392 mday          1.16    callback_handle *cb = reinterpret_cast<callback_handle *>(parm);
393 david.dillard 1.51 
394 kumpf         1.58    cb->_module->_send_async_callback(0, response, cb->_parm);
395 mday          1.16    delete cb;
396 david.dillard 1.51 
397 mday          1.4     return;
398                    }
399                    
400                    
401                    // send an async message to a service asynchronously
402 kumpf         1.62 Boolean ModuleController::ModuleSendAsync(
403                        const RegisteredModuleHandle & handle,
404                        Uint32 msg_handle,
405                        Uint32 destination_q,
406                        AsyncRequest *message,
407                        void *callback_parm)
408 mday          1.4  {
409 kumpf         1.30    //printf("verifying handle %p, controller at %p \n", &handle, this);
410 david.dillard 1.51 
411 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
412 mike          1.63       throw(Permission(Threads::self()));
413 mday          1.6  
414                       if (message->op == NULL)
415                       {
416                          message->op = get_op();
417 kumpf         1.61       message->op->setRequest(message);
418 mday          1.6     }
419                    
420 mday          1.24 
421 kumpf         1.62    callback_handle *cb = new callback_handle(
422                           const_cast<RegisteredModuleHandle *>(&handle),
423                           callback_parm);
424 david.dillard 1.51 
425 mday          1.6     message->resp = getQueueId();
426                       message->block = false;
427                       message->dest = destination_q;
428 david.dillard 1.51    return SendAsync(message->op,
429 mday          1.4  		    destination_q,
430                    		    _async_handleEnqueue,
431                    		    this,
432 mday          1.16 		    cb);
433 mday          1.4  }
434                    
435 david.dillard 1.51 // send a message to a module within another service asynchronously
436 kumpf         1.62 Boolean ModuleController::ModuleSendAsync(const RegisteredModuleHandle& handle,
437 david.dillard 1.51 					  Uint32 msg_handle,
438                    					  Uint32 destination_q,
439 mday          1.19 					  const String & destination_module,
440 david.dillard 1.51 					  AsyncRequest *message,
441                    					  void *callback_parm)
442 mday          1.4  {
443 david.dillard 1.51 
444 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
445 mike          1.63       throw(Permission(Threads::self()));
446 mday          1.19 
447 mday          1.4     AsyncOpNode *op = get_op();
448 david.dillard 1.51    AsyncModuleOperationStart *request =
449 kumpf         1.58       new AsyncModuleOperationStart(
450 mday          1.4  				    op,
451                    				    destination_q,
452                    				    getQueueId(),
453 david.dillard 1.51 				    true,
454 mday          1.4  				    destination_module,
455                    				    message);
456                       request->dest = destination_q;
457 kumpf         1.62    callback_handle *cb = new callback_handle(
458                           const_cast<RegisteredModuleHandle *>(&handle),
459                           callback_parm);
460 david.dillard 1.51    return SendAsync(op,
461 mday          1.4  		    destination_q,
462                    		    _async_handleEnqueue,
463                    		    this,
464 mday          1.26 		    cb);
465 mday          1.4  }
466                    
467 mday          1.19 
468                    Boolean ModuleController::_send_forget(Uint32 destination_q, AsyncRequest *message)
469                    {
470                       message->dest = destination_q;
471                       return SendForget(message);
472                    }
473                    
474 david.dillard 1.51 Boolean ModuleController::_send_forget(Uint32 destination_q,
475                    				       const String & destination_module,
476 mday          1.19 				       AsyncRequest *message)
477                    {
478                       AsyncOpNode *op = get_op();
479                       message->dest = destination_q;
480 david.dillard 1.51    AsyncModuleOperationStart *request =
481 kumpf         1.58       new AsyncModuleOperationStart(
482 mday          1.19 				    op,
483                    				    destination_q,
484                    				    getQueueId(),
485 david.dillard 1.51 				    true,
486 mday          1.19 				    destination_module,
487                    				    message);
488                       return SendForget(request);
489                    }
490                    
491                    
492                    
493 kumpf         1.62 Boolean ModuleController::ModuleSendForget(
494                        const RegisteredModuleHandle & handle,
495                        Uint32 destination_q,
496                        AsyncRequest *message)
497 mday          1.19 {
498 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
499 mike          1.63       throw(Permission(Threads::self()));
500 david.dillard 1.51 
501 mday          1.19    return _send_forget(destination_q, message);
502                    }
503 david.dillard 1.51 
504 kumpf         1.62 Boolean ModuleController::ModuleSendForget(
505                        const RegisteredModuleHandle & handle,
506                        Uint32 destination_q,
507                        const String & destination_module,
508                        AsyncRequest *message)
509 mday          1.19 {
510 kumpf         1.62    if (false == verify_handle(const_cast<RegisteredModuleHandle *>(&handle)))
511 mike          1.63       throw(Permission(Threads::self()));
512 david.dillard 1.51    return _send_forget(destination_q,
513                    		       destination_module,
514 mday          1.19 		       message);
515                    }
516                    
517                    
518 mday          1.6  void ModuleController::_handle_async_request(AsyncRequest *rq)
519                    {
520                    
521                       if( rq->getType() == async_messages::ASYNC_MODULE_OP_START)
522                       {
523                          // find the target module
524 kumpf         1.62       RegisteredModuleHandle *target;
525 mday          1.6        Message *module_result = NULL;
526 kumpf         1.49 
527 mday          1.6        {
528 mday          1.40 	 _module_lock lock(&_modules);
529 mike          1.55 	 target = _modules.front();
530 mday          1.40 	 while(target != NULL)
531 mday          1.6  	 {
532 mday          1.40 	    if(target->get_name() == static_cast<AsyncModuleOperationStart *>(rq)->_target_module)
533                    	    {
534                    	       break;
535                    	    }
536 david.dillard 1.51 
537 mike          1.55 	    target = _modules.next_of(target);
538 mday          1.6  	 }
539 kumpf         1.49       }
540                    
541                          if (target)
542                          {
543                              // ATTN: This statement was taken out of the _module_lock block
544                              // above because that caused all requests to control providers to
545                              // be serialized.  There is now a risk that the control provider
546                              // module may be deleted after the lookup and before this call.
547                              // See Bugzilla 3120.
548                              module_result = target->_receive_message(
549                                  static_cast<AsyncModuleOperationStart *>(rq)->_act);
550 mday          1.6        }
551 david.dillard 1.51 
552 mday          1.6        if(module_result == NULL)
553                          {
554 david.dillard 1.51 	 module_result = new AsyncReply(async_messages::REPLY,
555 kumpf         1.64 					MessageMask::ha_async | MessageMask::ha_reply,
556 mday          1.6  					rq->op,
557                    					async_results::CIM_NAK,
558                    					rq->resp,
559                    					false);
560                          }
561 david.dillard 1.51 
562                          AsyncModuleOperationResult *result =
563 kumpf         1.58 	 new AsyncModuleOperationResult(
564 mday          1.6  					rq->op,
565                    					async_results::OK,
566                    					static_cast<AsyncModuleOperationStart *>(rq)->resp,
567 david.dillard 1.51 					false,
568 mday          1.6  					static_cast<AsyncModuleOperationStart *>(rq)->_target_module,
569                    					module_result);
570                          _complete_op_node(rq->op, 0, 0, 0);
571                       }
572                       else
573                          Base::_handle_async_request(rq);
574                    }
575                    
576                    void ModuleController::_handle_async_callback(AsyncOpNode *op)
577                    {
578                       Base::_handle_async_callback(op);
579 david.dillard 1.51 
580 mday          1.6  }
581 mday          1.12 
582 kumpf         1.59 ModuleController* ModuleController::getModuleController()
583 mday          1.16 {
584 kumpf         1.59    MessageQueue *messageQueue =
585                          MessageQueue::lookup(PEGASUS_QUEUENAME_CONTROLSERVICE);
586                       PEGASUS_ASSERT(messageQueue != 0);
587                       PEGASUS_ASSERT(messageQueue->isAsync());
588                    
589                       MessageQueueService* service =
590                          dynamic_cast<MessageQueueService*>(messageQueue);
591                       PEGASUS_ASSERT(service != 0);
592                       PEGASUS_ASSERT(
593                          service->get_capabilities() & module_capabilities::module_controller);
594 david.dillard 1.51 
595 kumpf         1.59    return static_cast<ModuleController*>(service);
596 mday          1.16 }
597                    
598                    
599                    // send a message to another service
600 kumpf         1.59 AsyncReply *ModuleController::ClientSendWait(
601 david.dillard 1.51 					     Uint32 destination_q,
602                    					     AsyncRequest *request)
603 mday          1.16 {
604                       return _send_wait(destination_q, request);
605                    }
606                    
607                    
608                    // send a message to another module via another service
609 kumpf         1.59 AsyncReply *ModuleController::ClientSendWait(
610 mday          1.16 					     Uint32 destination_q,
611                    					     String & destination_module,
612 david.dillard 1.51 					     AsyncRequest *request)
613 mday          1.16 {
614                       return _send_wait(destination_q, destination_module, request);
615                    }
616                    
617                    
618                    // send an async message to another service
619 kumpf         1.59 Boolean ModuleController::ClientSendAsync(
620 david.dillard 1.51 					  Uint32 msg_handle,
621                    					  Uint32 destination_q,
622 mday          1.16 					  AsyncRequest *message,
623                    					  void (*async_callback)(Uint32, Message *, void *) ,
624                    					  void *callback_parm)
625                    {
626 kumpf         1.62    RegisteredModuleHandle *temp = new RegisteredModuleHandle(
627 kumpf         1.18 					     String(PEGASUS_MODULENAME_TEMP),
628 david.dillard 1.51 					     this,
629                    					     0,
630 kumpf         1.62 					     async_callback);
631 david.dillard 1.51    return ModuleSendAsync( *temp,
632                    			   msg_handle,
633                    			   destination_q,
634                    			   message,
635 mday          1.16 			   callback_parm);
636                    }
637                    
638                    
639                    // send an async message to another module via another service
640 kumpf         1.59 Boolean ModuleController::ClientSendAsync(
641 david.dillard 1.51 					  Uint32 msg_handle,
642                    					  Uint32 destination_q,
643 mday          1.27 					  const String & destination_module,
644 david.dillard 1.51 					  AsyncRequest *message,
645 mday          1.16 					  void (*async_callback)(Uint32, Message *, void *),
646                    					  void *callback_parm)
647                    {
648 kumpf         1.62    RegisteredModuleHandle *temp = new RegisteredModuleHandle(
649 kumpf         1.18 					     String(PEGASUS_MODULENAME_TEMP),
650 david.dillard 1.51 					     this,
651                    					     0,
652 kumpf         1.62 					     async_callback);
653 david.dillard 1.51    return ModuleSendAsync(*temp,
654                    			  msg_handle,
655                    			  destination_q,
656 mday          1.16 			  destination_module,
657                    			  message,
658                    			  callback_parm);
659                    }
660                    
661                    
662 mday          1.19 
663 kumpf         1.59 Boolean ModuleController::ClientSendForget(
664 david.dillard 1.51 					   Uint32 destination_q,
665 mday          1.19 					   AsyncRequest *message)
666                    {
667                       return _send_forget(destination_q, message);
668                    }
669                    
670                    
671 kumpf         1.59 Boolean ModuleController::ClientSendForget(
672 david.dillard 1.51 					   Uint32 destination_q,
673                    					   const String & destination_module,
674 mday          1.19 					   AsyncRequest *message)
675                    {
676                       return _send_forget(destination_q, destination_module, message);
677                    }
678                    
679 mday          1.1  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2