Example #1
0
        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);
            }

        }