socket.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __BARRY_SOCKET_H__
00023 #define __BARRY_SOCKET_H__
00024
00025 #include "dll.h"
00026 #include <stdint.h>
00027 #include <queue>
00028 #include <memory>
00029 #include "router.h"
00030
00031
00032 namespace Usb { class Device; }
00033 namespace Barry {
00034 class Data;
00035 class Packet;
00036 class JLPacket;
00037 class JVMPacket;
00038 class SocketRoutingQueue;
00039 }
00040
00041 namespace Barry {
00042
00043 class Socket;
00044 typedef std::auto_ptr<Socket> SocketHandle;
00045
00046 class BXEXPORT SocketZero
00047 {
00048 friend class Socket;
00049
00050 Usb::Device *m_dev;
00051 SocketRoutingQueue *m_queue;
00052 int m_writeEp, m_readEp;
00053 uint8_t m_zeroSocketSequence;
00054
00055 uint32_t m_sequenceId;
00056
00057
00058 bool m_halfOpen;
00059 uint32_t m_challengeSeed;
00060 unsigned int m_remainingTries;
00061
00062 bool m_hideSequencePacket;
00063
00064 bool m_resetOnClose;
00065
00066 private:
00067 static void AppendFragment(Data &whole, const Data &fragment);
00068 static unsigned int MakeNextFragment(const Data &whole, Data &fragment,
00069 unsigned int offset = 0);
00070 void CheckSequence(uint16_t socket, const Data &seq);
00071
00072 void SendOpen(uint16_t socket, Data &receive);
00073 void SendPasswordHash(uint16_t socket, const char *password, Data &receive);
00074
00075
00076
00077 void RawSend(Data &send, int timeout = -1);
00078 void RawReceive(Data &receive, int timeout = -1);
00079
00080 protected:
00081 bool SequencePacket(const Data &data);
00082 bool IsSequencePacketHidden() { return m_hideSequencePacket; }
00083
00084 public:
00085 void SetResetOnClose(bool flag) { m_resetOnClose = flag; }
00086 void HideSequencePacket(bool flag) { m_hideSequencePacket = flag; }
00087 explicit SocketZero(SocketRoutingQueue &queue, int writeEndpoint,
00088 uint8_t zeroSocketSequenceStart = 0);
00089 SocketZero(Usb::Device &dev, int writeEndpoint, int readEndpoint,
00090 uint8_t zeroSocketSequenceStart = 0);
00091 ~SocketZero();
00092
00093 uint8_t GetZeroSocketSequence() const { return m_zeroSocketSequence; }
00094
00095 void SetRoutingQueue(SocketRoutingQueue &queue);
00096 void UnlinkRoutingQueue();
00097
00098
00099
00100
00101
00102
00103 void Send(Data &send, int timeout = -1);
00104 void Send(Data &send, Data &receive, int timeout = -1);
00105 void Send(Barry::Packet &packet, int timeout = -1);
00106 void Receive(Data &receive, int timeout = -1);
00107
00108
00109 SocketHandle Open(uint16_t socket, const char *password = 0);
00110 void Close(Socket &socket);
00111
00112
00113 void ClearHalt();
00114 };
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 class BXEXPORT Socket
00132 {
00133 friend class SocketZero;
00134
00135 SocketZero *m_zero;
00136 uint16_t m_socket;
00137 uint8_t m_closeFlag;
00138
00139 bool m_registered;
00140
00141 protected:
00142 void CheckSequence(const Data &seq);
00143 void ForceClosed();
00144
00145 Socket(SocketZero &zero, uint16_t socket, uint8_t closeFlag);
00146
00147 public:
00148 ~Socket();
00149
00150 uint16_t GetSocket() const { return m_socket; }
00151 uint8_t GetCloseFlag() const { return m_closeFlag; }
00152
00153 void Close();
00154
00155
00156
00157
00158
00159
00160 void Send(Data &send, int timeout = -1);
00161 void Send(Data &send, Data &receive, int timeout = -1);
00162 void Send(Barry::Packet &packet, int timeout = -1);
00163 void Receive(Data &receive, int timeout = -1);
00164 void ReceiveData(Data &receive, int timeout = -1);
00165
00166
00167 void ClearHalt();
00168
00169
00170
00171
00172
00173 void Packet(Data &send, Data &receive, int timeout = -1);
00174 void Packet(Barry::Packet &packet, int timeout = -1);
00175 void Packet(Barry::JLPacket &packet, int timeout = -1);
00176 void Packet(Barry::JVMPacket &packet, int timeout = -1);
00177
00178
00179 void InitSequence(int timeout = -1);
00180 void PacketJVM(Data &send, Data &receive, int timeout = -1);
00181
00182
00183
00184 void PacketData(Data &send, Data &receive, int timeout = -1);
00185
00186
00187 void NextRecord(Data &receive);
00188
00189
00190
00191
00192 void RegisterInterest(SocketRoutingQueue::SocketDataHandler handler, void *context);
00193 void UnregisterInterest();
00194
00195
00196
00197
00198 void HideSequencePacket(bool flag) { m_zero->HideSequencePacket(flag); }
00199 };
00200
00201
00202 }
00203
00204 #endif
00205