void G2Node::OnPacketHeader(const bs::error_code& err) { if(closed_) return; if(!err) { assert(g2buffer_.size() > 0); rawPacket_.insert(rawPacket_.end(), g2buffer_.begin(), g2buffer_.end()); G2::Header hd; try { hd.Decode(&rawPacket_[0], rawPacket_.size()); } catch( std::exception& e) { ReadPacket(); return; } if(hd.dataSize > 0) { g2buffer_.resize(hd.dataSize); ba::async_read(*pSocket_, ba::buffer(g2buffer_), ba::transfer_all(), boost::bind(&G2Node::OnPayload, shared_from_this(), ba::placeholders::error)); } else HandlePacket(); } else if(err != ba::error::operation_aborted) { System::LogDev() << "G2Node::OnPacketHeader " << myInfo_.endpoint.ToString() << " " << err.message() << std::endl; DetachMe(); } }
void G2Node::OnPayload(const bs::error_code& err) { if(closed_) return; if(!err) { rawPacket_.insert(rawPacket_.end(), g2buffer_.begin(), g2buffer_.end()); HandlePacket(); } else if(err != ba::error::operation_aborted) { System::LogDev() << "G2Node::OnPayload " << myInfo_.endpoint.ToString() << " " << err.message() << std::endl; DetachMe(); } }
void G2Node::OnPacketSent(const bs::error_code& err) { if(closed_) return; if(!err) { packetBuf_.clear(); dispatchQueue_.pop(); if(!dispatchQueue_.empty()) SendPackets(); } else if(err != ba::error::operation_aborted) { System::LogDev() << "G2Node::OnPacketSent " << myInfo_.endpoint.ToString() << " " << err.message() << std::endl; DetachMe(); } }
void G2Node::OnTimer() { if(System::Since(timestamp_) > ALIVE_TIMEOUT) { System::LogBas() << "Hub " << myInfo_.endpoint << " timeout. Disconnecting." << std::endl; Close(); DetachMe(); return; } if(periodLNI_.Set()) UpdateLNI(); if(periodQHT_.Set()) UpdateQHT(); if(periodPing_.Set()) Ping(); }
void G2Node::OnControlByte(const bs::error_code& err) { if(closed_) return; assert(g2buffer_.size() == 1); if(!err) { rawPacket_.push_back(g2buffer_[0]); G2::ControlByte cb(g2buffer_[0]); g2buffer_.resize(cb.lengthSize + cb.nameSize); ba::async_read(*pSocket_, ba::buffer(g2buffer_), ba::transfer_all(), boost::bind(&G2Node::OnPacketHeader, shared_from_this(), ba::placeholders::error)); } else if(err != ba::error::operation_aborted) { System::LogDev() << "G2Node::OnControlByte " << myInfo_.endpoint.ToString() << " " << err.message() << std::endl; DetachMe(); } }
Observer& Observer::operator=(const Observer& anObserver) { anObserver; DetachMe(); return *this; }
Observer::~Observer() { DetachMe(); }