Public Member Functions | |
SendToKeyListener (BaseOverlay *overlay, BaseOverlayMessage *msg) | |
~SendToKeyListener () | |
virtual void | lookupFinished (AbstractLookup *lookup) |
Private Attributes | |
BaseOverlay * | overlay |
BaseOverlayMessage * | msg |
GlobalStatistics * | globalStatistics |
SendToKeyListener::SendToKeyListener | ( | BaseOverlay * | overlay, | |
BaseOverlayMessage * | msg | |||
) | [inline] |
01097 { 01098 this->overlay = overlay; 01099 this->msg = msg; 01100 globalStatistics = overlay->globalStatistics; 01101 pendingLookups++; 01102 }
SendToKeyListener::~SendToKeyListener | ( | ) | [inline] |
01104 { 01105 pendingLookups--; 01106 overlay = NULL; 01107 if (msg != NULL) { 01108 delete msg; 01109 msg = NULL; 01110 } 01111 }
virtual void SendToKeyListener::lookupFinished | ( | AbstractLookup * | lookup | ) | [inline, virtual] |
Implements LookupListener.
01113 { 01114 if (dynamic_cast<BaseRouteMessage*>(msg)) { 01115 BaseRouteMessage* routeMsg = static_cast<BaseRouteMessage*>(msg); 01116 if (lookup->isValid()) { 01117 if (lookup->getResult().size()==0) { 01118 EV << "[SendToKeyListener::lookupFinished()]\n" 01119 " [ERROR] SendToKeyListener: Valid result, " 01120 "but empty array." << endl; 01121 } else { 01122 routeMsg->setHopCount(routeMsg->getHopCount() 01123 + lookup->getAccumulatedHops()); 01124 01125 for (uint i=0; i<lookup->getResult().size(); i++) { 01126 overlay->sendRouteMessage(lookup->getResult()[i], 01127 static_cast<BaseRouteMessage*> 01128 (routeMsg->dup()), 01129 overlay->routeMsgAcks); 01130 } 01131 } 01132 } else { 01133 EV << "[SendToKeyListener::lookupFinished()]\n" 01134 << " Lookup failed - dropping message" 01135 << endl; 01136 RECORD_STATS(overlay->numDropped++; 01137 overlay->bytesDropped += routeMsg->byteLength()); 01138 } 01139 } else if (dynamic_cast<LookupCall*>(msg)) { 01140 LookupCall* call = static_cast<LookupCall*>(msg); 01141 LookupResponse* response = new LookupResponse(); 01142 01143 if (lookup->isValid()) { 01144 01145 response->setIsValid(true); 01146 response->setKey(call->getKey()); 01147 response->setSiblingsArraySize(lookup->getResult().size()); 01148 for (uint i=0; i<lookup->getResult().size(); i++) { 01149 response->setSiblings(i, lookup->getResult()[i]); 01150 } 01151 if (lookup->getResult().size() == 0) { 01152 EV << "[SendToKeyListener::lookupFinished() @ " 01153 << overlay->thisNode.ip 01154 << " (" << overlay->thisNode.key.toString(16) << ")]\n" 01155 << " LookupCall " 01156 << call->getNonce() 01157 << " failed! (size=0)" << endl; 01158 } 01159 } else { 01160 response->setIsValid(false); 01161 EV << "[SendToKeyListener::lookupFinished() @ " 01162 << overlay->thisNode.ip 01163 << " (" << overlay->thisNode.key.toString(16) << ")]\n" 01164 << " LookupCall " 01165 << call->getNonce() 01166 << " failed!" << endl; 01167 } 01168 overlay->sendRpcResponse(call, response); 01169 msg = NULL; 01170 } else { 01171 throw new cRuntimeError("SendToKeyListener::lookupFinished(): " 01172 "Unkown message type!"); 01173 } 01174 delete this; 01175 }
BaseOverlay* SendToKeyListener::overlay [private] |
BaseOverlayMessage* SendToKeyListener::msg [private] |