21 #include "dcmtk/config/osconfig.h" 23 #if ! ( PACKAGE_VERSION_NUMBER == 360 ) 24 #include "dcmtk/dcmnet/scu.h" 31 #include "dcmtk/dcmdata/dctk.h" 32 #include "dcmtk/dcmnet/dcompat.h" 33 #include "dcmtk/dcmnet/dimse.h" 34 #include "dcmtk/dcmnet/dcasccff.h" 35 #include "dcmtk/dcmnet/dcasccfg.h" 36 #include "dcmtk/ofstd/oflist.h" 40 const unsigned short ECC_AlreadyConnected = 0x901;
41 const unsigned short ECC_NoAcceptablePresentationContexts = 0x902;
42 const unsigned short ECC_NoPresentationContextsDefined = 0x903;
43 const unsigned short ECC_InvalidSOPInstanceUID = 0x904;
44 const unsigned short ECC_InvalidSOPClassUID = 0x905;
45 const unsigned short ECC_UnknownTransferSyntax = 0x906;
47 const OFConditionConst ECE_NoAcceptablePresentationContexts( OFM_dcmnet, ECC_NoAcceptablePresentationContexts, OF_error,
"No Acceptable Presentation Contexts");
48 const OFConditionConst ECE_NoPresentationContextsDefined( OFM_dcmnet, ECC_NoPresentationContextsDefined, OF_error,
"No Presentation Contexts defined");
49 const OFConditionConst ECE_InvalidSOPClassUID( OFM_dcmnet, ECC_InvalidSOPClassUID, OF_error,
"Invalid SOP Class UID");
50 const OFConditionConst ECE_InvalidSOPInstanceUID( OFM_dcmnet, ECC_InvalidSOPInstanceUID, OF_error,
"Invalid SOP Instance UID");
51 const OFConditionConst ECE_UnknownTransferSyntax( OFM_dcmnet, ECC_UnknownTransferSyntax, OF_error,
"Unknown Transfer Syntax");
52 const OFConditionConst ECE_AlreadyConnected( OFM_dcmnet, ECC_AlreadyConnected, OF_error,
"Already Connected");
54 const OFCondition NET_EC_AlreadyConnected( ECE_AlreadyConnected);
55 const OFCondition NET_EC_NoAcceptablePresentationContexts( ECE_NoAcceptablePresentationContexts);
56 const OFCondition NET_EC_NoPresentationContextsDefined( ECE_NoPresentationContextsDefined);
57 const OFCondition NET_EC_UnknownTransferSyntax( ECE_UnknownTransferSyntax);
58 const OFCondition NET_EC_InvalidSOPClassUID( ECE_InvalidSOPClassUID);
59 const OFCondition NET_EC_InvalidSOPInstanceUID( ECE_InvalidSOPInstanceUID);
66 enum DcmCloseAssociationType
69 DCMSCU_RELEASE_ASSOCIATION,
71 DCMSCU_ABORT_ASSOCIATION,
73 DCMSCU_PEER_REQUESTED_RELEASE,
75 DCMSCU_PEER_ABORTED_ASSOCIATION
83 DCMSCU_STORAGE_IGNORE,
90 DCMSCU_STORAGE_BIT_PRESERVING
103 m_messageIDRespondedTo(0),
104 m_affectedSOPClassUID(),
107 m_statusDetail(NULL) {}
111 virtual ~QRResponse() {
delete m_dataset;
delete m_statusDetail; }
115 Uint16 m_messageIDRespondedTo;
119 OFString m_affectedSOPClassUID;
128 DcmDataset *m_dataset;
136 DcmDataset *m_statusDetail;
143 QRResponse(
const QRResponse &other);
149 QRResponse &operator=(
const QRResponse &other);
154 class RetrieveResponse :
public QRResponse
160 m_numberOfRemainingSubops(0),
161 m_numberOfCompletedSubops(0),
162 m_numberOfFailedSubops(0),
163 m_numberOfWarningSubops(0) {}
167 virtual ~RetrieveResponse() {}
176 Uint16 m_numberOfRemainingSubops;
181 Uint16 m_numberOfCompletedSubops;
186 Uint16 m_numberOfFailedSubops;
191 Uint16 m_numberOfWarningSubops;
198 RetrieveResponse(
const RetrieveResponse &other);
204 RetrieveResponse &operator=(
const RetrieveResponse &other);
234 OFCondition addPresentationContext(
const OFString &abstractSyntax,
235 const OFList<OFString> &xferSyntaxes,
236 const T_ASC_SC_ROLE role = ASC_SC_ROLE_DEFAULT);
243 virtual OFCondition initNetwork();
251 virtual OFCondition negotiateAssociation();
260 T_ASC_PresentationContextID findPresentationContextID(
const OFString &abstractSyntax,
261 const OFString &transferSyntax);
276 T_ASC_PresentationContextID findAnyPresentationContextID(
const OFString &abstractSyntax,
277 const OFString &transferSyntax);
285 virtual OFCondition sendECHORequest(
const T_ASC_PresentationContextID presID);
309 virtual OFCondition sendSTORERequest(
const T_ASC_PresentationContextID presID,
310 const OFString &dicomFile,
312 Uint16 &rspStatusCode);
338 virtual OFCondition sendMOVERequest(
const T_ASC_PresentationContextID presID,
339 const OFString &moveDestinationAETitle,
341 OFList<RetrieveResponse*> *responses);
363 virtual OFCondition handleMOVEResponse(
const T_ASC_PresentationContextID presID,
364 RetrieveResponse *response,
365 OFBool &waitForNextResponse);
385 virtual OFCondition sendCGETRequest(
const T_ASC_PresentationContextID presID,
387 OFList<RetrieveResponse*> *responses);
412 virtual OFCondition handleCGETSession(
const T_ASC_PresentationContextID presID,
414 OFList<RetrieveResponse*> *responses);
427 virtual OFCondition handleCGETResponse(
const T_ASC_PresentationContextID presID,
428 RetrieveResponse* response,
429 OFBool &continueCGETSession);
443 virtual OFCondition handleSTORERequest(
const T_ASC_PresentationContextID presID,
444 DcmDataset *incomingObject,
445 OFBool &continueCGETSession,
446 Uint16 &cStoreReturnStatus);
457 virtual OFCondition handleSTORERequestFile(T_ASC_PresentationContextID *presID,
458 const OFString &filename,
459 T_DIMSE_C_StoreRQ *request);
482 virtual OFCondition sendFINDRequest(
const T_ASC_PresentationContextID presID,
483 DcmDataset *queryKeys,
484 OFList<QRResponse*> *responses);
505 virtual OFCondition handleFINDResponse(
const T_ASC_PresentationContextID presID,
506 QRResponse *response,
507 OFBool &waitForNextResponse);
517 virtual OFCondition sendCANCELRequest(
const T_ASC_PresentationContextID presID);
531 virtual OFCondition sendACTIONRequest(
const T_ASC_PresentationContextID presID,
532 const OFString &sopInstanceUID,
533 const Uint16 actionTypeID,
534 DcmDataset *reqDataset,
535 Uint16 &rspStatusCode);
548 virtual OFCondition sendEVENTREPORTRequest(
const T_ASC_PresentationContextID presID,
549 const OFString &sopInstanceUID,
550 const Uint16 eventTypeID,
551 DcmDataset *reqDataset,
552 Uint16 &rspStatusCode);
564 virtual OFCondition handleEVENTREPORTRequest(DcmDataset *&reqDataset,
566 const int timeout = 0);
571 virtual void closeAssociation(
const DcmCloseAssociationType closeType);
578 void setMaxReceivePDULength(
const unsigned long maxRecPDU);
583 void setDIMSEBlockingMode(
const T_DIMSE_BlockingMode blockingMode);
588 void setAETitle(
const OFString &myAETtitle);
593 void setPeerHostName(
const OFString &peerHostName);
598 void setPeerAETitle(
const OFString &peerAETitle);
603 void setPeerPort(
const Uint16 peerPort);
610 void setDIMSETimeout(
const Uint32 dimseTimeout);
616 void setACSETimeout(
const Uint32 acseTimeout);
622 void setAssocConfigFileAndProfile(
const OFString &filename,
623 const OFString &profile);
631 void setStorageDir(
const OFString &storeDir);
636 void setStorageMode(
const DcmStorageMode storageMode);
642 void setVerbosePCMode(
const OFBool mode);
649 void setDatasetConversionMode(
const OFBool mode);
656 void setProgressNotificationMode(
const OFBool mode);
663 OFBool isConnected()
const;
668 Uint32 getMaxReceivePDULength()
const;
673 T_DIMSE_BlockingMode getDIMSEBlockingMode()
const;
678 const OFString &getAETitle()
const;
683 const OFString &getPeerHostName()
const;
688 const OFString &getPeerAETitle()
const;
693 Uint16 getPeerPort()
const;
698 Uint32 getDIMSETimeout()
const;
704 Uint32 getACSETimeout()
const;
711 OFString getStorageDir()
const;
716 DcmStorageMode getStorageMode()
const;
725 OFBool getVerbosePCMode()
const;
732 OFBool getDatasetConversionMode()
const;
739 OFBool getProgressNotificationMode()
const;
744 OFBool getTLSEnabled()
const;
762 OFCondition sendDIMSEMessage(
const T_ASC_PresentationContextID presID,
763 T_DIMSE_Message *msg,
764 DcmDataset *dataObject,
765 DcmDataset **commandSet = NULL);
777 OFCondition getDatasetInfo(DcmDataset *dataset,
778 OFString &sopClassUID,
779 OFString &sopInstanceUID,
780 E_TransferSyntax &transferSyntax);
786 OFCondition useSecureConnection(DcmTransportLayer *tlayer);
809 OFCondition receiveDIMSECommand(T_ASC_PresentationContextID *presID,
810 T_DIMSE_Message *msg,
811 DcmDataset **statusDetail,
812 DcmDataset **commandSet = NULL,
813 const Uint32 timeout = 0);
824 OFCondition receiveDIMSEDataset(T_ASC_PresentationContextID *presID,
825 DcmDataset **dataObject);
830 void clearPresentationContexts();
840 void findPresentationContext(
const T_ASC_PresentationContextID presID,
841 OFString &abstractSyntax,
842 OFString &transferSyntax);
856 virtual void notifyInstanceStored(
const OFString &filename,
857 const OFString &sopClassUID,
858 const OFString &sopInstanceUID)
const;
867 virtual void notifySENDProgress(
const unsigned long byteCount);
876 virtual void notifyRECEIVEProgress(
const unsigned long byteCount);
888 virtual Uint16 checkEVENTREPORTRequest(T_DIMSE_N_EventReportRQ &request,
889 DcmDataset *reqDataset);
898 virtual OFCondition sendSTOREResponse(T_ASC_PresentationContextID presID,
900 const T_DIMSE_C_StoreRQ &request);
912 virtual OFString createStorageFilename(DcmDataset *dataset);
920 virtual OFCondition ignoreSTORERequest(T_ASC_PresentationContextID presID,
921 const T_DIMSE_C_StoreRQ &request);
929 static void callbackSENDProgress(
void *callbackContext,
930 unsigned long byteCount);
936 static void callbackRECEIVEProgress(
void *callbackContext,
937 unsigned long byteCount);
944 DcmSCU(
const DcmSCU &src);
950 DcmSCU &operator=(
const DcmSCU &src);
953 T_ASC_Association *m_assoc;
956 T_ASC_Network *m_net;
959 T_ASC_Parameters *m_params;
962 OFString m_assocConfigFilename;
965 OFString m_assocConfigProfile;
969 struct DcmSCUPresContext {
973 : abstractSyntaxName()
975 , roleSelect(ASC_SC_ROLE_DEFAULT)
979 OFString abstractSyntaxName;
981 OFList<OFString> transferSyntaxes;
983 T_ASC_SC_ROLE roleSelect;
987 OFList<DcmSCUPresContext> m_presContexts;
990 OFString m_assocConfigFile;
993 T_DIMSE_Message *m_openDIMSERequest;
996 Uint32 m_maxReceivePDULength;
999 T_DIMSE_BlockingMode m_blockMode;
1002 OFString m_ourAETitle;
1008 OFString m_peerAETitle;
1014 Uint32 m_dimseTimeout;
1017 Uint32 m_acseTimeout;
1022 OFString m_storageDir;
1030 DcmStorageMode m_storageMode;
1033 OFBool m_verbosePCMode;
1036 OFBool m_datasetConversionMode;
1039 OFBool m_progressNotificationMode;
1044 Uint16 nextMessageID();
1047 #endif // DCMTK 3.6.0