public static Packet RetrievePacket(int packetSize, ref List<byte> buffer) { Packet p = null; JObject json = RetrieveJson(packetSize, ref buffer); if (json == null) return null; //Console.WriteLine("Got " + json["CMD"].ToString().ToUpper() + " packet."); switch (json["CMD"].ToString().ToUpper()) { case LoginResponsePacket.LoginRcmd: p = new LoginResponsePacket(json); break; case ChatPacket.DefCmd: p = new ChatPacket(json); break; case SubscribePacket.DefCmd: p = SubscribePacket.GetSubscribePacket(json); break; case DataFromClientPacket<Object>.DefCmd: //only measurements are supported. p = new DataFromClientPacket<Measurement>(json); break; case PullResponsePacket<Object>.DefCmd: p = HandlePullResponsePacket(json); break; case PushPacket<Object>.DefCmd: p = HandlePushPacket(json); break; case NotifyPacket.Cmd: p = new NotifyPacket(json); break; default: Console.WriteLine("Unsupported packet type: {0}", json["CMD"].ToString()); break; } return p; }
private void HandlePushPacket(JObject json) { //var size = json["count"]; var measurements = json["DataSource"].Children(); var datatype = (string)json["Datatype"]; var authtoken = (string) json["AUTHTOKEN"]; if (!Authentication.Authenticate(authtoken)) { Send(new ResponsePacket(Statuscode.Status.Unauthorized)); return; } int id = currentUser.Id ?? -1; if (currentSession == -1) { currentSession = _database.getNewTrainingSessionId(id); var notifyPacket = new NotifyPacket(NotifyPacket.Subject.NewTrainingId, currentSession.ToString(), currentUser.NonNullId.ToString(), ""); Send(notifyPacket); var specs = Notifier.Instance.GetListeners((Client) currentUser).ToList(); specs.ForEach(x => Authentication.GetStream(x).Send(notifyPacket)); } if (datatype == "Measurements") { List<Measurement> measurementsL = new List<Measurement>(); foreach (var m in measurements.Select( jtoken => jtoken.ToObject<Measurement>()) ) { measurementsL.Add(m); Console.WriteLine(Resources.ClientHandler_HandlePushPacked_Recieved, measurements.FirstOrDefault()); } _database.SaveMeasurements(measurementsL, currentSession, id); var senderU = Authentication.GetUserByAuthToken(authtoken); // Check that sender is a client. if its not, return. if (!(senderU is Client)) return; var senderC = senderU as Client; //Should we notify anyone for this sender? If not, return. if (!Notifier.Instance.ShouldNotify(senderC)) return; // Get all handlers based on all listeners their username. var handlers = Notifier.Instance.GetListeners(senderC) .Select(listener => Authentication.GetStream(listener.Username)); var mList = measurements.Select(m => JsonConvert.DeserializeObject<Measurement>(m.ToString())).ToList(); // Building new json foreach (var handler in handlers) { Console.WriteLine("Notified " + handler.currentUser.Fullname); var returnJson = new DataFromClientPacket<Measurement>(mList, "measurements", currentUser.NonNullId); //new PullResponsePacket<Measurement>(mList, "measurements"); handler.Send(returnJson); } //Console.WriteLine("Notified the listeners"); } else if (datatype.Equals("Configuration", StringComparison.CurrentCultureIgnoreCase)) { var p = new PushPacket<Configuaration>(json); var config = p.DataSource.FirstOrDefault(); if (config == null) return; Console.WriteLine("Sending config-push-packet"); var stream = Authentication.GetStream(config.Username); stream.Send(p); } }