Пример #1
0
        /// <summary>
        /// Gets the <see cref="ObjectResult"/> object from the list of <see cref="ExerciseEntity"/> objects.
        /// </summary>
        /// <param name="entities">List of <see cref="ExerciseEntity"/> objects.</param>
        /// <param name="request"><see cref="PublishRequestMessage"/> object.</param>
        /// <param name="eventId">Event ID.</param>
        /// <param name="httpStatusCode"><see cref="HttpStatusCode"/> value.</param>
        /// <returns>Returns the <see cref="ObjectResult"/> object.</returns>
        public static ObjectResult ToPublishResponseMessage(this List <ExerciseEntity> entities,
                                                            PublishRequestMessage request,
                                                            Guid eventId,
                                                            HttpStatusCode httpStatusCode = HttpStatusCode.OK)
        {
            if (!entities.Any())
            {
                var result = new ErrorObjectResult()
                {
                    Upn           = request.Upn,
                    CorrelationId = request.CorrelationId,
                    Interface     = request.Interface,
                    SpanId        = request.SpanId,
                    EventId       = eventId,
                    Message       = EventType.RecordNotFound.ToDisplayName(),
                    StatusCode    = (int)HttpStatusCode.NotFound,
                };

                return(result);
            }

            var exercises = entities.Select(p => new Exercise()
            {
                ExerciseId      = p.ExerciseId,
                Name            = p.Exercise,
                Target          = p.Target,
                Sets            = p.Sets.FromJson <List <ExerciseSet> >(),
                AdditionalNotes = p.AdditionalNotes,
            }
                                            )
                            .ToList();

            var msg = new PublishResponseMessage()
            {
                Upn           = request.Upn,
                CorrelationId = request.CorrelationId,
                Interface     = request.Interface,
                SpanId        = request.SpanId,
                EventId       = eventId,
                RoutineId     = request.RoutineId,
                Routine       = request.Routine,
                Exercises     = exercises,
            };

            return(new ObjectResult(msg)
            {
                StatusCode = (int)httpStatusCode
            });
        }
Пример #2
0
        /// <summary>
        /// Tells the server that the client is ready to receive notifications from the server.
        /// </summary>
        public PublishResponseMessage Publish(PublishMessage request)
        {
            try
            {
                // validate the sesion
                Session session = VerifySession(request.RequestHeader, false);

                uint subscriptionId         = 0;
                NotificationMessage message = null;

                QueuedRequest queuedRequest = new QueuedRequest();

                lock (m_messages)
                {
                    // first check if there are any messages waiting to be published.
                    for (LinkedListNode <QueuedMessage> node = m_messages.First; node != null; node = node.Next)
                    {
                        // ensure the message belongs to the current session
                        if (Object.ReferenceEquals(session, node.Value.Session))
                        {
                            // pull the message off the queue and return.
                            subscriptionId = node.Value.Subscription.Id;
                            message        = node.Value.Message;
                            m_messages.Remove(node);
                            break;
                        }
                    }

                    // must process requests in the order that they arrive.
                    if (message == null)
                    {
                        queuedRequest.Session = session;
                        queuedRequest.Timeout = DateTime.UtcNow.AddMilliseconds(request.RequestHeader.TimeoutHint);
                        queuedRequest.Signal  = new ManualResetEvent(false);
                        m_requests.AddLast(queuedRequest);
                    }
                }

                // wait for a notification.
                if (message == null)
                {
                    try
                    {
                        queuedRequest.Signal.WaitOne();

                        if (queuedRequest.Message == null)
                        {
                            throw new StatusCodeException(StatusCodes.BadTimeout, "Timed out waiting for notifications.");
                        }

                        subscriptionId = queuedRequest.SubscriptionId;
                        message        = queuedRequest.Message;
                    }
                    finally
                    {
                        queuedRequest.Signal.Close();
                    }
                }

                // sent response.
                PublishResponseMessage response = new PublishResponseMessage();

                response.ResponseHeader           = CreateResponseHeader(request.RequestHeader);
                response.SubscriptionId           = subscriptionId;
                response.NotificationMessage      = message;
                response.MoreNotifications        = false;
                response.Results                  = new ListOfStatusCode();
                response.DiagnosticInfos          = new ListOfDiagnosticInfo();
                response.AvailableSequenceNumbers = new ListOfUInt32();

                return(response);
            }
            catch (Exception e)
            {
                throw CreateSoapFault(request.RequestHeader, e);
            }
        }