/** * This method handles messages from revivers. */ void ReviverSubject::handleMessage( const Mercury::Address & srcAddr, Mercury::UnpackedMessageHeader & header, BinaryIStream & data ) { if (pNub_ == NULL) { ERROR_MSG( "ReviverSubject::handleMessage: " "ReviverSubject not initialised\n" ); return; } uint64 currentPingTime = timestamp(); ReviverPriority priority; data >> priority; bool accept = (reviverAddr_ == srcAddr); if (!accept) { if (priority < priority_) { if (priority_ == 0xff) { INFO_MSG( "ReviverSubject::handleMessage: " "Reviver is %s (Priority %d)\n", (char *)srcAddr, priority ); } else { INFO_MSG( "ReviverSubject::handleMessage: " "%s has a better priority (%d)\n", (char *)srcAddr, priority ); } accept = true; } else { uint64 delta = (currentPingTime - lastPingTime_) * uint64(1000); delta /= stampsPerSecond(); // careful - don't overflow the uint64 int msBetweenPings = int(delta); if (msBetweenPings > msTimeout_) { std::string oldAddr = (char *)reviverAddr_; INFO_MSG( "ReviverSubject::handleMessage: " "%s timed out (%d ms). Now using %s\n", oldAddr.c_str(), msBetweenPings, (char *)srcAddr ); accept = true; } } } Mercury::Bundle bundle; bundle.startReply( header.replyID ); if (accept) { reviverAddr_ = srcAddr; lastPingTime_ = currentPingTime; priority_ = priority; bundle << REVIVER_PING_YES; } else { bundle << REVIVER_PING_NO; } pNub_->send( srcAddr, bundle ); }