00001
00002
00003
00004
00005
00006
00007
00008 #ifndef WOSCTCPHANDLER_H_
00009 #define WOSCTCPHANDLER_H_
00010
00011 #include "WOscConfig.h"
00012
00013 #if OS_IS_LINUX == 1 || OS_IS_MACOSX == 1 || OS_IS_CYGWIN == 1
00014
00015 #include <netinet/in.h>
00016 #include <pthread.h>
00017
00018 #include "WOscNetReturn.h"
00019 #include "WOscReceiver.h"
00020 #include "WOscReceiverMethod.h"
00021
00022
00023
00024
00025
00026
00027 class TheNetReturnAddress: public WOscNetReturn
00028 {
00029 public:
00030 TheNetReturnAddress()
00031 {
00032 memset(&m_addr, 0, sizeof(m_addr));
00033 m_addr.sin_family = AF_INET;
00034 }
00035 TheNetReturnAddress(const struct sockaddr_in& addr)
00036 {
00037 m_addr = addr;
00038 m_addr.sin_family = AF_INET;
00039 }
00040 TheNetReturnAddress(const TheNetReturnAddress& rhs)
00041 {
00042 this->m_addr = rhs.m_addr;
00043 }
00044 TheNetReturnAddress& operator=(const TheNetReturnAddress& rhs)
00045 {
00046 this->m_addr = rhs.m_addr;
00047 return *this;
00048 }
00049 struct sockaddr_in m_addr;
00050 };
00051
00052 class WOscTcpHandler: public WOscReceiver
00053 {
00054 public:
00055 WOscTcpHandler(bool threading = true);
00056 virtual ~WOscTcpHandler();
00057
00058 typedef enum
00059 {
00060
00061 WOS_ERR_NO_ERROR = 0,
00062
00063
00064
00065 WOS_ERR_ALREADY_RUNNING,
00066
00067 WOS_ERR_ALREADY_CONNECTED,
00068
00069 WOS_ERR_SOCKET_CREATE,
00070
00071 WOS_ERR_SOCKET_CONNECT,
00072
00073 WOS_ERR_CREATE_RX_THREAD,
00074
00075 WOS_ERR_NO_SOCKET,
00076
00077 WOS_ERR_CONNECTION_LOST,
00078
00079 WOS_ERR_ALREADY_CLOSED,
00080
00081 WOS_ERR_DISCONNECTED = WOS_ERR_ALREADY_CLOSED,
00082
00083
00084 WOS_ERR_CONNECTION_CLOSED,
00085
00086 WOS_ERR_CONNECTION_FAILURE,
00087
00088
00089
00090 WOS_ERR_NOT_WHEN_THREADING,
00091
00092 WOS_ERR_CAN_NOT_SET_NONBLOCKING,
00093
00094 WOS_ERR_INVALID_SOCKET,
00095
00096 WOS_ERR_USER,
00097 } Error;
00098 static const char* GetErrStr(Error err);
00099 Error NetworkSend(const char* data, int dataLen);
00100 Error NetworkReceive();
00101 Error Start(int socketID, const TheNetReturnAddress& peer);
00102 Error Stop();
00103
00104 int GetSocketID() const { return m_socketID; }
00105 int GetRxThreadID() const { return m_receptionThreadID; }
00106 bool GetThreading() const { return m_threading; }
00107 const TheNetReturnAddress& GetPeer() const { return m_peer; }
00108 protected:
00109 virtual void NetworkSend(const char* data, int dataLen,
00110 const WOscNetReturn* networkReturnAddress);
00111
00112 friend void* wosc_tcp_handler_rx_thread(void* argument);
00113 virtual void ReceiveThread();
00114 Error NetworkReceiveInternal();
00115 private:
00116
00117
00118
00119
00120 bool m_threading;
00121 pthread_t m_receptionThreadID;
00122 int m_socketID;
00123 TheNetReturnAddress m_peer;
00124
00125
00126
00127
00128 pthread_mutex_t m_mutexTx;
00129
00130
00131 class SelectRxState
00132 {
00133 public:
00134 SelectRxState()
00135 {
00136 m_packetData = NULL;
00137 Init();
00138 }
00139 ~SelectRxState()
00140 {
00141 delete m_packetData;
00142 }
00143 void Init()
00144 {
00145 delete [] m_packetData;
00146 m_packetData = NULL;
00147 m_isRxPacketLen = true;
00148 m_nReceived = 0;
00149 }
00150
00151
00152 bool m_isRxPacketLen;
00153
00154 int m_nReceived;
00155
00156 int m_packetLen;
00157
00158 char* m_packetData;
00159 } m_selectState;
00160 };
00161
00162
00163
00164
00165 class WOscTcpHandlerMethod: public WOscReceiverMethod {
00166 public:
00167 WOscTcpHandlerMethod(WOscContainer* parent, WOscTcpHandler* receiverContext,
00168 const char* methodName, const char* methodDescription = "") :
00169 WOscReceiverMethod(parent,
00170 static_cast<WOscReceiver*> (receiverContext), methodName,
00171 methodDescription) {
00172 }
00173 virtual WOscTcpHandler* GetContext() {
00174 return static_cast<WOscTcpHandler*> (WOscReceiverMethod::GetContext());
00175 }
00176 protected:
00177 virtual void Method(const WOscMessage *message) {
00178 }
00179 private:
00180 virtual void Method(const WOscMessage *message, const WOscTimeTag& when,
00181 const WOscNetReturn* networkReturnAddress) {
00182 Method(message);
00183 }
00184 };
00185
00186 #else
00187 # warning "WOscTcpHandler not supported on this platform"
00188 #endif
00189
00190 #endif