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); }
void ProcessPdu(ByteBuilder bb) { var header = new SmppHeader(bb); switch (header.CommandId) { case 5: { var pdu = new SmppDeliverSmReq(bb); RaiseDeliverSmReq(new SmppDeliverSmEventArgs(pdu)); return; } case 6: TcpConnection.Disconnect(); return; case 0x15: EnquireLinkRes(new SmppEnquireLinkRes(new SmppHeader(0x10, -2147483627, 0, header.SequenceNumber))); RaiseEnquireLinkReq(new SmppEnquireLinkEventArgs(ClientGuid, new SmppEnquireLinkReq(header))); return; } }
void TcpConnection_DataReceived(object sender, SockClient.DataReceivedEventArgs e) { LastReceptionTime = DateTime.Now; while (TcpConnection.ReadSize() >= 0x10) { int bytes = SmppConverter.FromByteArrayToInt32(TcpConnection.PeekBytes(4)); if (bytes > Settings.MaxPduSize) { TcpConnection.Disconnect(); return; } if (bytes > TcpConnection.ReadSize()) { break; } var bb = new ByteBuilder(TcpConnection.ReadByteArray(bytes, 0)); var header = new SmppHeader(bb); SmppAsyncObject asyncObject = FindAsyncObject(header.SequenceNumber); if (asyncObject != null) { asyncObject.PduRes = bb; if (asyncObject.mre != null) { asyncObject.mre.Set(); } else if (asyncObject.Callback != null) { new SmppCompletionCallbackHandler(ProcessAsyncPdu).BeginInvoke(asyncObject, SmppAsyncObject.SmppAsyncCompleted.Response, null, null); } } else { ProcessPdu(bb); } } }
internal static byte[] GetPduByteArray(ref SmppHeader Header, ISmppBasic Body, SmppTlv Tlv) { byte[] c = null; byte[] buffer2 = null; byte[] arrayObj = null; buffer2 = Body.ToByteArray(); Header.CommandLength = 0x10 + buffer2.Length; if (Tlv != null) { arrayObj = Tlv.ToByteArray(); Header.CommandLength += arrayObj.Length; } c = Header.ToByteArray(); var builder = new ByteBuilder((c.Length + buffer2.Length) + GetArrayLength(arrayObj)); builder.AddRange(c); builder.AddRange(buffer2); if (arrayObj != null) { builder.AddRange(arrayObj); } return(builder.ToArray()); }
void ProcessAsyncPdu(SmppAsyncObject AsyncObject, SmppAsyncObject.SmppAsyncCompleted CompletionReason) { try { Exception exception = null; object obj2 = null; FindAndRemoveTransaction(AsyncObject); switch (CompletionReason) { case SmppAsyncObject.SmppAsyncCompleted.Response: { var header = new SmppHeader(AsyncObject.PduRes); if (header.CommandId != -2147483648) { break; } exception = new SmppGenericNackException(); goto Label_008E; } case SmppAsyncObject.SmppAsyncCompleted.Timeout: exception = new SmppTimeOutException(); Interlocked.Increment(ref ConsecutiveTimeouts); if (ConsecutiveTimeouts > Settings.WindowSize) { BeginUnBind(); } goto Label_008E; case SmppAsyncObject.SmppAsyncCompleted.Disconnection: exception = new SmppInvalidConnectionStateException(); goto Label_008E; default: goto Label_008E; } obj2 = new SmppSubmitSmRes(AsyncObject.PduRes); ConsecutiveTimeouts = 0; Label_008E: switch (AsyncObject.Request.Header.CommandId) { case 3: { var args3 = new SmppAsyncQuerySmResEventArgs(); args3._State = AsyncObject.State; args3._ProcessException = exception; args3._RequestPdu = AsyncObject.Request as SmppQuerySmReq; args3._ResponsePdu = obj2 as SmppQuerySmRes; var handler3 = AsyncObject.Callback as SmppQuerySmResHandler; handler3(this, args3); return; } case 4: { var args = new SmppAsyncSubmitSmResEventArgs(); args._State = AsyncObject.State; args._ProcessException = exception; args._RequestPdu = AsyncObject.Request as SmppSubmitSmReq; args._ResponsePdu = obj2 as SmppSubmitSmRes; var handler = AsyncObject.Callback as SmppSubmitSmResHandler; handler(this, args); return; } case 0x15: break; default: return; } var e = new SmppAsyncEnquireLinkResEventArgs(); e._State = AsyncObject.State; e._ProcessException = exception; e._RequestPdu = AsyncObject.Request as SmppEnquireLinkReq; e._ResponsePdu = obj2 as SmppEnquireLinkRes; var callback = AsyncObject.Callback as SmppAsyncEnquireLinkResHandler; callback(this, e); } catch (Exception exception2) { log.Error("Devshock: " + exception2); } }
public SmppUnknownPduEventArgs(SmppHeader Header, byte[] BodyByteArray) { this.BodyByteArray = BodyByteArray; this.Header = Header; }
void ProcessPdu(Guid ConnGuid, ByteBuilder bb) { var header = new SmppHeader(bb); if (bb.Count > 0x10) { bb.ToArray(0x10, bb.Count - 0x10); } if (((header.CommandId == 2) || (header.CommandId == 1)) || (header.CommandId == 9)) { try { var pdu = new SmppBindReq(bb); if (OnBindReq != null) { OnBindReq(this, new SmppBindEventArgs(ConnGuid, pdu)); } } catch {} } else { int commandId = header.CommandId; if (commandId <= -2147483627) { switch (commandId) { case -2147483643: { var res = new SmppDeliverSmRes(bb); if (OnDeliverSmRes != null) { OnDeliverSmRes(this, new SmppDeliverSmResEventArgs(ConnGuid, res)); } return; } case -2147483627: { var res2 = new SmppEnquireLinkRes(bb); if (OnEnquireLinkRes != null) { OnEnquireLinkRes(this, new SmppEnquireLinkResEventArgs(ConnGuid, res2)); return; } break; } } } else { switch (commandId) { case 3: { var req4 = new SmppQuerySmReq(bb); if (OnQuerySmReq != null) { OnQuerySmReq(this, new SmppQuerySmEventArgs(req4, ConnGuid)); } return; } case 4: { var req2 = new SmppSubmitSmReq(bb); if (OnSubmitSmReq != null) { OnSubmitSmReq(this, new SmppSubmitSmEventArgs(ConnGuid, req2)); } return; } case 5: return; case 6: { var req5 = new SmppUnBindReq(bb); if (OnUnBindReq != null) { OnUnBindReq(this, new SmppUnBindEventArgs(ConnGuid, req5)); } return; } case 0x15: { var req3 = new SmppEnquireLinkReq(bb); if (OnEnquireLinkReq != null) { OnEnquireLinkReq(this, new SmppEnquireLinkEventArgs(ConnGuid, req3)); } return; } default: return; } } } }