/// <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; } }
protected virtual void OnRequestArrived(TcpRequest req) => RequestArrived?.Invoke(this, req);