public virtual void sendUnsubscription(UnsubscribeRequest request, RequestTutor tutor)
 {
     if (this.session != null)
     {
         this.session.sendUnsubscription(request, tutor);
     }
 }
Ejemplo n.º 2
0
        public virtual bool addRequestToBatch(SubscribeRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != CONTROL)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            string key = request.SubscriptionId.ToString();

            RequestObjects requestObj = new RequestObjects(request, tutor, listener);

            RequestObjects queuedRequest = null;

            keys.TryGetValue(key, out queuedRequest);
            if (queuedRequest != null)
            {
                //can never happen that an ADD request substitutes a REMOVE request for 2 reasons:
                //  *if those requests are part of the same session than to remove and re-add a table
                //   changes its key.
                //  *if those requests are not part of the same session than during session change
                //   all pending request are removed.
                //so, all cases should pass from the if (requestType == ControlRequest.REMOVE) case

                // thus, this is an unexpected case, let's handle it anyway
                queuedRequest.tutor.notifyAbort();
                this.substituteRequest(key, requestObj);
            }
            else
            {
                this.addRequestInternal(key, requestObj);
            }

            return(true);
        }
Ejemplo n.º 3
0
        public virtual bool addRequestToBatch(ChangeSubscriptionRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != CONTROL)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            string key = CHANGE_SUB_KEY + request.SubscriptionId;

            RequestObjects requestObj = new RequestObjects(request, tutor, listener);

            RequestObjects queuedRequest = null;

            keys.TryGetValue(key, out queuedRequest);
            if (queuedRequest != null)
            {
                //this change frequency request is newer, replace the old one
                queuedRequest.tutor.notifyAbort();
                this.substituteRequest(key, requestObj);
            }
            else
            {
                this.addRequestInternal(key, requestObj);
            }

            return(true);
        }
Ejemplo n.º 4
0
        public virtual bool addRequestToBatch(ForceRebindRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != CONTROL)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            //can we queue force rebind for 2 different sessions? (NO)

            string key = FORCE_REBIND_KEY;

            RequestObjects requestObj = new RequestObjects(request, tutor, listener);

            RequestObjects queuedRequest = null;

            keys.TryGetValue(key, out queuedRequest);
            if (queuedRequest != null)
            {
                queuedRequest.tutor.notifyAbort();
                this.substituteRequest(key, requestObj);
            }
            else
            {
                this.addRequestInternal(key, requestObj);
            }

            return(true);
        }
Ejemplo n.º 5
0
        public virtual bool addRequestToBatch(UnsubscribeRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != CONTROL)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            string key = request.SubscriptionId.ToString();

            RequestObjects requestObj = new RequestObjects(request, tutor, listener);

            RequestObjects queuedRequest = null;

            keys.TryGetValue(key, out queuedRequest);
            if (queuedRequest != null)
            {
                if (queuedRequest.request is SubscribeRequest)
                { //can't be the first attempt, otherwise the unsubscribe request would not be here
                    log.Debug("Substituting SUBSCRIBE request with UNSUBSCRIBE");
                    queuedRequest.tutor.notifyAbort();
                    this.substituteRequest(key, requestObj);
                }
                else
                {
                    //delete already queued, should not happen, still, we don't have nothing to do
                }
            }
            else
            {
                this.addRequestInternal(key, requestObj);
            }

            return(true);
        }
 public virtual void sendReverseHeartbeat(ReverseHeartbeatRequest request, RequestTutor tutor)
 {
     if (this.session != null)
     {
         this.session.sendReverseHeartbeat(request, tutor);
     }
 }
        //////////////////////////////////////////////MESSAGE API CALLS

        public virtual void sendMessage(MessageRequest request, RequestTutor tutor)
        {
            if (this.session != null)
            {
                this.session.sendMessage(request, tutor);
            }
        }
Ejemplo n.º 8
0
        public virtual bool addRequestToBatch(DestroyRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != CONTROL)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            string key = request.Session;

            RequestObjects requestObj = new RequestObjects(request, tutor, listener);

            RequestObjects queuedRequest = null;

            keys.TryGetValue(key, out queuedRequest);

            if (queuedRequest != null)
            {
                log.Debug("Substituting DESTROY request");
                queuedRequest.tutor.notifyAbort();
                this.substituteRequest(key, requestObj);
            }
            else
            {
                this.addRequestInternal(key, requestObj);
            }

            return(true);
        }
Ejemplo n.º 9
0
        public virtual bool addRequestToBatch(ReverseHeartbeatRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != HEARTBEAT)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            //I should only add to queue, the heart-beats are always sent to the server
            RequestObjects hb = new RequestObjects(request, tutor, listener);

            this.addRequestInternal(this.messageNextKey++, hb);
            return(true);
        }
Ejemplo n.º 10
0
        public virtual bool addRequestToBatch(MessageRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (this.batchType != MESSAGE)
            {
                log.Error("Unexpected request type was given to batch");
                return(false);
            }

            //I should only add to queue, the sendMessages are always sent to the server
            RequestObjects message = new RequestObjects(request, tutor, listener);

            this.addRequestInternal(this.messageNextKey++, message);
            return(true);
        }
        private bool addToProperBatch(LightstreamerRequest request, RequestTutor tutor, RequestListener listener)
        {
            if (request is MessageRequest)
            {
                if (log.IsDebugEnabled)
                {
                    log.Debug("New Message request: " + request.RequestName + ", " + listener);
                }

                return(this.messageQueue.addRequestToBatch((MessageRequest)request, tutor, listener));
            }
            else if (request is ReverseHeartbeatRequest)
            {
                return(this.hbQueue.addRequestToBatch((ReverseHeartbeatRequest)request, tutor, listener));
            }
            else if (request is ConstrainRequest)
            {
                return(this.controlQueue.addRequestToBatch((ConstrainRequest)request, tutor, listener));
            }
            else if (request is ForceRebindRequest)
            {
                return(this.controlQueue.addRequestToBatch((ForceRebindRequest)request, tutor, listener));
            }
            else if (request is UnsubscribeRequest)
            {
                return(this.controlQueue.addRequestToBatch((UnsubscribeRequest)request, tutor, listener));
            }
            else if (request is SubscribeRequest)
            {
                return(this.controlQueue.addRequestToBatch((SubscribeRequest)request, tutor, listener));
            }
            else if (request is ChangeSubscriptionRequest)
            {
                return(this.controlQueue.addRequestToBatch((ChangeSubscriptionRequest)request, tutor, listener));
            }
            else if (request is DestroyRequest)
            {
                return(this.destroyQueue.addRequestToBatch((DestroyRequest)request, tutor, listener));
            }
            else
            {
                return(false);
            }
        }
        public virtual void addRequest(LightstreamerRequest request, RequestTutor tutor, RequestListener reqListener)
        {
            Debug.Assert(request is ControlRequest || request is MessageRequest || request is ReverseHeartbeatRequest);
            if (request is NumberedRequest)
            {
                /*
                 * for numbered requests (i.e. having a LS_reqId) the client expects a REQOK/REQERR notification from the server
                 */

                NumberedRequest numberedReq = (NumberedRequest)request;
                Debug.Assert(!pendingRequestMap.ContainsKey(numberedReq.RequestId));
                pendingRequestMap[numberedReq.RequestId] = reqListener;

                sessionLog.Debug("Pending request - post - " + numberedReq.RequestId);
            }
            if (wsTransport == null)
            {
                // no transport: this case can happen for example when the flag isEarlyWSOpenEnabled is off.
                // buffer the request and await the binding of the session
                controlRequestQueue.AddLast(new PendingRequest(request, reqListener, tutor));
            }
            else
            {
                // there is a transport, so openSocket was already called: the state is CONNECTED or CONNECTING
                InternalState state = wsTransport.State;
                switch (state)
                {
                case InternalState.CONNECTED:
                    sendControlRequest(request, reqListener, tutor);
                    break;

                case InternalState.CONNECTING:
                    // buffer the requests, which will be flushed when the client state is CONNECTED
                    controlRequestQueue.AddLast(new PendingRequest(request, reqListener, tutor));
                    break;

                default:
                    // Debug.Assert(false);
                    sessionLog.Warn("Unexpected request " + request.RequestName + " in state " + state);
                    break;
                }
            }
        }
        public virtual void addRequest(LightstreamerRequest request, RequestTutor tutor, RequestListener listener)
        {
            Debug.Assert(request is ControlRequest || request is MessageRequest || request is ReverseHeartbeatRequest);

            if (this.@is(END) || this.@is(ENDING))
            {
                log.Error("Unexpected call on dismissed batch manager: " + request.TransportUnawareQueryString);
                throw new System.InvalidOperationException("Unexpected call on dismissed batch manager");
            }

            this.addToProperBatch(request, tutor, listener);

            if (this.@is(IDLE))
            {
                this.dequeue(SYNC_DEQUEUE, "add");
            }
            else
            {
                //we're already busy, we'll dequeue when we'll be back
                log.Debug("Request manager busy: the request will be sent later " + request);
            }
        }
 protected override void forwardDestroyRequest(DestroyRequest request, RequestTutor tutor, RequestListener reqListener)
 {
     // don't send destroy request when transport is http
 }
 public override void sendControlRequest(LightstreamerRequest request, RequestTutor tutor, RequestListener reqListener)
 {
     httpRequestManager.addRequest(request, tutor, reqListener);
 }
 public override void sendReverseHeartbeat(ReverseHeartbeatRequest request, RequestTutor tutor)
 {
     base.sendReverseHeartbeat(request, tutor);
 }
 public PendingRequest(LightstreamerRequest request, RequestListener reqListener, RequestTutor tutor)
 {
     this.request     = request;
     this.reqListener = reqListener;
     this.tutor       = tutor;
 }
 public virtual void sendSubscriptionChange(ChangeSubscriptionRequest request, RequestTutor tutor)
 {
     if (this.session != null)
     {
         this.session.sendSubscriptionChange(request, tutor);
     }
 }
        private void sendControlRequest(LightstreamerRequest request, RequestListener reqListener, RequestTutor tutor)
        {
            ongoingRequest = new PendingRequest(request, reqListener, tutor);

            wsTransport.sendRequest(protocol, request, new ListenerWrapperAnonymousInnerClass(this, reqListener)
                                    , null, null, 0, 0);
        }
Ejemplo n.º 20
0
 public RequestObjects(LightstreamerRequest request, RequestTutor tutor, RequestListener listener)
 {
     this.request  = request;
     this.tutor    = tutor;
     this.listener = listener;
 }
Ejemplo n.º 21
0
 protected override void forwardDestroyRequest(DestroyRequest request, RequestTutor tutor, RequestListener reqListener)
 {
     wsRequestManager.addRequest(request, tutor, reqListener);
 }