void SendReqPdu(ISmppPdu RequestPdu, ref SmppAsyncObject AsyncObject)
        {
            if (RequestPdu.Header.SequenceNumber == 0)
            {
                RequestPdu.Header.SequenceNumber = GetSequenceNumber();
            }
            AsyncObject.mre = new ManualResetEvent(false);
            AddPendingResponse(RequestPdu.Header.SequenceNumber, AsyncObject);
            if (TcpConnection.Send(RequestPdu.ToByteArray()) <= 0)
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                TcpConnection.Disconnect();
                throw new Exception("Invalid connection State");
            }
            if (!AsyncObject.mre.WaitOne(Settings.Timeout, false) || (AsyncObject.PduRes == null))
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                if (Settings.DisconnectOnTimeout)
                {
                    TcpConnection.Disconnect();
                }
                throw new SmppTimeOutException();
            }
            var header = new SmppHeader(AsyncObject.PduRes);

            if (header.CommandId == -2147483648)
            {
                RemovePendingResponse(RequestPdu.Header.SequenceNumber);
                throw new SmppGenericNackException(SmppStatusCodes.GetDescription(RequestPdu.Header.CommandStatus));
            }
            RemovePendingResponse(RequestPdu.Header.SequenceNumber);
        }
        internal void InitializeAsyncTransac(ISmppPdu RequestObj, object Callback, object State)
        {
            if (RequestObj.Header.SequenceNumber == 0)
            {
                RequestObj.Header.SequenceNumber = GetSequenceNumber();
            }
            var obj2 = new SmppAsyncObject(Callback, State, RequestObj, Settings.Timeout);

            obj2.CompletionCallback = ProcessAsyncPdu;
            lock (PendingResponse.SyncRoot) {
                lock (PendingQueue.SyncRoot) {
                    obj2.StartTimer();
                    if (PendingResponse.Count < Settings.WindowSize)
                    {
                        PendingResponse.Add(RequestObj.Header.SequenceNumber, obj2);
                        try {
                            SendResPdu(RequestObj.ToByteArray());
                            goto Label_00ED;
                        } catch {
                            PendingResponse.Remove(RequestObj.Header.SequenceNumber);
                            throw;
                        }
                    }
                    PendingQueue.Add(obj2);
                }
Label_00ED:
                ;
            }
        }
Example #3
0
 public SmppAsyncObject(object CallBack, object State, ISmppPdu Request, int Timeout) {
   this.Timeout = 0x7530;
   SyncRoot = new object();
   AsyncState = SmppAsyncState.Enabled;
   Callback = CallBack;
   this.State = State;
   this.Request = Request;
   this.Timeout = Timeout;
 }
Example #4
0
 public SmppAsyncObject(object CallBack, object State, ISmppPdu Request, int Timeout)
 {
     this.Timeout = 0x7530;
     SyncRoot     = new object();
     AsyncState   = SmppAsyncState.Enabled;
     Callback     = CallBack;
     this.State   = State;
     this.Request = Request;
     this.Timeout = Timeout;
 }
 void SendReqPdu(ISmppPdu RequestPdu, ref SmppAsyncObject AsyncObject) {
   if (RequestPdu.Header.SequenceNumber == 0)
     RequestPdu.Header.SequenceNumber = GetSequenceNumber();
   AsyncObject.mre = new ManualResetEvent(false);
   AddPendingResponse(RequestPdu.Header.SequenceNumber, AsyncObject);
   if (TcpConnection.Send(RequestPdu.ToByteArray()) <= 0) {
     RemovePendingResponse(RequestPdu.Header.SequenceNumber);
     TcpConnection.Disconnect();
     throw new Exception("Invalid connection State");
   }
   if (!AsyncObject.mre.WaitOne(Settings.Timeout, false) || (AsyncObject.PduRes == null)) {
     RemovePendingResponse(RequestPdu.Header.SequenceNumber);
     if (Settings.DisconnectOnTimeout)
       TcpConnection.Disconnect();
     throw new SmppTimeOutException();
   }
   var header = new SmppHeader(AsyncObject.PduRes);
   if (header.CommandId == -2147483648) {
     RemovePendingResponse(RequestPdu.Header.SequenceNumber);
     throw new SmppGenericNackException(SmppStatusCodes.GetDescription(RequestPdu.Header.CommandStatus));
   }
   RemovePendingResponse(RequestPdu.Header.SequenceNumber);
 }
 internal void InitializeAsyncTransac(ISmppPdu RequestObj, object Callback, object State) {
   if (RequestObj.Header.SequenceNumber == 0)
     RequestObj.Header.SequenceNumber = GetSequenceNumber();
   var obj2 = new SmppAsyncObject(Callback, State, RequestObj, Settings.Timeout);
   obj2.CompletionCallback = ProcessAsyncPdu;
   lock (PendingResponse.SyncRoot) {
     lock (PendingQueue.SyncRoot) {
       obj2.StartTimer();
       if (PendingResponse.Count < Settings.WindowSize) {
         PendingResponse.Add(RequestObj.Header.SequenceNumber, obj2);
         try {
           SendResPdu(RequestObj.ToByteArray());
           goto Label_00ED;
         } catch {
           PendingResponse.Remove(RequestObj.Header.SequenceNumber);
           throw;
         }
       }
       PendingQueue.Add(obj2);
     }
     Label_00ED:
     ;
   }
 }