예제 #1
0
        /// <summary>
        /// For calling MusicBee functions through TCP. For list of available functions see TcpMessaging.Command enum.
        /// </summary>
        /// <typeparam name="T">Return type of selected function. If void, use type 'object'</typeparam>
        /// <param name="cmd">Selected function.</param>
        /// <param name="args">All arguments required by selected function. If no parameters required, leave empty.</param>
        /// <returns></returns>
        public async Task <T> SendRequest <T>(Command cmd, params object[] args)
        {
            Logger.Trace("Begin SendRequest: {0}", cmd);
            if (!TcpRequest.CheckIfValidParameters(cmd, args))
            {
                throw new Exception("Invalid function parameters!");
            }

            var request = new TcpRequest(cmd, args);

            WriteToStreamAsync(request);

            if (!request.ResponseRequired)
            {
                Logger.Trace("End SendRequest {0} - response not required", cmd);
                return(default(T));
            }

            try
            {
                _responseStack.Add(cmd, new TaskCompletionSource <TcpResponse>());
                Logger.Debug("Request {0} - awaiting response", cmd);

                await _responseStack[cmd].Task;
                _responseStack.TryGetValue(cmd, out var responseTask);
                Logger.Debug("Request {0} - received response", cmd);

                if (responseTask == null)
                {
                    throw new NullReferenceException("Response not found in responseStack!");
                }

                _responseStack.Remove(cmd);
                Logger.Trace("End SendRequest {0} - response arrived", cmd);
                return((T)responseTask.Task.Result.Response);
            }
            catch (Exception e)
            {
                Logger.Error(e, "Failed to get response");
                throw;
            }
        }
예제 #2
0
 protected virtual void OnRequestArrived(TcpRequest req) =>
 RequestArrived?.Invoke(this, req);