/// <summary> /// Checks whether the incoming response is a reponse to a specific request and if the reported status is OK. /// <para>This function sets last error</para> /// </summary> /// <param name="RequestMessage">Request message for which the response was received.</param> /// <param name="ResponseMessage">Response message received.</param> /// <returns>true if the response is valid and its status is OK.</returns> public bool CheckResponseMessage(Message RequestMessage, Message ResponseMessage) { log.Trace("()"); bool res = false; if (ResponseMessage != null) { if (ResponseMessage.Id == RequestMessage.Id) { if (ResponseMessage.MessageTypeCase == Message.MessageTypeOneofCase.Response) { Response response = ResponseMessage.Response; if (response.Status == Status.Ok) { switch (response.ConversationTypeCase) { case Response.ConversationTypeOneofCase.SingleResponse: if (RequestMessage.Request.ConversationTypeCase == Request.ConversationTypeOneofCase.SingleRequest) { SingleRequest.RequestTypeOneofCase requestType = RequestMessage.Request.SingleRequest.RequestTypeCase; if (response.SingleResponse.ResponseTypeCase.ToString() == requestType.ToString()) { res = true; } else { log.Debug("Single response type {0} does not match single request type {1}.", response.SingleResponse.ResponseTypeCase, requestType); } } else { log.Debug("Response message conversation type {0} does not match request message conversation type {1}.", response.ConversationTypeCase, RequestMessage.Request.ConversationTypeCase); } break; case Response.ConversationTypeOneofCase.ConversationResponse: if (RequestMessage.Request.ConversationTypeCase == Request.ConversationTypeOneofCase.ConversationRequest) { ConversationRequest.RequestTypeOneofCase requestType = RequestMessage.Request.ConversationRequest.RequestTypeCase; if (response.ConversationResponse.ResponseTypeCase.ToString() == requestType.ToString()) { res = true; } else { log.Debug("Conversation response type {0} does not match conversation request type {1}.", response.ConversationResponse.ResponseTypeCase, requestType); } } else { log.Debug("Response message conversation type {0} does not match request message conversation type {1}.", response.ConversationTypeCase, RequestMessage.Request.ConversationTypeCase); } break; default: log.Error("Invalid response conversation type {0}.", ResponseMessage.Response.ConversationTypeCase); break; } } else { log.Debug("Response message status is {0}.", ResponseMessage.Response.Status); } } else { log.Debug("Received message is not response, its message type is {0}.", ResponseMessage.MessageTypeCase); } } else { log.Debug("Response message ID {0} does not match request message ID {1}.", ResponseMessage.Id, RequestMessage.Id); } } else { log.Debug("Response message is null."); } log.Trace("(-):{0}", res); return(res); }
/// <summary> /// Waits until the profile server receives a conversation request message of certain type. /// </summary> /// <param name="Role">Specifies the role of the server to which the message had to arrive to be accepted by this wait function.</param> /// <param name="RequestType">Type of the conversation request to wait for.</param> /// <param name="ClearMessageList">If set to true, the message list will be cleared once the wait is finished.</param> /// <returns>Message the profile server received.</returns> public async Task <IncomingServerMessage> WaitForConversationRequest(ServerRole Role, ConversationRequest.RequestTypeOneofCase RequestType, bool ClearMessageList = true) { log.Trace("()"); IncomingServerMessage res = null; bool done = false; while (!done) { lock (messageListLock) { foreach (IncomingServerMessage ism in messageList) { if (!Role.HasFlag(ism.Role)) { continue; } Message message = ism.IncomingMessage; if (message.MessageTypeCase != Message.MessageTypeOneofCase.Request) { continue; } Request request = message.Request; if (request.ConversationTypeCase != Request.ConversationTypeOneofCase.ConversationRequest) { continue; } ConversationRequest conversationRequest = request.ConversationRequest; if (conversationRequest.RequestTypeCase != RequestType) { continue; } res = ism; done = true; break; } if (done && ClearMessageList) { messageList.Clear(); } } if (!done) { try { await Task.Delay(1000, shutdownCancellationTokenSource.Token); } catch { } } } log.Trace("(-)"); return(res); }