PIPeer data transfers fixnsfer
git-svn-id: svn://db.shs.com.ru/pip@47 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -31,15 +31,23 @@ class PIP_EXPORT PIPeer: public PIObject
|
||||
{
|
||||
PIOBJECT_SUBCLASS(PIPeer, PIObject)
|
||||
private:
|
||||
struct PeerData {
|
||||
explicit PeerData() {dt_in = dt_out = 0; t = 0;}
|
||||
PeerData(const PeerData & ) {dt_in = dt_out = 0; t = 0;}
|
||||
PeerData & operator =(const PeerData & ) {dt_in = dt_out = 0; t = 0; return *this;}
|
||||
~PeerData();
|
||||
void initDT(const PIString & name);
|
||||
|
||||
class PeerData: public PIObject {
|
||||
PIOBJECT_SUBCLASS(PeerData, PIObject)
|
||||
public:
|
||||
PeerData(const PIString & n);
|
||||
EVENT_HANDLER1(void, dtSendRequestIn, PIByteArray &, data) {data.push_front(uchar(2)); sendRequest(name(), data);}
|
||||
EVENT_HANDLER1(void, dtSendRequestOut, PIByteArray &, data) {data.push_front(uchar(3)); sendRequest(name(), data);}
|
||||
EVENT_HANDLER1(void, dtReceiveFinishedIn, bool, ok) {if (ok) received(name(), dt_in.data());}
|
||||
EVENT_HANDLER1(void, dtReceiveFinishedOut, bool, ok) {if (ok) received(name(), dt_out.data());}
|
||||
EVENT_HANDLER(void, dtThread);
|
||||
EVENT2(received, const PIString &, from, const PIByteArray &, data);
|
||||
EVENT2(sendRequest, const PIString &, to, const PIByteArray &, data);
|
||||
bool send(const PIByteArray & d);
|
||||
void receivedPacket(uchar type, const PIByteArray & d);
|
||||
PIByteArray data;
|
||||
PIThread * t;
|
||||
PIDataTransfer * dt_in, * dt_out;
|
||||
PIThread t;
|
||||
PIDataTransfer dt_in, dt_out;
|
||||
};
|
||||
|
||||
public:
|
||||
@@ -51,7 +59,8 @@ public:
|
||||
friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v);
|
||||
friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v);
|
||||
public:
|
||||
PeerInfo() {dist = sync = cnt = 0; trace = -1; was_update = false;}
|
||||
PeerInfo() {dist = sync = cnt = 0; trace = -1; was_update = false; _data = 0;}
|
||||
~PeerInfo() {}
|
||||
|
||||
struct Address {
|
||||
Address(const PIString & a = PIString(), const PIString & m = "255.255.255.0");
|
||||
@@ -78,13 +87,14 @@ public:
|
||||
void addNeighbours(const PIStringList & l) {piForeachC (PIString & n, l) if (!neighbours.contains(n)) neighbours << n;}
|
||||
void removeNeighbour(const PIString & n) {neighbours.removeAll(n);}
|
||||
void resetPing() {for (int i = 0; i < addresses.size_s(); ++i) addresses[i].ping = -1;}
|
||||
|
||||
void init();
|
||||
void destroy();
|
||||
|
||||
PIString nearest_address;
|
||||
int sync, cnt, trace;
|
||||
bool was_update;
|
||||
PISystemTime time;
|
||||
PeerData _data;
|
||||
PeerData * _data;
|
||||
|
||||
};
|
||||
|
||||
@@ -134,18 +144,14 @@ protected:
|
||||
|
||||
private:
|
||||
EVENT_HANDLER2(void, timerEvent, void * , data, int, delim);
|
||||
EVENT_HANDLER1(void, dtSendRequestIn, PIByteArray &, data) {dtSendRequest(2, data);}
|
||||
EVENT_HANDLER1(void, dtSendRequestOut, PIByteArray &, data) {dtSendRequest(3, data);}
|
||||
EVENT_HANDLER1(void, dtReceiveFinished, bool, ok);
|
||||
EVENT_HANDLER(void, dtThread);
|
||||
EVENT_HANDLER2(bool, sendInternal, const PIString &, to, const PIByteArray &, data);
|
||||
EVENT_HANDLER2(void, dtReceived, const PIString &, from, const PIByteArray &, data);
|
||||
|
||||
bool hasPeer(const PIString & name) {piForeachC (PeerInfo & i, peers) if (i.name == name) return true; return false;}
|
||||
bool removePeer(const PIString & name);
|
||||
void removeNeighbour(const PIString & name);
|
||||
void addPeer(const PeerInfo & pd);
|
||||
|
||||
bool sendInternal(const PIString & to, const PIByteArray & data);
|
||||
void dtSendRequest(uchar type, PIByteArray & data);
|
||||
void sendPeerInfo(const PeerInfo & info);
|
||||
void sendPeerRemove(const PIString & peer);
|
||||
void sendSelfInfo() {sendPeerInfo(self_info);}
|
||||
|
||||
Reference in New Issue
Block a user