public void HandleData(MemBlock data, ISender retpath, object state) {
MemBlock rest_of_data;
PType p;
if( state == null ) {
p = PType.Parse(data, out rest_of_data);
}
else {
//a demux has already happened:
p = (PType)state;
rest_of_data = data;
}
if( PType.Protocol.Pathing.Equals(p) ) {
/*
* We use a special PType to denote this transaction so
* we don't confuse it with other RepRep communication
*/
_rrm.HandleData(rest_of_data, retpath, null);
}
else if( PType.Protocol.Rpc.Equals(p) ) {
/*
* Send this to the RpcHandler
*/
Rpc.HandleData(rest_of_data, retpath, null);
}
else {
/*
* This is some other data
* It is either:
* 1) Time to announce an already created edge.
* 2) Assume this is a "default path" edge creation, to be backwards
* compatible
*/
Edge e = null;
PathEdge pe = null;
try {
e = (Edge)retpath;
PathEdgeListener pel = null;
lock( _sync ) {
if( _unannounced.TryGetValue(e, out pe) ) {
//
_unannounced.Remove(e);
pel = _pel_map[pe.LocalPath];
}
}
if( pe == null ) {
/*
* This must be a "default path" incoming connection
*/
pel = _pel_map[Root];
pe = new PathEdge(e, Root, Root);
}
pel.SendPathEdgeEvent(pe);
pe.Subscribe();
pe.ReceivedPacketEvent(data);
}
catch(Exception x) {
if( pe != null ) {
//This closes both edges:
pe.Close();
}
else if( e != null ) {
Console.WriteLine("Closing ({0}) due to: {1}", e, x);
e.Close();
}
}
}
}