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

This commit is contained in:
2017-04-20 07:19:11 +00:00
parent e4ccbed1e4
commit fbcda1ce70
5 changed files with 33 additions and 21 deletions

View File

@@ -5,6 +5,7 @@ const uint PIBaseTransfer::signature = 0x54424950;
PIBaseTransfer::PIBaseTransfer(): crc(standardCRC_16()), diag(false) {
header.sig = signature;
crc_enabled = true;
header.session_id = 0;
packet_header_size = sizeof(PacketHeader) + customHeader().size();
part_header_size = sizeof(Part) + sizeof(int);
@@ -77,7 +78,9 @@ void PIBaseTransfer::received(PIByteArray data) {
return;
} else {
uint rcrc = h.crc;
uint ccrc = crc.calculate(data.data(), data.size_s());
uint ccrc;
if (crc_enabled) ccrc = crc.calculate(data.data(), data.size_s());
else ccrc = 0;
if (rcrc != ccrc) {
header.id = h.id;
piCoutObj << "invalid CRC";
@@ -523,7 +526,8 @@ PIByteArray PIBaseTransfer::build_packet(int id) {
mutex_header.lock();
header.id = id + 1;
header.type = pt_Data;
header.crc = crc.calculate(ret);
if (crc_enabled) header.crc = crc.calculate(ret);
else header.crc = 0;
hdr << header;
mutex_header.unlock();
ret.insert(0, hdr);

View File

@@ -65,6 +65,9 @@ public:
void setTimeout(double sec) {timeout_ = sec; diag.setDisconnectTimeout(sec);}
double timeout() const {return timeout_;}
void setCRCEnabled(bool en = true) {crc_enabled = en;}
bool isCRCEnabled() const {return crc_enabled;}
const PIString & stateString() const {return state_string;}
llong bytesAll() const {return bytes_all;}
llong bytesCur() const {return bytes_cur;}
@@ -89,19 +92,18 @@ public:
EVENT1(sendRequest, PIByteArray &, data)
protected:
void buildSession(PIVector<Part> parts);
virtual PIByteArray buildPacket(Part fi) = 0;
virtual void receivePart(Part fi, PIByteArray ba, PIByteArray pheader) = 0;
virtual PIByteArray customHeader() {return PIByteArray();}
bool send_process();
uint packet_header_size, part_header_size;
bool break_, is_sending, is_receiving, is_pause;
PIString state_string;
llong bytes_all, bytes_cur;
void buildSession(PIVector<Part> parts);
virtual PIByteArray buildPacket(Part fi) = 0;
virtual void receivePart(Part fi, PIByteArray ba, PIByteArray pheader) = 0;
virtual PIByteArray customHeader() {return PIByteArray();}
bool send_process();
private:
private:
enum PacketType {pt_Unknown, pt_Data, pt_ReplySuccess, pt_ReplyInvalid, pt_Break, pt_Start, pt_Pause};
# pragma pack(push,1)
@@ -114,6 +116,15 @@ private:
friend PIByteArray & operator >>(PIByteArray & s, PIBaseTransfer::StartRequest & v);
friend PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::StartRequest & v);
void processData(int id, PIByteArray &data);
PIByteArray build_packet(int id);
int checkSession();
void sendBreak(int session_id);
void sendReply(PacketType reply);
bool getStartRequest();
bool finish_send(bool ok);
void finish_receive(bool ok, bool quet = false);
static const uint signature;
int packet_size, packets_count;
double timeout_;
@@ -127,15 +138,7 @@ private:
PIMutex mutex_session;
PIMutex mutex_send;
PIMutex mutex_header;
void processData(int id, PIByteArray &data);
PIByteArray build_packet(int id);
int checkSession();
void sendBreak(int session_id);
void sendReply(PacketType reply);
bool getStartRequest();
bool finish_send(bool ok);
void finish_receive(bool ok, bool quet = false);
bool crc_enabled;
};
inline PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::PacketHeader & v) {s << v.sig << v.type << v.session_id << v.id << v.crc; return s;}

View File

@@ -37,6 +37,8 @@
PIPeer::PeerData::PeerData(const PIString & n): PIObject(n) {
dt_in.setPacketSize(_PIPEER_MSG_SIZE);
dt_out.setPacketSize(_PIPEER_MSG_SIZE);
dt_in.setCRCEnabled(false);
dt_out.setCRCEnabled(false);
CONNECTU(&dt_in, sendRequest, this, dtSendRequestIn)
CONNECTU(&dt_out, sendRequest, this, dtSendRequestOut)
CONNECTU(&dt_in, receiveFinished, this, dtReceiveFinishedIn)