private static void HandleIncomingBreweryMessage(BreweryMessage message) { IncomingMessage incomingMessage = message as IncomingMessage; if (message != null) { // If the message is goodbye, get and remove from list if (incomingMessage.MessageType == BreweryMessageType.Goodbye) { Info("Goodbye from {0}", incomingMessage.SourceBreweryID); // Only signal if we already knew about it Brewery targetBrewery = null; if (s_breweries.TryRemove(incomingMessage.SourceBreweryID, out targetBrewery)) { targetBrewery.HandleIncomingMessage(message); OnBreweryLeave?.Invoke(null, new BreweryTopologyEventArgs() { Brewery = targetBrewery }); } } else { bool isNew = false; Brewery targetBrewery = s_breweries.GetOrAdd(incomingMessage.SourceBreweryID, (key) => { // We add to the dictionary, but note that its new isNew = true; Debug("Message from previously unknown ID: {0} => {1}", incomingMessage.SourceBreweryID, incomingMessage.MessageType); return(new Brewery(key)); }); // Fire event outside of dictionary add, as delegate may want the dictionary elemetn if (isNew) { Info("New brewery discovered, sending full refresh: {0}", targetBrewery.ID); targetBrewery.OnRefreshComplete += NewBreweryRefreshComplete; targetBrewery.FullRefreshAsync(); } // Deliver message to the target brewery object - TBD targetBrewery.HandleIncomingMessage(message); } } PruneOldBreweries(); }
internal void HandleIncomingMessage(BreweryMessage message) { LastMessage = DateTime.Now; m_receiptStamps.AddOrUpdate(message.MessageType, m_stopwatch.ElapsedTicks, (messageType, oldValue) => m_stopwatch.ElapsedTicks); try { switch (message.MessageType) { case BreweryMessageType.Settings: Settings = (message as SettingsBreweryMessage).Settings; OnSettingsReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; case BreweryMessageType.State: RemoteState = (message as StateBreweryMessage).CurrentState; OnStateReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; case BreweryMessageType.SSIDs: Networks = (message as SsidBreweryMessage).Networks.ToList(); OnNetworksReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; case BreweryMessageType.AllInfo: AllInfoBreweryMessage allInfo = message as AllInfoBreweryMessage; Settings = allInfo.SettingsMessage().Settings; RemoteState = allInfo.StateMessage().CurrentState; Networks = allInfo.SsidsMessage().Networks.ToList(); OnRefreshComplete?.Invoke(this, new BreweryEventArgs() { Brewery = this }); OnSettingsReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); OnNetworksReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); OnStateReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; case BreweryMessageType.Pong: OnPongReceived?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; case BreweryMessageType.StatusTxt: OnStatusText?.Invoke(this, new BreweryStatusTextEventArgs() { Brewery = this, Message = (message as StatusTextBreweryMessage).Data }); break; case BreweryMessageType.Goodbye: OnGoodbye?.Invoke(this, new BreweryEventArgs() { Brewery = this }); break; } } catch (Exception ex) { Mantis.Error("{0} ignoring brewery delegate exception from message: {1} exception: {2}", ID, message.MessageType, ex); } if (message is IncomingMessage) { try { OnNetworkMessage?.Invoke(this, new BreweryNetworkEventArgs() { Brewery = this, Message = message as IncomingMessage }); } catch (Exception ex) { Mantis.Error("{0} ignoring brewery delegate exception from network delegate, message: {1} exception: {2}", ID, message.MessageType, ex); } } }