/// <summary> /// resuelve un nombre, se le pasa un objeto NodeBind sin direccion /// física y devuelve la dirección física correspondiente con el nodeId /// del objeto NodeBind pasado /// </summary> /// <param name="nodeId"></param> /// <returns></returns> public NodeBind Resolve(NodeId nodeId) { NodeBind ret = null; try { if (tableInner.ContainsKey(nodeId)) { DirectoryEntry entry = new DirectoryEntry(); if (tableInner.TryGetValue(nodeId, out entry)) { if (entry.RoutedBySeed) { ret = entry.SeedBind; } else { ret = entry.NodeBind; } } } else if (localNode.Sessions.ExistsByNodeId(nodeId)) { // buscamos en las sesiones propias y sino en las resoluciones propias ISessionRequest session = localNode.Sessions.GetSession(nodeId); ret = session.NodeBindApplicant; } else { // ISessionRequest[] seeds = localNode.Seeds.CloneArray(); // foreach (ISessionRequest seed in seeds) // IEnumerator<KeyValuePair<string, ISessionRequest>> seed = localNode.Seeds.GetArray(); foreach (ISessionRequest seed in localNode.Seeds.GetArray()) { ResolveRequest rreq = new ResolveRequest(nodeId, localNode); ResolveReply reply = (ResolveReply)localNode.SendRequest(rreq, seed.NodeBindRemote); if (reply != null) { if (reply.resolvedOk) { DirectoryEntry entry = new DirectoryEntry(seed.NodeBindRemote, reply.resolvedNodeBind); localNode.Directory.AddEntryInner(entry); ret = reply.resolvedNodeBind; } } } } } catch (Exception e) { Node.LogAppendLine(e); } return(ret); }
public override void ArrivedAtDestination(Node overlayNode, Message msg) { ResolveReply reply = new ResolveReply(this); NodeBind nodeBind = overlayNode.Directory.ResolveOuter(requestNodeId); if (nodeBind != null) { reply.resolvedNodeBind = nodeBind; reply.resolvedOk = true; } else { reply.resolvedOk = false; } overlayNode.SendReply(reply, msg.Source); }