NptMessaging.h

00001 /*****************************************************************
00002 |
00003 |   Neptune - Messaging System
00004 |
00005 |   (c) 2001-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00009 
00010 #ifndef _NPT_MESSAGING_H_
00011 #define _NPT_MESSAGING_H_
00012 
00013 /*----------------------------------------------------------------------
00014 |   includes
00015 +---------------------------------------------------------------------*/
00016 #include "NptConstants.h"
00017 #include "NptTypes.h"
00018 #include "NptResults.h"
00019 #include "NptList.h"
00020 
00021 /*----------------------------------------------------------------------
00022 |   forward references
00023 +---------------------------------------------------------------------*/
00024 class NPT_Message;
00025 
00026 /*----------------------------------------------------------------------
00027 |   NPT_MessageHandler
00028 +---------------------------------------------------------------------*/
00029 class NPT_MessageHandler
00030 {
00031  public:
00032     // methods
00033     virtual ~NPT_MessageHandler() {}
00034 
00035     // default message handler
00036     virtual void OnMessage(NPT_Message*) {}
00037 
00038     // this method is a central point of handling for received messages.
00039     // it can be overloaded by subclasses who wish to process all 
00040     // incoming messages
00041     virtual NPT_Result HandleMessage(NPT_Message* message);
00042 };
00043 
00044 /*----------------------------------------------------------------------
00045 |   NPT_Messsage
00046 +---------------------------------------------------------------------*/
00047 class NPT_Message
00048 {
00049  public:
00050     // types
00051     typedef const char* Type;
00052 
00053     // static members
00054     static Type MessageType;
00055 
00056     // methods
00057     virtual           ~NPT_Message() {}
00058     virtual Type       GetType() { return MessageType; }
00059     virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
00060         return DefaultDeliver(handler);
00061     }
00062     // this method should really be called 'Deliver', but this would
00063     // cause a problem when subclasses overload it 
00064     virtual NPT_Result DefaultDeliver(NPT_MessageHandler* handler) {
00065         handler->OnMessage(this);
00066         return NPT_SUCCESS;
00067     }
00068 };
00069 
00070 /*----------------------------------------------------------------------
00071 |   NPT_TerminateMesssage
00072 +---------------------------------------------------------------------*/
00073 class NPT_TerminateMessage : public NPT_Message
00074 {
00075  public:
00076     // methods
00077     NPT_Result Dispatch(NPT_MessageHandler* /*handler*/) {
00078         return NPT_ERROR_TERMINATED;
00079     }
00080 };
00081 
00082 /*----------------------------------------------------------------------
00083 |   NPT_MessageQueue
00084 +---------------------------------------------------------------------*/
00085 class NPT_MessageQueue
00086 {
00087  public:
00088     // methods
00089     virtual           ~NPT_MessageQueue() {}
00090     virtual NPT_Result PumpMessage(bool blocking = true) = 0;
00091     virtual NPT_Result QueueMessage(NPT_Message*        message, 
00092                                     NPT_MessageHandler* handler) = 0;
00093 };
00094 
00095 /*----------------------------------------------------------------------
00096 |   NPT_MessageReceiver
00097 +---------------------------------------------------------------------*/
00098 class NPT_MessageReceiver
00099 {
00100 public:
00101     // methods
00102     NPT_MessageReceiver() : m_Queue(NULL), m_Handler(NULL) {}
00103     NPT_MessageReceiver(NPT_MessageHandler* handler) : 
00104         m_Queue(NULL), m_Handler(handler) {}
00105     NPT_MessageReceiver(NPT_MessageQueue* queue) : 
00106         m_Queue(queue), m_Handler(NULL) {}
00107     NPT_MessageReceiver(NPT_MessageHandler* handler, 
00108                         NPT_MessageQueue*   queue) : 
00109         m_Queue(queue), m_Handler(handler) {}
00110     virtual ~NPT_MessageReceiver() {}
00111     NPT_Result SetQueue(NPT_MessageQueue* queue) {
00112         m_Queue = queue;
00113         return NPT_SUCCESS;
00114     }
00115     NPT_Result SetHandler(NPT_MessageHandler* handler) {
00116         m_Handler = handler;
00117         return NPT_SUCCESS;
00118     }
00119     virtual NPT_Result PostMessage(NPT_Message* message) {
00120         if (m_Queue) {
00121             return m_Queue->QueueMessage(message, m_Handler);
00122         } else {
00123             return NPT_FAILURE;
00124         }
00125     }
00126 
00127 protected:
00128     // members
00129     NPT_MessageQueue*   m_Queue;
00130     NPT_MessageHandler* m_Handler;
00131 };
00132 
00133 /*----------------------------------------------------------------------
00134 |   NPT_MessageBroadcaster
00135 +---------------------------------------------------------------------*/
00136 class NPT_MessageBroadcaster
00137 {
00138 public:
00139     // methods
00140     NPT_MessageBroadcaster(NPT_Message* message) : m_Message(message) {}
00141     NPT_Result operator()(NPT_MessageReceiver*& receiver) const {
00142         receiver->PostMessage(m_Message);
00143         return NPT_SUCCESS;
00144     }
00145 
00146 private:
00147     // members
00148     NPT_Message* m_Message;
00149 };
00150 
00151 #endif // _NPT_MESSAGING_H_