00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef __MESSAGE_H
00044 #define __MESSAGE_H
00045
00046 #include <sys/types.h>
00047
00048 #include <loki/SmartPtr.h>
00049
00056 class Message
00057 {
00058 public:
00060 typedef enum {
00061 M_Data = 0,
00062 M_Command = 1,
00063 M_Request = 2,
00064 M_Response = 3,
00065 } MsgType;
00066
00068 typedef enum {
00069 C_None = 0, C_Exit, C_Disconnected,
00070 } CmdCode;
00071
00073 typedef enum {
00074 R_None = 0, R_Status, R_History,
00075 } ReqVal;
00076
00077 Message(CmdCode);
00078 Message(MsgType, ReqVal, u_char*, size_t);
00079 virtual ~Message();
00080
00081 const MsgType type(void) const { return(msg_type); }
00082 const CmdCode code(void) const { return(cmd_code); }
00083 const char * name(void) const;
00084
00085 void Lock(void);
00086 void Unlock(void);
00087
00088 protected:
00090 Message(const u_char *, size_t);
00091
00092 private:
00093 MsgType msg_type;
00094 CmdCode cmd_code;
00095 ReqVal req_class;
00096
00097 protected:
00099 void alloc_data(const size_t size);
00100
00101 unsigned char * privdata;
00102 size_t length;
00103
00104 private:
00107 pthread_mutex_t mutex;
00108
00109 static const char * const MT_names[];
00110
00111
00112 Message(const Message&);
00113 Message & operator=(const Message&);
00114 };
00115
00117 typedef Loki::SmartPtr<Message,
00118 Loki::RefCountedMTAdj<Loki::ObjectLevelLockable>::RefCountedMT,
00119 Loki::DisallowConversion,
00120 Loki::AssertCheck,
00121 Loki::LockedStorage>
00122 MessageP;
00123
00132 class Data : public Message
00133 {
00134 public:
00135 Data(u_char *d, size_t l) : Message(d,l) {}
00136
00137
00138
00139 Data(const Data &d);
00140
00141
00142 Data(const std::string &s) : Message(reinterpret_cast<const u_char*>(s.c_str()),s.length()) {}
00143
00144 virtual ~Data() {}
00145
00148 const u_char * data(void) const;
00150 size_t len(void) const;
00151 };
00152
00156 std::ostream & operator <<(std::ostream &out, const Data &blob);
00157
00158 #endif