예제 #1
0
        private void ParseResponse(string responseString)
        {
            var heosResponse = JsonConvert.DeserializeObject <HeosResponse>(responseString, JsonSerializerSettings);

            if (!string.IsNullOrWhiteSpace(heosResponse.Heos.Message) && heosResponse.Heos.Message.Contains("command under process"))
            {
                Logger.Warn("Ignoring command under process");
                return;
            }


            if (heosResponse.Heos.Command.StartsWith("event", StringComparison.OrdinalIgnoreCase))
            {
                var @event = eventParser.Create(heosResponse.Heos);
                if (@event != null)
                {
                    Logger.Info($"Event parsed: {@event.GetType().Name}");
                    eventSubject.OnNext(@event);
                }
            }
            else
            {
                var query = QueryHelpers.ParseQuery(heosResponse.Heos.Message);

                var sequenceString = query.ContainsKey(Constants.Sequence) ? query[Constants.Sequence] : null;

                var success  = heosResponse.Heos.Result.Equals("success", StringComparison.OrdinalIgnoreCase);
                var sequence = -1;
                if (!string.IsNullOrWhiteSpace(sequenceString))
                {
                    sequence = int.Parse(sequenceString);
                    Logger.Info($"Sequence found: {sequence}");
                }
                else
                {
                    var commandAndMessage = heosResponse.Heos.Command;
                    if (!string.IsNullOrWhiteSpace(heosResponse.Heos.Message))
                    {
                        commandAndMessage += "?" + heosResponse.Heos.Message;
                    }

                    // HACK:
                    commandAndMessage = commandAndMessage.Replace("signed_in&", string.Empty);

                    Logger.Info($"Awaiting request match: {commandAndMessage}");
                    // TODO: StringComparison.InvariantCultureIgnoreCase
                    var command = RequestObservable
                                  .Where(r => commandAndMessage.ToLowerInvariant().Contains(r.Text.ToLowerInvariant()) ||
                                         r.Text.ToLowerInvariant().Contains(commandAndMessage.ToLowerInvariant()))
                                  .TakeSynchronousNotifications().LastOrDefault();

                    // TODO:
                    if (command != null)
                    {
                        sequence = command.Sequence;
                        Logger.Info($"Awaiting sequence found: {sequence}");
                    }
                    else
                    {
                        // TODO: log
                        Logger.Error($"Awaiting sequence not found: {commandAndMessage}");
                    }
                }

                var response = new Response(sequence, success, heosResponse, responseString);

                responseSubject.OnNext(response);
            }
        }