change log updated
[public/netxms.git] / include / nxmbapi.h
index 0f40d44..29aa99b 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** NetXMS Message Bus API
-** Copyright (C) 2009 Victor Kirhenshtein
+** Copyright (C) 2009-2015 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 #include <nms_threads.h>
 #include <nxqueue.h>
 
-
-//
-// Message class
-//
-
+/**
+ * Message class
+ */
 class LIBNXMB_EXPORTABLE NXMBMessage
 {
 protected:
@@ -55,15 +53,13 @@ public:
        NXMBMessage(const TCHAR *type, const TCHAR *senderId);
        virtual ~NXMBMessage();
 
-       const TCHAR *getType() { return m_type; }
-       const TCHAR *getSenderId() { return m_senderId; }
+       const TCHAR *getType() const { return m_type; }
+       const TCHAR *getSenderId() const { return m_senderId; }
 };
 
-
-//
-// Subscriber class
-//
-
+/**
+ * Subscriber class
+ */
 class LIBNXMB_EXPORTABLE NXMBSubscriber
 {
 protected:
@@ -79,11 +75,9 @@ public:
        virtual bool isOwnedByDispatcher();
 };
 
-
-//
-// Abstract message filter class
-//
-
+/**
+ * Abstract message filter class
+ */
 class LIBNXMB_EXPORTABLE NXMBFilter
 {
 public:
@@ -94,11 +88,9 @@ public:
        virtual bool isOwnedByDispatcher();
 };
 
-
-//
-// Message filter which accept messages of specific type(s)
-//
-
+/**
+ * Message filter which accept messages of specific type(s)
+ */
 class LIBNXMB_EXPORTABLE NXMBTypeFilter : public NXMBFilter
 {
 protected:
@@ -114,39 +106,56 @@ public:
        void removeMessageType(const TCHAR *type);
 };
 
+/**
+ * Call handler
+ */
+typedef bool (* NXMBCallHandler)(const TCHAR *, const void *, void *);
 
-//
-// Message dispatcher class
-//
+/**
+ * String map template for holding objects as values
+ */
+class CallHandlerMap : public StringMapBase
+{
+public:
+       CallHandlerMap() : StringMapBase(false) { }
+
+       void set(const TCHAR *name, NXMBCallHandler handler) { setObject((TCHAR *)name, (void *)handler, false); }
+       NXMBCallHandler get(const TCHAR *name) { return (NXMBCallHandler)getObject(name); }
+};
 
+/**
+ * Message dispatcher class
+ */
 class LIBNXMB_EXPORTABLE NXMBDispatcher
 {
-       friend THREAD_RESULT THREAD_CALL WorkerThreadStarter(void *);
-
 private:
-       static NXMBDispatcher *m_instance;
-
-protected:
        Queue *m_queue;
        int m_numSubscribers;
        NXMBSubscriber **m_subscribers;
        NXMBFilter **m_filters;
        MUTEX m_subscriberListAccess;
        THREAD m_workerThreadHandle;
+   CallHandlerMap *m_callHandlers;
+   MUTEX m_callHandlerAccess;
+   CONDITION m_stopCondition;
 
        void workerThread();
+       static THREAD_RESULT THREAD_CALL workerThreadStarter(void *);
 
 public:
        NXMBDispatcher();
-       virtual ~NXMBDispatcher();
+       ~NXMBDispatcher();
 
        void postMessage(NXMBMessage *msg);
+   bool call(const TCHAR *callName, const void *input, void *output);
        
        void addSubscriber(NXMBSubscriber *subscriber, NXMBFilter *filter);
        void removeSubscriber(const TCHAR *id);
 
-       static NXMBDispatcher *getInstance();
-};
+   void addCallHandler(const TCHAR *callName, NXMBCallHandler handler);
+   void removeCallHandler(const TCHAR *callName);
 
+   static NXMBDispatcher *getInstance();
+};
 
 #endif   /* _nxmbapi_h_ */