comparison OrthancServer/DicomProtocol/DicomUserConnection.cpp @ 2069:fabf7820d1f1

New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 13 Jul 2016 16:52:39 +0200
parents 655489d9165d
children b9bd52c72ba2
comparison
equal deleted inserted replaced
2068:879f3be759ef 2069:fabf7820d1f1
131 static const unsigned int MAXIMUM_STORAGE_SOP_CLASSES = 64; 131 static const unsigned int MAXIMUM_STORAGE_SOP_CLASSES = 64;
132 132
133 133
134 namespace Orthanc 134 namespace Orthanc
135 { 135 {
136 // By default, the timeout for DICOM SCU (client) connections is set to 10 seconds
137 static uint32_t defaultTimeout_ = 10;
138
136 struct DicomUserConnection::PImpl 139 struct DicomUserConnection::PImpl
137 { 140 {
138 // Connection state 141 // Connection state
139 uint32_t dimseTimeout_; 142 uint32_t dimseTimeout_;
140 uint32_t acseTimeout_; 143 uint32_t acseTimeout_;
780 remoteHost_("127.0.0.1") 783 remoteHost_("127.0.0.1")
781 { 784 {
782 remotePort_ = 104; 785 remotePort_ = 104;
783 manufacturer_ = ModalityManufacturer_Generic; 786 manufacturer_ = ModalityManufacturer_Generic;
784 787
785 SetTimeout(10); 788 SetTimeout(defaultTimeout_);
786 pimpl_->net_ = NULL; 789 pimpl_->net_ = NULL;
787 pimpl_->params_ = NULL; 790 pimpl_->params_ = NULL;
788 pimpl_->assoc_ = NULL; 791 pimpl_->assoc_ = NULL;
789 792
790 // SOP classes for C-ECHO, C-FIND and C-MOVE (**) 793 // SOP classes for C-ECHO, C-FIND and C-MOVE (**)
1100 } 1103 }
1101 1104
1102 1105
1103 void DicomUserConnection::SetTimeout(uint32_t seconds) 1106 void DicomUserConnection::SetTimeout(uint32_t seconds)
1104 { 1107 {
1105 if (seconds <= 0) 1108 if (seconds == 0)
1106 { 1109 {
1107 throw OrthancException(ErrorCode_ParameterOutOfRange); 1110 DisableTimeout();
1108 } 1111 }
1109 1112 else
1110 dcmConnectionTimeout.set(seconds); 1113 {
1111 pimpl_->dimseTimeout_ = seconds; 1114 dcmConnectionTimeout.set(seconds);
1112 pimpl_->acseTimeout_ = 10; 1115 pimpl_->dimseTimeout_ = seconds;
1116 pimpl_->acseTimeout_ = 10; // Timeout used during association negociation
1117 }
1113 } 1118 }
1114 1119
1115 1120
1116 void DicomUserConnection::DisableTimeout() 1121 void DicomUserConnection::DisableTimeout()
1117 { 1122 {
1119 * Global timeout (seconds) for connecting to remote hosts. 1124 * Global timeout (seconds) for connecting to remote hosts.
1120 * Default value is -1 which selects infinite timeout, i.e. blocking connect(). 1125 * Default value is -1 which selects infinite timeout, i.e. blocking connect().
1121 */ 1126 */
1122 dcmConnectionTimeout.set(-1); 1127 dcmConnectionTimeout.set(-1);
1123 pimpl_->dimseTimeout_ = 0; 1128 pimpl_->dimseTimeout_ = 0;
1124 pimpl_->acseTimeout_ = 10; 1129 pimpl_->acseTimeout_ = 10; // Timeout used during association negociation
1125 } 1130 }
1126 1131
1127 1132
1128 void DicomUserConnection::CheckStorageSOPClassesInvariant() const 1133 void DicomUserConnection::CheckStorageSOPClassesInvariant() const
1129 { 1134 {
1189 DcmDataset* dataset = query.GetDcmtkObject().getDataset(); 1194 DcmDataset* dataset = query.GetDcmtkObject().getDataset();
1190 const char* sopClass = UID_FINDModalityWorklistInformationModel; 1195 const char* sopClass = UID_FINDModalityWorklistInformationModel;
1191 1196
1192 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, true, NULL, pimpl_->dimseTimeout_); 1197 ExecuteFind(result, pimpl_->assoc_, dataset, sopClass, true, NULL, pimpl_->dimseTimeout_);
1193 } 1198 }
1199
1200
1201 void DicomUserConnection::SetDefaultTimeout(uint32_t seconds)
1202 {
1203 LOG(INFO) << "Default timeout for DICOM connections if Orthanc acts as SCU (client): "
1204 << seconds << " seconds (0 = no timeout)";
1205 defaultTimeout_ = seconds;
1206 }
1194 } 1207 }