00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _NPT_MESSAGING_H_
00011 #define _NPT_MESSAGING_H_
00012
00013
00014
00015
00016 #include "NptConstants.h"
00017 #include "NptTypes.h"
00018 #include "NptResults.h"
00019 #include "NptList.h"
00020
00021
00022
00023
00024 class NPT_Message;
00025
00026
00027
00028
00029 class NPT_MessageHandler
00030 {
00031 public:
00032
00033 virtual ~NPT_MessageHandler() {}
00034
00035
00036 virtual void OnMessage(NPT_Message*) {}
00037
00038
00039
00040
00041 virtual NPT_Result HandleMessage(NPT_Message* message);
00042 };
00043
00044
00045
00046
00047 class NPT_Message
00048 {
00049 public:
00050
00051 typedef const char* Type;
00052
00053
00054 static Type MessageType;
00055
00056
00057 virtual ~NPT_Message() {}
00058 virtual Type GetType() { return MessageType; }
00059 virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
00060 return DefaultDeliver(handler);
00061 }
00062
00063
00064 virtual NPT_Result DefaultDeliver(NPT_MessageHandler* handler) {
00065 handler->OnMessage(this);
00066 return NPT_SUCCESS;
00067 }
00068 };
00069
00070
00071
00072
00073 class NPT_TerminateMessage : public NPT_Message
00074 {
00075 public:
00076
00077 NPT_Result Dispatch(NPT_MessageHandler* ) {
00078 return NPT_ERROR_TERMINATED;
00079 }
00080 };
00081
00082
00083
00084
00085 class NPT_MessageQueue
00086 {
00087 public:
00088
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
00097
00098 class NPT_MessageReceiver
00099 {
00100 public:
00101
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
00129 NPT_MessageQueue* m_Queue;
00130 NPT_MessageHandler* m_Handler;
00131 };
00132
00133
00134
00135
00136 class NPT_MessageBroadcaster
00137 {
00138 public:
00139
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
00148 NPT_Message* m_Message;
00149 };
00150
00151 #endif // _NPT_MESSAGING_H_