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
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef VRS_QT_TWOPOINTCONNECTION_H
00052 #define VRS_QT_TWOPOINTCONNECTION_H
00053
00054 #include <vrs/qt3/config.h>
00055 #include <vrs/sharedobj.h>
00056 #include <vrs/vector.h>
00057 #include <deque>
00058 #include <vector>
00059
00060 namespace VRS {
00061
00062 template<typename T> class NonPersistentArray;
00063
00064
00077 class VRS_QT3_API TwoPointConnection : public SharedObj {
00078 public:
00079
00080 TwoPointConnection();
00082
00083 void start(int port);
00085
00086
00087 void start(std::string host, int port);
00089
00090 void stop();
00092
00093 virtual ~TwoPointConnection();
00094
00095 int bytesReceived() const;
00097
00098
00099 bool connected() const;
00101
00102 void flush();
00104
00105 void setFlushThreshold(unsigned int size = 0);
00107 unsigned int getFlushThreshold() const;
00109
00110 TwoPointConnection& operator<<(VRS::UINT8);
00111 TwoPointConnection& operator<<(VRS::UINT16);
00112 TwoPointConnection& operator<<(VRS::UINT32);
00113 TwoPointConnection& operator<<(VRS::UINT64);
00114 TwoPointConnection& operator<<(float);
00115 TwoPointConnection& operator<<(double);
00116 TwoPointConnection& operator<<(bool);
00117 TwoPointConnection& operator<<(Vector);
00118 TwoPointConnection& operator<<(SO<SharedObj>);
00119
00120 TwoPointConnection& operator>>(VRS::UINT8&);
00121 TwoPointConnection& operator>>(VRS::UINT16&);
00122 TwoPointConnection& operator>>(VRS::UINT32&);
00123 TwoPointConnection& operator>>(VRS::UINT64&);
00124 TwoPointConnection& operator>>(float&);
00125 TwoPointConnection& operator>>(double&);
00126 TwoPointConnection& operator>>(bool&);
00127 TwoPointConnection& operator>>(Vector&);
00128 TwoPointConnection& operator>>(SO<SharedObj>&);
00129
00130 void restore(VRS::UINT8);
00131 void restore(VRS::UINT16);
00132 void restore(VRS::UINT32);
00133 void restore(VRS::UINT64);
00134 void restore(float);
00135 void restore(double);
00136 void restore(bool);
00137 void restore(std::string);
00138 void restore(Vector);
00139 void restore(SO<SharedObj>);
00147 void sendString(const std::string& s);
00149 bool receiveString(std::string& s);
00153 void registerReceiveCB(Callback1<SharedObj*>* cb);
00157 void unregisterReceiveCB(Callback1<SharedObj*>* cb);
00160 void registerDisconnectCB(Callback1<SharedObj*>* cb);
00163 void unregisterDisconnectCB(Callback1<SharedObj*>* cb);
00166 void registerConnectCB(Callback1<SharedObj*>* cb);
00171 void unregisterConnectCB(Callback1<SharedObj*>* cb);
00174 void registerErrorCB(Callback1<SharedObj*>* cb);
00177 void unregisterErrorCB(Callback1<SharedObj*>* cb);
00180 enum NetworkError { ERR_NO_ERROR, ERR_CONNECTION_REFUSED, ERR_HOST_NOT_FOUND, ERR_SOCKET_READ };
00181 VRS_SERIALIZABLE_CLASS_ENUM(NetworkError);
00182
00183
00184
00185 NetworkError getLastError() const;
00186
00187 class ImplServer;
00188 class ImplClient;
00189
00190 VRS_TYPEINFO(TwoPointConnection, SharedObj);
00191
00192 private:
00193
00194 friend class ImplClient;
00195 void onReceive();
00196 void onDisconnect();
00197 void onConnect();
00198 void onError(NetworkError error);
00199
00200 ImplServer* server_;
00201 ImplClient* client_;
00202 unsigned int autoFlushAt_;
00203
00204 std::deque<VRS::UINT8> inBuffer_;
00205 std::vector<VRS::UINT8> outBuffer_;
00206
00207 enum CB_ID { CB_RECEIVE, CB_DISCONNECT, CB_CONNECT, CB_ERROR };
00208 VRS_SERIALIZABLE_CLASS_ENUM(CB_ID);
00209 void registerCallback(Callback1<SharedObj*>* cb, CB_ID id);
00210 void unregisterCallback(Callback1<SharedObj*>* cb, CB_ID id);
00211 void activateCallbacks(CB_ID id);
00212 SO<NonPersistentArray<std::pair<SO<Callback1<SharedObj*> >, CB_ID> > > callbacks_;
00213 NetworkError lastError_;
00214 };
00215
00216 }
00217
00218 #endif // VRS_QT_TWOPOINTCONNECTION_H