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 explicit SocketZero(SocketRoutingQueue &queue, int writeEndpoint,
00086 uint8_t zeroSocketSequenceStart = 0);
00087 SocketZero(Usb::Device &dev, int writeEndpoint, int readEndpoint,
00088 uint8_t zeroSocketSequenceStart = 0);
00089 ~SocketZero();
00090
00091 uint8_t GetZeroSocketSequence() const { return m_zeroSocketSequence; }
00092
00093 void SetRoutingQueue(SocketRoutingQueue &queue);
00094 void UnlinkRoutingQueue();
00095
00096 void SetResetOnClose(bool flag) { m_resetOnClose = flag; }
00097 void HideSequencePacket(bool flag) { m_hideSequencePacket = flag; }
00098
00099
00100
00101
00102
00103
00104 void Send(Data &send, int timeout = -1);
00105 void Send(Data &send, Data &receive, int timeout = -1);
00106 void Send(Barry::Packet &packet, int timeout = -1);
00107 void Receive(Data &receive, int timeout = -1);
00108
00109
00110 SocketHandle Open(uint16_t socket, const char *password = 0);
00111 void Close(Socket &socket);
00112
00113
00114 void ClearHalt();
00115 };
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 class BXEXPORT Socket
00133 {
00134 friend class SocketZero;
00135
00136 SocketZero *m_zero;
00137 uint16_t m_socket;
00138 uint8_t m_closeFlag;
00139
00140 bool m_registered;
00141
00142 protected:
00143 void CheckSequence(const Data &seq);
00144 void ForceClosed();
00145
00146 Socket(SocketZero &zero, uint16_t socket, uint8_t closeFlag);
00147
00148 public:
00149 ~Socket();
00150
00151 uint16_t GetSocket() const { return m_socket; }
00152 uint8_t GetCloseFlag() const { return m_closeFlag; }
00153
00154 void Close();
00155
00156
00157
00158
00159
00160
00161 void Send(Data &send, int timeout = -1);
00162 void Send(Data &send, Data &receive, int timeout = -1);
00163 void Send(Barry::Packet &packet, int timeout = -1);
00164 void Receive(Data &receive, int timeout = -1);
00165 void ReceiveData(Data &receive, int timeout = -1);
00166
00167
00168 void ClearHalt();
00169
00170
00171
00172
00173
00174 void Packet(Data &send, Data &receive, int timeout = -1);
00175 void Packet(Barry::Packet &packet, int timeout = -1);
00176 void Packet(Barry::JLPacket &packet, int timeout = -1);
00177 void Packet(Barry::JVMPacket &packet, int timeout = -1);
00178
00179
00180 void InitSequence(int timeout = -1);
00181 void PacketJVM(Data &send, Data &receive, int timeout = -1);
00182
00183
00184
00185 void PacketData(Data &send, Data &receive, int timeout = -1);
00186
00187
00188 void NextRecord(Data &receive);
00189
00190
00191
00192
00193 void RegisterInterest(std::tr1::shared_ptr<SocketRoutingQueue::SocketDataHandler> handler);
00194 void UnregisterInterest();
00195
00196
00197
00198
00199 void HideSequencePacket(bool flag) { m_zero->HideSequencePacket(flag); }
00200 };
00201
00202
00203 }
00204
00205 #endif
00206