git-svn-id: svn://db.shs.com.ru/pip@4 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2015-02-28 18:35:47 +00:00
parent 8e451c891d
commit 13336674eb
154 changed files with 44021 additions and 0 deletions

116
src/io/pidatatransfer.h Normal file
View File

@@ -0,0 +1,116 @@
#ifndef PIDATATRANSFER_H
#define PIDATATRANSFER_H
#include "picrc.h"
#include "pitimer.h"
class PIBaseTransfer : public PIObject
{
PIOBJECT(PIBaseTransfer)
public:
PIBaseTransfer();
~PIBaseTransfer();
struct PacketHeader {
uint sig;
int type; // PacketType
uint session_id;
uint id;
uint crc;
bool check_sig() {return (sig == signature);}
};
struct Part {
Part(uint id_ = 0, ullong size_ = 0, ullong start_ = 0) : id(id_), size(size_), start(start_) {}
uint id;
ullong size;
ullong start;
};
virtual void stopSend();
virtual void stopReceive();
virtual bool isSending() const {return is_sending;}
virtual bool isReceiving() const {return is_receiving;}
void setPacketSize(int size) {packet_size = size;}
int packetSize() const {return packet_size;}
void setTimeout(double sec) {timeout_ = sec;}
double timeout() const {return timeout_;}
const PIString & stateString() const {return state_string;}
llong bytesAll() const {return bytes_all;}
llong bytesCur() const {return bytes_cur;}
const PIString * stateString_ptr() const {return &state_string;}
const llong * bytesAll_ptr() const {return &bytes_all;}
const llong * bytesCur_ptr() const {return &bytes_cur;}
EVENT(startReceive)
EVENT1(finishReceive, bool, ok)
EVENT(startSend)
EVENT1(finishSend, bool, ok)
EVENT1(sendRequest, PIByteArray &, data)
EVENT_HANDLER1(void, received, PIByteArray &, data);
protected:
uint packet_header_size, part_header_size;
bool break_, is_sending, is_receiving;
PIString state_string;
llong bytes_all, bytes_cur;
void buildSession(PIVector<Part> parts);
virtual PIByteArray buildPacket(int id) = 0;
virtual void receivePart(Part fi, PIByteArray ba, PIByteArray header) = 0;
private:
enum PacketType {pt_Unknown, pt_Data, pt_ReplySuccess, pt_ReplyInvalid, pt_Break, pt_Start};
struct StartRequest {
uint packets;
ullong size;
};
static const uint signature;
int packet_size;
double timeout_;
PIVector<PIVector<Part> > session;
PIVector<PacketType> replies;
PacketHeader header;
CRC_16 crc;
void processData(int id, PIByteArray &data);
PIByteArray build_packet(int id);
int checkSession();
bool send_process();
void sendBreak(int session_id);
void sendReply(PacketType reply);
bool getStartRequest();
bool finish_send(bool ok);
void finish_receive(bool ok);
};
inline PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::PacketHeader & v) {s << v.sig << v.type << v.session_id << v.id; return s;}
inline PIByteArray & operator >>(PIByteArray & s, PIBaseTransfer::PacketHeader & v) {s >> v.sig >> v.type >> v.session_id >> v.id; return s;}
inline PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::Part & v) {s << v.id << v.size << v.start; return s;}
inline PIByteArray & operator >>(PIByteArray & s, PIBaseTransfer::Part & v) {s >> v.id >> v.size >> v.start; return s;}
class PIDataTransfer : public PIBaseTransfer
{
PIOBJECT_SUBCLASS(PIDataTransfer, PIBaseTransfer)
public:
PIDataTransfer() {;}
~PIDataTransfer() {;}
virtual PIByteArray buildPacket(int id);
virtual void receivePart(Part fi, PIByteArray ba, PIByteArray header) {;}
private:
PIByteArray data;
};
#endif // PIDATATRANSFER_H