BUG#: 7626
[tpot/pegasus/.git] / src / Pegasus / HandlerService / IndicationHandlerService.h
index 8c19aba3ff999921806c2c6a0a8733041c927f20..006c645d72b88bb4f86f777a28e0c498d4c23971 100644 (file)
@@ -1,32 +1,31 @@
-//%2003////////////////////////////////////////////////////////////////////////
+//%LICENSE////////////////////////////////////////////////////////////////
 //
-// Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development
-// Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
-// IBM Corp.; EMC Corporation, The Open Group.
+// Licensed to The Open Group (TOG) under one or more contributor license
+// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
+// this work for additional information regarding copyright ownership.
+// Each contributor licenses this file to you under the OpenPegasus Open
+// Source License; you may not use this file except in compliance with the
+// License.
 //
-// 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.
+// 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.
 //
-// Author: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
+// 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.
 //
-// Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
-//                (carolann_graves@hp.com)
+//////////////////////////////////////////////////////////////////////////
 //
 //%/////////////////////////////////////////////////////////////////////////////
 
 #ifndef Pegasus_IndicationHandlerService_h
 #define Pegasus_IndicationHandlerService_h
 
-#include <Pegasus/Common/Config.h>
 #include <sys/types.h>
-//#if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
-//#else
-//#include <unistd.h>
-//#endif 
 #include <iostream>
 #include <stdio.h>
 #include <string.h>
 
 #include <Pegasus/Common/Config.h>
-#include <Pegasus/Common/InternalException.h>
-#include <Pegasus/Common/DQueue.h>
-#include <Pegasus/Common/Thread.h>
-#include <Pegasus/Common/ArrayInternal.h>
 #include <Pegasus/Common/AsyncOpNode.h>
-#include <Pegasus/Common/CimomMessage.h>
-#include <Pegasus/Common/Cimom.h>
 #include <Pegasus/Common/MessageQueueService.h>
 #include <Pegasus/Common/CIMMessage.h>
-#include <Pegasus/Common/XmlWriter.h>
 #include <Pegasus/Handler/CIMHandler.h>
 #include <Pegasus/Repository/CIMRepository.h>
 
-#include "HandlerTable.h"
-
+#include <Pegasus/HandlerService/HandlerTable.h>
 #include <Pegasus/HandlerService/Linkage.h>
 
+#ifdef PEGASUS_ENABLE_DMTF_INDICATION_PROFILE_SUPPORT
+#include <Pegasus/HandlerService/DestinationQueue.h>
+#endif
+
 PEGASUS_NAMESPACE_BEGIN
 
-class PEGASUS_HANDLER_SERVICE_LINKAGE IndicationHandlerService 
-   : public MessageQueueService
+class PEGASUS_HANDLER_SERVICE_LINKAGE IndicationHandlerService :
+    public MessageQueueService
 {
-   public:
-    
-      typedef MessageQueueService Base;
-    
-      IndicationHandlerService(CIMRepository* repository);
-
-      IndicationHandlerService(void);
-
-      ~IndicationHandlerService(void) { } ;
-      
-      virtual void _handle_async_request(AsyncRequest *req);
-
-      virtual void handleEnqueue(Message *);
-
-      virtual void handleEnqueue(void);
-
-      static void _handleIndicationCallBack(AsyncOpNode *, 
-                                           MessageQueue *, 
-                                           void *);
-      
-      AtomicInt dienow;
-
-   protected:
-
-      void _handleIndication(const Message* message);
-
-      HandlerTable _handlerTable;
-
-      CIMHandler* _lookupHandlerForClass(const CIMName& className);
-
-      String _parseDestination(String dest);
-
-   private:
-      CIMRepository* _repository;
+public:
+
+    typedef MessageQueueService Base;
+
+    IndicationHandlerService(CIMRepository* repository);
+
+    ~IndicationHandlerService();
+
+    virtual void _handle_async_request(AsyncRequest* req);
+
+    virtual void handleEnqueue(Message*);
+
+    virtual void handleEnqueue();
+
+    AtomicInt dienow;
+
+private:
+    IndicationHandlerService();  //  unimplemented
+
+    CIMRepository* _repository;
+
+    CIMHandleIndicationResponseMessage* _handleIndication(
+        CIMHandleIndicationRequestMessage* request);
+
+    HandlerTable _handlerTable;
+
+    CIMHandler* _lookupHandlerForClass(const CIMName& className);
+
+    Boolean _loadHandler(
+        CIMHandleIndicationRequestMessage* request,
+        CIMException& cimException);
+
+    Boolean _loadHandler(
+        const OperationContext& context,
+        const String nameSpace,
+        CIMInstance& indicationInstance,
+        CIMInstance& indicationHandlerInstance,
+        CIMInstance& indicationSubscriptionInstance,
+        CIMException& cimException);
+
+#ifdef PEGASUS_ENABLE_DMTF_INDICATION_PROFILE_SUPPORT
+
+    /**
+        This method is called when HandlerService receives the
+        CIMNotifySubscriptionNotActiveRequestMessage. Indications matching the
+        subscription will be discarded from the queue and traced.
+    */
+    CIMNotifySubscriptionNotActiveResponseMessage*
+        _handleSubscriptionNotActiveRequest(
+            CIMNotifySubscriptionNotActiveRequestMessage *message);
+
+    /**
+        This method is called when HandlerService receives the
+        CIMNotifySubscriptionNotActiveRequestMessage. Queue will be deleted.
+    */
+    CIMNotifyListenerNotActiveResponseMessage* _handleListenerNotActiveRequest(
+        CIMNotifyListenerNotActiveRequestMessage *message);
+
+    /**
+        This method is called to stop dispatcher thread when HandlerService
+        receives the CimServiceStop request.
+    */
+    void _stopDispatcher();
+
+    /**
+        Tries to deliver the indication, returns true if delivery is successful
+        else false.
+    */
+    void _deliverIndication(IndicationInfo *info);
+
+    /**
+        This method is called when indication in the form of
+        CIMHandleIndicationRequestMessage arrives to HandlerService  from
+        IndicationService. This method sets the sequence-identfier to the
+        indication. Returns DestinationQueue name to which the indication
+        belongs.
+   */
+    String _setSequenceIdentifier(
+        CIMHandleIndicationRequestMessage *message);
+
+    /**
+        This method is called from _setSequenceIdentifier(). This method
+        actually sets the sequence-identfier properties SequenceContext
+        and SequenceNumber to the indication.
+   */
+    void _setSequenceIndentifierProperties(
+        CIMInstance &indication, DestinationQueue *queue);
+
+    /**
+        This method is called when indication delivery has failed.
+        This method enqueues the indication on to the DestinationQueue.
+   */
+    void _destinationQueueEnqueue(
+        CIMHandleIndicationRequestMessage *message);
+
+    CIMResponseMessage*
+        _handleEnumerateInstancesRequest(
+            CIMEnumerateInstancesRequestMessage *message);
+
+    CIMResponseMessage*
+        _handleEnumerateInstanceNamesRequest(
+            CIMEnumerateInstanceNamesRequestMessage *message);
+
+    /**
+        Gets the Queue name from either subscriptionName or handlerName,
+        constructed as follows.
+        namespace:ClassName.Name=\"HandlerName\".
+    */
+    String _getQueueName(
+        const CIMObjectPath &instancePath);
+
+    void _updateSuccessfulDeliveryTime(const String &queueName);
+
+    typedef HashTable<
+                String,
+                DestinationQueue*,
+                EqualFunc<String>,
+                HashFunc<String> > DestinationQueueTable;
+
+    DestinationQueueTable _destinationQueueTable;
+    ReadWriteSem _destinationQueueTableLock;
+
+    AtomicInt _deliveryThreadsRunningCount;
+    AtomicInt _dispatcherThreadRunning;
+    Mutex _dispatcherThreadMutex;
+    List<IndicationInfo, Mutex> _deliveryQueue;
+    ThreadPool _deliveryThreadPool;
+    Thread _dispatcherThread;
+    AtomicInt _stopDispatcherThread;
+    const Uint32 _maxDeliveryThreads;
+    static ThreadReturnType PEGASUS_THREAD_CDECL
+        _dispatcherRoutine(void *param);
+    static ThreadReturnType PEGASUS_THREAD_CDECL _deliveryRoutine(void *param);
+#endif
 };
 
 PEGASUS_NAMESPACE_END