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] |
00921 { 00922 this->overlay = overlay; 00923 this->msg = msg; 00924 globalStatistics = overlay->globalStatistics; 00925 pendingLookups++; 00926 }
SendToKeyListener::~SendToKeyListener | ( | ) | [inline] |
00928 { 00929 pendingLookups--; 00930 overlay = NULL; 00931 if (msg != NULL) { 00932 delete msg; 00933 msg = NULL; 00934 } 00935 }
virtual void SendToKeyListener::lookupFinished | ( | AbstractLookup * | lookup | ) | [inline, virtual] |
Implements LookupListener.
00937 { 00938 if (dynamic_cast<BaseRouteMessage*>(msg)) { 00939 BaseRouteMessage* routeMsg = static_cast<BaseRouteMessage*>(msg); 00940 if (lookup->isValid()) { 00941 if (lookup->getResult().size()==0) { 00942 cout << "[ERROR] SendToKeyListener: Valid result, " 00943 "but empty array." << endl; 00944 } else { 00945 routeMsg->setHopCount(routeMsg->getHopCount() 00946 + lookup->getAccumulatedHops()); 00947 00948 for (uint i=0; i<lookup->getResult().size(); i++) { 00949 overlay->sendRouteMessage(lookup->getResult()[i], 00950 static_cast<BaseRouteMessage*> 00951 (routeMsg->dup()), 00952 overlay->useNextHopRpc); 00953 } 00954 } 00955 } else { 00956 EV << "[SendToKeyListener::lookupFinished()]\n" 00957 << " Lookup failed - dropping message" 00958 << endl; 00959 RECORD_STATS(overlay->numDropped++; 00960 overlay->bytesDropped += routeMsg->byteLength()); 00961 } 00962 } else if (dynamic_cast<LookupCall*>(msg)) { 00963 LookupCall* call = static_cast<LookupCall*>(msg); 00964 LookupResponse* response = new LookupResponse(); 00965 00966 if (lookup->isValid()) { 00967 00968 response->setIsValid(true); 00969 response->setKey(call->getKey()); 00970 response->setSiblingsArraySize(lookup->getResult().size()); 00971 for (uint i=0; i<lookup->getResult().size(); i++) { 00972 response->setSiblings(i, lookup->getResult()[i]); 00973 } 00974 if (lookup->getResult().size() == 0) { 00975 EV << "[SendToKeyListener::lookupFinished() @ " 00976 << overlay->thisNode.ip 00977 << " (" << overlay->thisNode.key.toString(16) << ")]\n" 00978 << " LookupCall " 00979 << call->getNonce() 00980 << " failed! (size=0)" << endl; 00981 } 00982 } else { 00983 response->setIsValid(false); 00984 EV << "[SendToKeyListener::lookupFinished() @ " 00985 << overlay->thisNode.ip 00986 << " (" << overlay->thisNode.key.toString(16) << ")]\n" 00987 << " LookupCall " 00988 << call->getNonce() 00989 << " failed!" << endl; 00990 } 00991 overlay->sendRpcResponse(call, response); 00992 msg = NULL; 00993 } else { 00994 throw new cRuntimeError("SendToKeyListener::lookupFinished(): " 00995 "Unkown message type!"); 00996 } 00997 delete this; 00998 }
BaseOverlay* SendToKeyListener::overlay [private] |
BaseOverlayMessage* SendToKeyListener::msg [private] |