CTK  0.1.0
The Common Toolkit is a community effort to provide support code for medical image analysis, surgical navigation, and related projects.
ctkDcmSCU.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (C) 2008-2012, OFFIS e.V.
4  * All rights reserved. See COPYRIGHT file for details.
5  *
6  * This software and supporting documentation were developed by
7  *
8  * OFFIS e.V.
9  * R&D Division Health
10  * Escherweg 2
11  * D-26121 Oldenburg, Germany
12  *
13  *
14  * Module: dcmnet
15  *
16  * Author: Michael Onken
17  *
18  * Purpose: Base class for Service Class Users (SCUs)
19  *
20  */
21 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
22 
23 #if ! ( PACKAGE_VERSION_NUMBER == 360 )
24 #include "dcmtk/dcmnet/scu.h"
25 #else
26 
27 #ifndef SCU_H
28 #define SCU_H
29 
30 
31 #include "dcmtk/dcmdata/dctk.h" /* Covers most common dcmdata classes */
32 #include "dcmtk/dcmnet/dcompat.h"
33 #include "dcmtk/dcmnet/dimse.h" /* DIMSE network layer */
34 #include "dcmtk/dcmnet/dcasccff.h" /* For reading a association config file */
35 #include "dcmtk/dcmnet/dcasccfg.h" /* For holding association config file infos */
36 #include "dcmtk/ofstd/oflist.h"
37 
38 
39 /* Remove below if changing to more current DCMTK */
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;
46 
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");
53 
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);
60 
61 /* Remove above if changing to more current DCMTK */
62 
63 
66 enum DcmCloseAssociationType
67 {
69  DCMSCU_RELEASE_ASSOCIATION,
71  DCMSCU_ABORT_ASSOCIATION,
73  DCMSCU_PEER_REQUESTED_RELEASE,
75  DCMSCU_PEER_ABORTED_ASSOCIATION
76 };
77 
80 enum DcmStorageMode
81 {
83  DCMSCU_STORAGE_IGNORE,
85  DCMSCU_STORAGE_DISK,
90  DCMSCU_STORAGE_BIT_PRESERVING
91 };
92 
93 
96 class QRResponse
97 {
98  public:
99 
102  QRResponse() :
103  m_messageIDRespondedTo(0),
104  m_affectedSOPClassUID(),
105  m_dataset(NULL),
106  m_status(0),
107  m_statusDetail(NULL) {}
108 
111  virtual ~QRResponse() { delete m_dataset; delete m_statusDetail; }
112 
115  Uint16 m_messageIDRespondedTo;
116 
119  OFString m_affectedSOPClassUID;
120 
128  DcmDataset *m_dataset;
129 
131  Uint16 m_status;
132 
136  DcmDataset *m_statusDetail;
137 
138 private:
139 
143  QRResponse(const QRResponse &other);
144 
149  QRResponse &operator=(const QRResponse &other);
150 };
151 
152 
154 class RetrieveResponse : public QRResponse
155 {
156 public:
159  RetrieveResponse() :
160  m_numberOfRemainingSubops(0),
161  m_numberOfCompletedSubops(0),
162  m_numberOfFailedSubops(0),
163  m_numberOfWarningSubops(0) {}
164 
167  virtual ~RetrieveResponse() {}
168 
171  void print();
172 
176  Uint16 m_numberOfRemainingSubops;
177 
181  Uint16 m_numberOfCompletedSubops;
182 
186  Uint16 m_numberOfFailedSubops;
187 
191  Uint16 m_numberOfWarningSubops;
192 
193 private:
194 
198  RetrieveResponse(const RetrieveResponse &other);
199 
204  RetrieveResponse &operator=(const RetrieveResponse &other);
205 };
206 
207 
214 class DcmSCU
215 {
216 
217 public:
218 
221  DcmSCU();
222 
225  virtual ~DcmSCU();
226 
234  OFCondition addPresentationContext(const OFString &abstractSyntax,
235  const OFList<OFString> &xferSyntaxes,
236  const T_ASC_SC_ROLE role = ASC_SC_ROLE_DEFAULT);
237 
243  virtual OFCondition initNetwork();
244 
251  virtual OFCondition negotiateAssociation();
252 
260  T_ASC_PresentationContextID findPresentationContextID(const OFString &abstractSyntax,
261  const OFString &transferSyntax);
262 
276  T_ASC_PresentationContextID findAnyPresentationContextID(const OFString &abstractSyntax,
277  const OFString &transferSyntax);
278 
285  virtual OFCondition sendECHORequest(const T_ASC_PresentationContextID presID);
286 
309  virtual OFCondition sendSTORERequest(const T_ASC_PresentationContextID presID,
310  const OFString &dicomFile,
311  DcmDataset *dataset,
312  Uint16 &rspStatusCode);
313 
338  virtual OFCondition sendMOVERequest(const T_ASC_PresentationContextID presID,
339  const OFString &moveDestinationAETitle,
340  DcmDataset *dataset,
341  OFList<RetrieveResponse*> *responses);
342 
363  virtual OFCondition handleMOVEResponse(const T_ASC_PresentationContextID presID,
364  RetrieveResponse *response,
365  OFBool &waitForNextResponse);
366 
385  virtual OFCondition sendCGETRequest(const T_ASC_PresentationContextID presID,
386  DcmDataset *dataset,
387  OFList<RetrieveResponse*> *responses);
388 
412  virtual OFCondition handleCGETSession(const T_ASC_PresentationContextID presID,
413  DcmDataset *dataset,
414  OFList<RetrieveResponse*> *responses);
415 
427  virtual OFCondition handleCGETResponse(const T_ASC_PresentationContextID presID,
428  RetrieveResponse* response,
429  OFBool &continueCGETSession);
430 
443  virtual OFCondition handleSTORERequest(const T_ASC_PresentationContextID presID,
444  DcmDataset *incomingObject,
445  OFBool &continueCGETSession,
446  Uint16 &cStoreReturnStatus);
447 
457  virtual OFCondition handleSTORERequestFile(T_ASC_PresentationContextID *presID,
458  const OFString &filename,
459  T_DIMSE_C_StoreRQ *request);
460 
482  virtual OFCondition sendFINDRequest(const T_ASC_PresentationContextID presID,
483  DcmDataset *queryKeys,
484  OFList<QRResponse*> *responses);
485 
505  virtual OFCondition handleFINDResponse(const T_ASC_PresentationContextID presID,
506  QRResponse *response,
507  OFBool &waitForNextResponse);
508 
517  virtual OFCondition sendCANCELRequest(const T_ASC_PresentationContextID presID);
518 
531  virtual OFCondition sendACTIONRequest(const T_ASC_PresentationContextID presID,
532  const OFString &sopInstanceUID,
533  const Uint16 actionTypeID,
534  DcmDataset *reqDataset,
535  Uint16 &rspStatusCode);
536 
548  virtual OFCondition sendEVENTREPORTRequest(const T_ASC_PresentationContextID presID,
549  const OFString &sopInstanceUID,
550  const Uint16 eventTypeID,
551  DcmDataset *reqDataset,
552  Uint16 &rspStatusCode);
553 
564  virtual OFCondition handleEVENTREPORTRequest(DcmDataset *&reqDataset,
565  Uint16 &eventTypeID,
566  const int timeout = 0);
567 
571  virtual void closeAssociation(const DcmCloseAssociationType closeType);
572 
573  /* Set methods */
574 
578  void setMaxReceivePDULength(const unsigned long maxRecPDU);
579 
583  void setDIMSEBlockingMode(const T_DIMSE_BlockingMode blockingMode);
584 
588  void setAETitle(const OFString &myAETtitle);
589 
593  void setPeerHostName(const OFString &peerHostName);
594 
598  void setPeerAETitle(const OFString &peerAETitle);
599 
603  void setPeerPort(const Uint16 peerPort);
604 
610  void setDIMSETimeout(const Uint32 dimseTimeout);
611 
616  void setACSETimeout(const Uint32 acseTimeout);
617 
622  void setAssocConfigFileAndProfile(const OFString &filename,
623  const OFString &profile);
624 
631  void setStorageDir(const OFString &storeDir);
632 
636  void setStorageMode(const DcmStorageMode storageMode);
637 
642  void setVerbosePCMode(const OFBool mode);
643 
649  void setDatasetConversionMode(const OFBool mode);
650 
656  void setProgressNotificationMode(const OFBool mode);
657 
658  /* Get methods */
659 
663  OFBool isConnected() const;
664 
668  Uint32 getMaxReceivePDULength() const;
669 
673  T_DIMSE_BlockingMode getDIMSEBlockingMode() const;
674 
678  const OFString &getAETitle() const;
679 
683  const OFString &getPeerHostName() const;
684 
688  const OFString &getPeerAETitle() const;
689 
693  Uint16 getPeerPort() const;
694 
698  Uint32 getDIMSETimeout() const;
699 
704  Uint32 getACSETimeout() const;
705 
711  OFString getStorageDir() const;
712 
716  DcmStorageMode getStorageMode() const;
717 
725  OFBool getVerbosePCMode() const;
726 
732  OFBool getDatasetConversionMode() const;
733 
739  OFBool getProgressNotificationMode() const;
740 
744  OFBool getTLSEnabled() const;
745 
747  void freeNetwork();
748 
749 protected:
750 
762  OFCondition sendDIMSEMessage(const T_ASC_PresentationContextID presID,
763  T_DIMSE_Message *msg,
764  DcmDataset *dataObject,
765  DcmDataset **commandSet = NULL);
766 
777  OFCondition getDatasetInfo(DcmDataset *dataset,
778  OFString &sopClassUID,
779  OFString &sopInstanceUID,
780  E_TransferSyntax &transferSyntax);
781 
786  OFCondition useSecureConnection(DcmTransportLayer *tlayer);
787 
809  OFCondition receiveDIMSECommand(T_ASC_PresentationContextID *presID,
810  T_DIMSE_Message *msg,
811  DcmDataset **statusDetail,
812  DcmDataset **commandSet = NULL,
813  const Uint32 timeout = 0);
814 
824  OFCondition receiveDIMSEDataset(T_ASC_PresentationContextID *presID,
825  DcmDataset **dataObject);
826 
830  void clearPresentationContexts();
831 
840  void findPresentationContext(const T_ASC_PresentationContextID presID,
841  OFString &abstractSyntax,
842  OFString &transferSyntax);
843 
844  /* ***********************************************************************
845  * Functions particularly interesting for overwriting in derived classes
846  * *********************************************************************** */
847 
856  virtual void notifyInstanceStored(const OFString &filename,
857  const OFString &sopClassUID,
858  const OFString &sopInstanceUID) const;
859 
867  virtual void notifySENDProgress(const unsigned long byteCount);
868 
876  virtual void notifyRECEIVEProgress(const unsigned long byteCount);
877 
888  virtual Uint16 checkEVENTREPORTRequest(T_DIMSE_N_EventReportRQ &request,
889  DcmDataset *reqDataset);
890 
898  virtual OFCondition sendSTOREResponse(T_ASC_PresentationContextID presID,
899  Uint16 status,
900  const T_DIMSE_C_StoreRQ &request);
901 
912  virtual OFString createStorageFilename(DcmDataset *dataset);
913 
920  virtual OFCondition ignoreSTORERequest(T_ASC_PresentationContextID presID,
921  const T_DIMSE_C_StoreRQ &request);
922 
923  /* Callback functions (static) */
924 
929  static void callbackSENDProgress(void *callbackContext,
930  unsigned long byteCount);
931 
936  static void callbackRECEIVEProgress(void *callbackContext,
937  unsigned long byteCount);
938 
939 private:
940 
944  DcmSCU(const DcmSCU &src);
945 
950  DcmSCU &operator=(const DcmSCU &src);
951 
953  T_ASC_Association *m_assoc;
954 
956  T_ASC_Network *m_net;
957 
959  T_ASC_Parameters *m_params;
960 
962  OFString m_assocConfigFilename;
963 
965  OFString m_assocConfigProfile;
966 
969  struct DcmSCUPresContext {
972  DcmSCUPresContext()
973  : abstractSyntaxName()
974  , transferSyntaxes()
975  , roleSelect(ASC_SC_ROLE_DEFAULT)
976  {
977  }
979  OFString abstractSyntaxName;
981  OFList<OFString> transferSyntaxes;
983  T_ASC_SC_ROLE roleSelect;
984  };
985 
987  OFList<DcmSCUPresContext> m_presContexts;
988 
990  OFString m_assocConfigFile;
991 
993  T_DIMSE_Message *m_openDIMSERequest;
994 
996  Uint32 m_maxReceivePDULength;
997 
999  T_DIMSE_BlockingMode m_blockMode;
1000 
1002  OFString m_ourAETitle;
1003 
1005  OFString m_peer;
1006 
1008  OFString m_peerAETitle;
1009 
1011  Uint16 m_peerPort;
1012 
1014  Uint32 m_dimseTimeout;
1015 
1017  Uint32 m_acseTimeout;
1018 
1022  OFString m_storageDir;
1023 
1030  DcmStorageMode m_storageMode;
1031 
1033  OFBool m_verbosePCMode;
1034 
1036  OFBool m_datasetConversionMode;
1037 
1039  OFBool m_progressNotificationMode;
1040 
1044  Uint16 nextMessageID();
1045 };
1046 
1047 #endif // DCMTK 3.6.0
1048 
1049 #endif // SCU_H