/// <summary> /// Method to send an association abort PDU. /// </summary> /// <param name="source">The source of the abort.</param> /// <param name="reason">The reason for the abort.</param> public void SendAssociateAbort(DicomAbortSource source, DicomAbortReason reason) { if (State != DicomAssociationState.Sta13_AwaitingTransportConnectionClose) { var pdu = new AAbort(source, reason); EnqueuePdu(pdu.Write()); State = DicomAssociationState.Sta13_AwaitingTransportConnectionClose; if (AssociationAborted != null) AssociationAborted(_assoc, reason); } else { Platform.Log(LogLevel.Error, "Unexpected state for association abort, closing connection from {0} to {1}", _assoc.CallingAE, _assoc.CalledAE); OnNetworkError(null, true); if (NetworkClosed != null) NetworkClosed("Unexpected state for association abort"); } }
private bool ProcessRawPDU(RawPDU raw) { try { switch (raw.Type) { case 0x01: { _assoc = new ServerAssociationParameters(); var pdu = new AAssociateRQ(_assoc); pdu.Read(raw); State = DicomAssociationState.Sta3_AwaitingLocalAAssociationResponsePrimative; OnReceiveAssociateRequest(_assoc as ServerAssociationParameters); if (State != DicomAssociationState.Sta13_AwaitingTransportConnectionClose && State != DicomAssociationState.Sta6_AssociationEstablished) { Platform.Log(LogLevel.Error, "Association incorrectly not accepted or rejected, aborting."); return false; } //if derived class call SendAssociateAccept, it has fired this event //if (AssociationEstablished != null) // AssociationEstablished(_assoc); return true; } case 0x02: { var pdu = new AAssociateAC(_assoc); pdu.Read(raw); State = DicomAssociationState.Sta6_AssociationEstablished; OnReceiveAssociateAccept(_assoc); if (AssociationEstablished != null) AssociationEstablished(_assoc); return true; } case 0x03: { var pdu = new AAssociateRJ(); pdu.Read(raw); State = DicomAssociationState.Sta13_AwaitingTransportConnectionClose; if (AssociationRejected != null) AssociationRejected(pdu.Source, pdu.Reason); OnReceiveAssociateReject(pdu.Result, pdu.Source, pdu.Reason); return true; } case 0x04: { var pdu = new PDataTF(); pdu.Read(raw); return ProcessPDataTF(pdu); } case 0x05: { var pdu = new AReleaseRQ(); pdu.Read(raw); State = DicomAssociationState.Sta8_AwaitingAReleaseRPLocalUser; OnReceiveReleaseRequest(); return true; } case 0x06: { var pdu = new AReleaseRP(); pdu.Read(raw); State = DicomAssociationState.Sta13_AwaitingTransportConnectionClose; if (AssociationReleased != null) AssociationReleased(_assoc); OnReceiveReleaseResponse(); return true; } case 0x07: { var pdu = new AAbort(); pdu.Read(raw); State = DicomAssociationState.Sta1_Idle; if (AssociationAborted != null) AssociationAborted(_assoc, pdu.Reason); OnReceiveAbort(pdu.Source, pdu.Reason); return true; } case 0xFF: { Platform.Log(LogLevel.Error, "Unexpected PDU type: 0xFF. Potential parsing error."); return false; } default: throw new DicomNetworkException("Unknown PDU type"); } } catch (Exception e) { OnNetworkError(e, true); if (NetworkError != null) NetworkError(e); Platform.Log(LogLevel.Error, e, "Unexpected exception when processing PDU."); return false; } }