Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }