public override void Receive(Message msg) { base.Receive(msg); var bnMsg = msg as BnMessage; if (bnMsg == null) { throw new Exception("Invalid message type."); } switch (bnMsg.Type) { case BnMessageType.Setup: var setupMsg = bnMsg as SetupMessage; if (setupMsg == null) { throw new Exception("Invalid message type."); } Initialize(setupMsg); break; case BnMessageType.Store: // TODO: Check duplicate data items DataItems.Add(bnMsg.Data as IDataItem <T>); if (DataItems == null) { throw new Exception("Invalid message payload."); } break; case BnMessageType.Query: var query = bnMsg.Data as IDataItem <T>; if (query == null) { throw new Exception("Invalid message payload."); } Search(query); break; case BnMessageType.Data: var dataMsg = bnMsg as DataMessage; if (dataMsg == null) { throw new Exception("Invalid message type."); } if (dataMsg.Direction == DataMessageDir.Down) { var ddMsg = (DataDownMessage)dataMsg; if (ddMsg.NextSupernode >= netWidth * (netHeight - 1)) { if (ddMsg.NextSupernode != ddMsg.DestinationSupernode) { throw new Exception("Routing error: unexpected message received at bottom."); } // reached a bottom supernode; send my data item up along the // same path as the query was sent downwards if the titles match. query = dataMsg.Data as IDataItem <T>; if (query == null) { throw new Exception("Invalid query message received in bottom node " + Id); } var dataItem = DataItems.FirstOrDefault(di => di.Title == query.Title); if (dataItem == null) { throw new Exception("Data item not found in node " + Id); } else { var upMsg = new DataMessage(DataMessageDir.Up, dataMsg.BackPath, dataItem); ForwardDataUp(upMsg); } } else { ForwardDataDown(ddMsg); } } else { var backConn = dataMsg.BackPath.Pop(); if (dataMsg.BackPath.Count == 0) { if (SearchFinished != null) { SearchFinished(this); } Console.WriteLine("Search result received in node " + Id + " from node " + dataMsg.SenderId + ". Result title is '" + ((IDataItem <System.Drawing.Image>)dataMsg.Data).Title + "'"); } else { if (!ReceivedData.ContainsKey(backConn.FromSupernode)) { ReceivedData[backConn.FromSupernode] = new List <IDataItem <T> >(); ForwardDataUp(dataMsg); } ReceivedData[backConn.FromSupernode].Add((IDataItem <T>)dataMsg.Data); } } break; default: throw new NotSupportedException(); } }
private void ForwardDataUp(DataMessage msg) { var backConnection = msg.BackPath.Peek(); Send(backConnection.NodeId, msg, 100); }