Provides a Wrapper for edges, this allows us to control input, output, and state of the edge. This class is thread-safe.
Inheritance: Edge, IDataHandler
Beispiel #1
0
        ///<summary>This is called when one of our edges closes.  This handles
        ///removing the state from the EdgeListener as necessary.</summary>
        protected void EdgeClose(object o, EventArgs ea)
        {
            Edge e = o as Edge;

            if (e == null)
            {
                throw new Exception("Needs to be an Edge");
            }

            EdgeCreationWrapper ecw = null;
            WrapperEdge         we  = null;

            lock (_sync) {
                if (_edge_to_ecw.ContainsKey(e))
                {
                    ecw = _edge_to_ecw[e];
                    _edge_to_ecw.Remove(e);
                }
                else if (_edge_to_wrapper_edge.ContainsKey(e))
                {
                    we = _edge_to_wrapper_edge[e];
                    _edge_to_wrapper_edge.Remove(e);
                }
            }

            if (ecw != null)
            {
                ecw.CreationCallback(false, null, new EdgeException("Close on unwrapped edge!"));
            }
            else if (we != null)
            {
                we.Close();
            }
        }
Beispiel #2
0
        ///<summary>When the edge is finally wrapped, this is called to finalize
        ///the adding of the edge to the edgelistner.</summary>
        protected void Finalize(WrapperEdge wedge)
        {
            EdgeCreationWrapper ecw = null;

            lock (_sync) {
                if (_edge_to_ecw.ContainsKey(wedge.WrappedEdge))
                {
                    ecw = _edge_to_ecw[wedge.WrappedEdge];
                    _edge_to_ecw.Remove(wedge.WrappedEdge);
                    _edge_to_wrapper_edge[wedge.WrappedEdge] = wedge;
                }
                else
                {
                    throw new Exception("No record of edge");
                }
            }

            // if ecw is null, that means someone else failed before we announced
            // furthermore, we now have a wedge that needs to be manually closed!
            if (ecw != null)
            {
                ecw.CreationCallback(true, wedge, null);
            }
            else
            {
                wedge.Close();
            }
        }
Beispiel #3
0
        ///<summary>This is passed tothe underlying EdgeListener.  By default we do
        ///nothing to this.</summary>
        public override void UpdateRemoteTAs(IList <TransportAddress> list, Edge e, TransportAddress ta)
        {
            WrapperEdge edge = e as WrapperEdge;

            if (edge != null)
            {
                _el.UpdateRemoteTAs(list, edge.WrappedEdge, ta);
            }
        }
Beispiel #4
0
        ///<summary>This is passed tothe underlying EdgeListener.  By default we do
        ///nothing to this.</summary>
        public override void UpdateLocalTAs(Edge e, TransportAddress ta)
        {
            WrapperEdge edge = e as WrapperEdge;

            if (edge != null)
            {
                _el.UpdateLocalTAs(edge.WrappedEdge, ta);
            }
        }
Beispiel #5
0
        ///<summary>This method is usd to wrap the edge.</summary>
        protected virtual void WrapEdge(Edge edge)
        {
            WrapperEdge wedge = new WrapperEdge(edge);

            Finalize(wedge);
        }
Beispiel #6
0
    public void WrapperEdgeRegressionTest()
    {
      AHAddress addr = new AHAddress(new System.Security.Cryptography.RNGCryptoServiceProvider());
      TransportAddress ta = TransportAddressFactory.CreateInstance("brunet.tcp://169.0.5.1:5000");
      FakeEdge fe = new FakeEdge(ta, ta);
      WrapperEdge we_fe = new WrapperEdge(fe);
      Connection fcon = new Connection(we_fe, addr, "structured", null, null);

      List<Connection> overlap = new List<Connection>();
      overlap.Add(fcon);
      RelayTransportAddress tta = new RelayTransportAddress(addr, overlap);
      RelayEdge te1 = new RelayEdge(null, tta, tta, new SimpleForwarderSelector(), overlap);
      WrapperEdge we_te1 = new WrapperEdge(te1);
      Connection t1con = new Connection(we_te1, addr, "structured", null, null);

      overlap = new List<Connection>();
      overlap.Add(t1con);
      RelayEdge te2 = new RelayEdge(null, tta, tta, new SimpleForwarderSelector(), overlap);
      WrapperEdge we_te2 = new WrapperEdge(te2);
      Connection t2con = new Connection(we_te2, addr, "structured", null, null);

      overlap = new List<Connection>();
      overlap.Add(t2con);
      RelayEdge te3 = new RelayEdge(null, tta, tta, new SimpleForwarderSelector(), overlap);
      WrapperEdge we_te3 = new WrapperEdge(te3);
      Connection t3con = new Connection(we_te3, addr, "structured", null, null);

      overlap = new List<Connection>();
      overlap.Add(t3con);
      RelayEdge te4 = new RelayEdge(null, tta, tta, new SimpleForwarderSelector(), overlap);
      WrapperEdge we_te4 = new WrapperEdge(te4);
      Connection t4con = new Connection(we_te4, addr, "structured", null, null);

      overlap = new List<Connection>();
      overlap.Add(t4con);
      RelayEdge te5 = new RelayEdge(null, tta, tta, new SimpleForwarderSelector(), overlap);
      WrapperEdge we_te5 = new WrapperEdge(te5);
      Connection t5con = new Connection(we_te5, addr, "structured", null, null);

      Assert.AreEqual(te5.ShouldClose(), false, "Shouldn't close yet...");
      te1.DisconnectionHandler(fcon);
      Assert.AreEqual(te5.ShouldClose(), true, "Should close...");

      overlap.Add(t5con);
      overlap.Add(t3con);
      overlap.Add(t1con);
      te2.UpdateNeighborIntersection(overlap);
      Assert.AreEqual(te5.ShouldClose(), true, "Should close... 2");
    }
Beispiel #7
0
    ///<summary>When the edge is finally wrapped, this is called to finalize
    ///the adding of the edge to the edgelistner.</summary>
    protected void Finalize(WrapperEdge wedge) {
      EdgeCreationWrapper ecw = null;
      lock(_sync) {
        if(_edge_to_ecw.ContainsKey(wedge.WrappedEdge)) {
          ecw = _edge_to_ecw[wedge.WrappedEdge];
          _edge_to_ecw.Remove(wedge.WrappedEdge);
          _edge_to_wrapper_edge[wedge.WrappedEdge] = wedge;
        } else {
          throw new Exception("No record of edge");
        }
      }

      // if ecw is null, that means someone else failed before we announced
      // furthermore, we now have a wedge that needs to be manually closed!
      if(ecw != null) {
        ecw.CreationCallback(true, wedge, null);
      } else { 
        wedge.Close();
      }
    }
Beispiel #8
0
 ///<summary>This method is usd to wrap the edge.</summary>
 protected virtual void WrapEdge(Edge edge) {
   WrapperEdge wedge = new WrapperEdge(edge);
   Finalize(wedge);
 }