using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Nexi { public class NodeBase { public delegate void MessageHandler(Message msg); public event MessageHandler OnMessageReceived; private class EndPointRecord { public EndPointRecord(EndPoint ep, double initialWeight) { EndPoint = ep; Weight = initialWeight; } public readonly EndPoint EndPoint; public string NodeId { get { return EndPoint.NodeId; } } public double Weight; } List _peers = new List(); Dictionary _incomingPeers = new Dictionary(); public readonly string Id; public NodeBase(string id) { _endPoint = new EndPoint(this); Id = id; } public void PleaseIntroduce(EndPoint ep) { if (!_peers.Contains(ep.NodeId)) _peers.Add(ep); if (!_incomingPeers.ContainsKey(ep.NodeId)) _incomingPeers.Add(ep.NodeId, new EndPointRecord(ep, 0.5)); } private EndPoint _endPoint; public EndPoint EndPoint { get { return _endPoint; } } internal void Receive(Message msg) { if (seenMessage(msg)) { return; } processMessage(msg); } private void processMessage(Message msg) { MessageHandler handler = OnMessageReceived; if (handler != null) { handler(msg); } // XXX should do this with a new message, // only if we've done anything. //broadcastMessage(msg); } private void broadcastMessage(Message msg) { foreach (var peer in _peers) { peer.Receive(this.EndPoint, msg); } } private bool seenMessage(Message msg) { return false; // XXX } } }