예제 #1
0
        private void PduRequestProcessorCallback(RequestPdu pdu)
        {
            ResponsePdu resp = null;

            if (pdu is Unbind)
            {
                resp = pdu.CreateDefaultResponce();
                try { SendPduBase(resp); }
                catch { /*silent catch*/ }
                EndSession(SmppSessionCloseReason.UnbindRequested, null);
                return;
            }
            resp = RaisePduReceivedEvent(pdu);
            if (resp == null)
            {
                if (pdu.HasResponse)
                {
                    resp = pdu.CreateDefaultResponce();
                }
            }
            if (resp != null)
            {
                try { SendPduBase(resp); } catch { /*Silent catch*/ }
            }
        }
예제 #2
0
        public ResponsePdu SendPdu(RequestPdu pdu)
        {
            int timeout = 0;

            lock (_vSyncRoot) { timeout = _vDefaultResponseTimeout; }
            return(SendPdu(pdu, timeout));
        }
예제 #3
0
        public IAsyncResult BeginSendPdu(RequestPdu pdu, AsyncCallback callback, object @object)
        {
            int timeout = 0;

            lock (_vSyncRoot) { timeout = _vDefaultResponseTimeout; }
            return(BeginSendPdu(pdu, timeout, callback, @object));
        }
예제 #4
0
        public ResponsePdu WaitResponse(RequestPdu pdu, int timeOut)
        {
            uint        sequenceNumber = pdu.Header.SequenceNumber;
            ResponsePdu resp           = FetchResponse(sequenceNumber);

            if (resp != null)
            {
                return(resp);
            }
            if (timeOut < 5000)
            {
                timeOut = _vDefaultResponseTimeout;
            }
            PduWaitContext waitContext = new PduWaitContext(sequenceNumber, timeOut);

            _vWaitingEvent.WaitOne();
            try { _vWaitingQueue.Add(waitContext); }
            finally { _vWaitingEvent.Set(); }
            waitContext.WaitForAlert();
            resp = FetchResponse(sequenceNumber);
            if (resp == null)
            {
                throw new SmppResponseTimedOutException();
            }
            return(resp);
        }
예제 #5
0
        private ResponsePdu RaisePduReceivedEvent(RequestPdu pdu)
        {
            /*
             * PduReceived event is not raised asynchronously as this method is
             * being called asynchronously by a worker thread from the thread pool.
             */
            if (PduReceived == null)
            {
                return(null);
            }
            PduReceivedEventArgs e = new PduReceivedEventArgs(pdu);

            PduReceived(this, e);
            return(e.Response);
        }
예제 #6
0
        private void PduErrorEventHandler(object sender, PduErrorEventArgs e)
        {
            ResponsePdu resp = null;

            if (e.Pdu is RequestPdu)
            {
                RequestPdu req = (RequestPdu)e.Pdu;
                resp = req.CreateDefaultResponce();
                resp.Header.ErrorCode = e.Exception.ErrorCode;
            }
            else
            {
                resp = new GenericNack(e.Header);
                resp.Header.ErrorCode = e.Exception.ErrorCode;
            }
            try { SendPduBase(resp); }
            catch { /*silent catch*/ }
        }
예제 #7
0
 public ResponsePdu SendPdu(RequestPdu pdu, int timeout)
 {
     SendPduBase(pdu);
     if (pdu.HasResponse)
     {
         try { return(_vRespHandler.WaitResponse(pdu, timeout)); }
         catch (SmppResponseTimedOutException)
         {
             if (_vTraceSwitch.TraceWarning)
             {
                 Trace.WriteLine("200016:PDU send operation timed out;");
             }
             throw;
         }
     }
     else
     {
         return(null);
     }
 }
예제 #8
0
 public IAsyncResult BeginSendPdu(RequestPdu pdu, int timeout, AsyncCallback callback, object @object)
 {
     return(_vCallback.BeginInvoke(pdu, timeout, callback, @object));
 }
예제 #9
0
 public ResponsePdu WaitResponse(RequestPdu pdu)
 {
     return(WaitResponse(pdu, _vDefaultResponseTimeout));
 }
예제 #10
0
 public PduReceivedEventArgs(RequestPdu request)
 {
     _vRequest = request;
 }