annotate OrthancFramework/Sources/DicomNetworking/DicomStoreUserConnection.cpp @ 5338:78c59b02b121

accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 28 Jun 2023 08:29:43 +0200
parents 742448a9b600
children 3c8286e5d07b 7a20ee948676
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
5185
0ea402b4d901 upgrade to year 2023
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4870
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
0ea402b4d901 upgrade to year 2023
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4870
diff changeset
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 *
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
9 * modify it under the terms of the GNU Lesser General Public License
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
10 * as published by the Free Software Foundation, either version 3 of
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
11 * the License, or (at your option) any later version.
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
16 * Lesser General Public License for more details.
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 *
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
19 * License along with this program. If not, see
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
20 * <http://www.gnu.org/licenses/>.
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "../PrecompiledHeaders.h"
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 #include "DicomStoreUserConnection.h"
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
27 #include "../DicomParsing/FromDcmtkBridge.h"
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
28 #include "../DicomParsing/ParsedDicomFile.h"
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
29 #include "../Logging.h"
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
30 #include "../OrthancException.h"
3826
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
31 #include "DicomAssociation.h"
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
32
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
33 #include <dcmtk/dcmdata/dcdeftag.h>
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
34
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
35 #include <list>
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
36
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 namespace Orthanc
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 {
4281
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
40 static void ProgressCallback(void * /*callbackData*/,
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
41 T_DIMSE_StoreProgress *progress,
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
42 T_DIMSE_C_StoreRQ * req)
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
43 {
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
44 if (req != NULL &&
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
45 progress->state == DIMSE_StoreBegin)
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
46 {
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
47 OFString str;
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
48 CLOG(TRACE, DICOM) << "Sending Store Request:" << std::endl
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
49 << DIMSE_dumpMessage(str, *req, DIMSE_OUTGOING);
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
50 }
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
51 }
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
52
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
53
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 bool DicomStoreUserConnection::ProposeStorageClass(const std::string& sopClassUid,
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
55 const std::set<DicomTransferSyntax>& sourceSyntaxes,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
56 bool hasPreferred,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
57 DicomTransferSyntax preferred)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
59 typedef std::list< std::set<DicomTransferSyntax> > GroupsOfSyntaxes;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
60
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
61 GroupsOfSyntaxes groups;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
62
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
63 // Firstly, add one group for each individual transfer syntax
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
64 for (std::set<DicomTransferSyntax>::const_iterator
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
65 it = sourceSyntaxes.begin(); it != sourceSyntaxes.end(); ++it)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
66 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
67 std::set<DicomTransferSyntax> group;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
68 group.insert(*it);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
69 groups.push_back(group);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
70 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
71
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
72 // Secondly, add one group with the preferred transfer syntax
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
73 if (hasPreferred &&
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
74 sourceSyntaxes.find(preferred) == sourceSyntaxes.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
75 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
76 std::set<DicomTransferSyntax> group;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
77 group.insert(preferred);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
78 groups.push_back(group);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
79 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
80
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
81 // Thirdly, add all the uncompressed transfer syntaxes as one single group
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
82 if (proposeUncompressedSyntaxes_)
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
83 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
84 static const size_t N = 3;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
85 static const DicomTransferSyntax UNCOMPRESSED_SYNTAXES[N] = {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
86 DicomTransferSyntax_LittleEndianImplicit,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
87 DicomTransferSyntax_LittleEndianExplicit,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
88 DicomTransferSyntax_BigEndianExplicit
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
89 };
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
90
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
91 std::set<DicomTransferSyntax> group;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
92
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
93 for (size_t i = 0; i < N; i++)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
94 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
95 DicomTransferSyntax syntax = UNCOMPRESSED_SYNTAXES[i];
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
96 if (sourceSyntaxes.find(syntax) == sourceSyntaxes.end() &&
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
97 (!hasPreferred || preferred != syntax))
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
98 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
99 group.insert(syntax);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
100 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
101 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
102
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
103 if (!group.empty())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
104 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
105 groups.push_back(group);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
106 }
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
107 }
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
108
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
109 // Now, propose each of these groups of transfer syntaxes
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
110 if (association_->GetRemainingPropositions() <= groups.size())
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 return false; // Not enough room
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 }
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
114 else
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
116 for (GroupsOfSyntaxes::const_iterator it = groups.begin(); it != groups.end(); ++it)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
118 association_->ProposePresentationContext(sopClassUid, *it);
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
119
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
120 // Remember the syntaxes that were individually proposed, in
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
121 // order to avoid renegociation if they are seen again (**)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
122 if (it->size() == 1)
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
123 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
124 DicomTransferSyntax syntax = *it->begin();
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
125 proposedOriginalClasses_.insert(std::make_pair(sopClassUid, syntax));
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
126 }
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
129 return true;
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
130 }
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 bool DicomStoreUserConnection::LookupPresentationContext(
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 uint8_t& presentationContextId,
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 const std::string& sopClassUid,
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 DicomTransferSyntax transferSyntax)
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 typedef std::map<DicomTransferSyntax, uint8_t> PresentationContexts;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 PresentationContexts pc;
3826
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
142 if (association_->IsOpen() &&
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
143 association_->LookupAcceptedPresentationContext(pc, sopClassUid))
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 PresentationContexts::const_iterator found = pc.find(transferSyntax);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 if (found != pc.end())
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 presentationContextId = found->second;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 return true;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 return false;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 }
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
155
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
156
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
157 DicomStoreUserConnection::DicomStoreUserConnection(
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 const DicomAssociationParameters& params) :
3874
2effa961f67f forcing use of DicomAssociationParameters if creating an SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3868
diff changeset
159 parameters_(params),
2effa961f67f forcing use of DicomAssociationParameters if creating an SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3868
diff changeset
160 association_(new DicomAssociation),
2effa961f67f forcing use of DicomAssociationParameters if creating an SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3868
diff changeset
161 proposeCommonClasses_(true),
2effa961f67f forcing use of DicomAssociationParameters if creating an SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3868
diff changeset
162 proposeUncompressedSyntaxes_(true),
2effa961f67f forcing use of DicomAssociationParameters if creating an SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3868
diff changeset
163 proposeRetiredBigEndian_(false)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 }
4296
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
166
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
167 const DicomAssociationParameters &DicomStoreUserConnection::GetParameters() const
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
168 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
169 return parameters_;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
170 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
171
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
172 void DicomStoreUserConnection::SetCommonClassesProposed(bool proposed)
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
173 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
174 proposeCommonClasses_ = proposed;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
175 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
176
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
177 bool DicomStoreUserConnection::IsCommonClassesProposed() const
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
178 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
179 return proposeCommonClasses_;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
180 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
181
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
182 void DicomStoreUserConnection::SetUncompressedSyntaxesProposed(bool proposed)
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
183 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
184 proposeUncompressedSyntaxes_ = proposed;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
185 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
186
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
187 bool DicomStoreUserConnection::IsUncompressedSyntaxesProposed() const
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
188 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
189 return proposeUncompressedSyntaxes_;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
190 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
191
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
192 void DicomStoreUserConnection::SetRetiredBigEndianProposed(bool propose)
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
193 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
194 proposeRetiredBigEndian_ = propose;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
195 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
196
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
197 bool DicomStoreUserConnection::IsRetiredBigEndianProposed() const
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
198 {
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
199 return proposeRetiredBigEndian_;
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
200 }
3b70a2e6a06c moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4284
diff changeset
201
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
203 void DicomStoreUserConnection::RegisterStorageClass(const std::string& sopClassUid,
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
204 DicomTransferSyntax syntax)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 {
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
206 RegisteredClasses::iterator found = registeredClasses_.find(sopClassUid);
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
208 if (found == registeredClasses_.end())
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 std::set<DicomTransferSyntax> ts;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 ts.insert(syntax);
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
212 registeredClasses_[sopClassUid] = ts;
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 else
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 found->second.insert(syntax);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
221 void DicomStoreUserConnection::LookupParameters(std::string& sopClassUid,
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
222 std::string& sopInstanceUid,
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
223 DicomTransferSyntax& transferSyntax,
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
224 DcmFileFormat& dicom)
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
225 {
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
226 if (dicom.getDataset() == NULL)
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
227 {
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
228 throw OrthancException(ErrorCode_InternalError);
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
229 }
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
230
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
231 OFString a, b;
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
232 if (!dicom.getDataset()->findAndGetOFString(DCM_SOPClassUID, a).good() ||
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
233 !dicom.getDataset()->findAndGetOFString(DCM_SOPInstanceUID, b).good())
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
234 {
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
235 throw OrthancException(ErrorCode_NoSopClassOrInstance,
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
236 "Unable to determine the SOP class/instance for C-STORE with AET " +
3875
ea1d32861cfc moving timeout from DicomAssocation to DicomAssociationParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3874
diff changeset
237 parameters_.GetRemoteModality().GetApplicationEntityTitle());
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
238 }
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
239
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
240 sopClassUid.assign(a.c_str());
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
241 sopInstanceUid.assign(b.c_str());
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
242
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
243 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(transferSyntax, dicom))
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
244 {
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
245 throw OrthancException(ErrorCode_InternalError,
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
246 "Unknown transfer syntax from DCMTK");
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
247 }
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
248 }
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
249
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
250
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 bool DicomStoreUserConnection::NegotiatePresentationContext(
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 uint8_t& presentationContextId,
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 const std::string& sopClassUid,
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
254 DicomTransferSyntax transferSyntax,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
255 bool hasPreferred,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
256 DicomTransferSyntax preferred)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 * Step 1: Check whether this presentation context is already
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
260 * available in the previously negotiated assocation.
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 if (LookupPresentationContext(presentationContextId, sopClassUid, transferSyntax))
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 return true;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 // The association must be re-negotiated
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
269 if (association_->IsOpen())
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
270 {
4284
756126cd2219 moving all logs from DicomNetworking folder into the "dicom" category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4281
diff changeset
271 CLOG(INFO, DICOM) << "Re-negotiating DICOM association with "
756126cd2219 moving all logs from DicomNetworking folder into the "dicom" category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4281
diff changeset
272 << parameters_.GetRemoteModality().GetApplicationEntityTitle();
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
273
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
274 // Don't renegociate if we know that the remote modality was
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
275 // already proposed this individual transfer syntax (**)
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
276 if (proposedOriginalClasses_.find(std::make_pair(sopClassUid, transferSyntax)) !=
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
277 proposedOriginalClasses_.end())
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
278 {
4284
756126cd2219 moving all logs from DicomNetworking folder into the "dicom" category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4281
diff changeset
279 CLOG(INFO, DICOM) << "The remote modality has already rejected SOP class UID \""
756126cd2219 moving all logs from DicomNetworking folder into the "dicom" category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4281
diff changeset
280 << sopClassUid << "\" with transfer syntax \""
756126cd2219 moving all logs from DicomNetworking folder into the "dicom" category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4281
diff changeset
281 << GetTransferSyntaxUid(transferSyntax) << "\", don't renegotiate";
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
282 return false;
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
283 }
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
284 }
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
285
3826
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
286 association_->ClearPresentationContexts();
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
287 proposedOriginalClasses_.clear();
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
288 RegisterStorageClass(sopClassUid, transferSyntax); // (*)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
290
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
291 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
292 * Step 2: Propose at least the mandatory SOP class.
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
293 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
294
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 {
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
296 RegisteredClasses::const_iterator mandatory = registeredClasses_.find(sopClassUid);
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
297
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
298 if (mandatory == registeredClasses_.end() ||
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
299 mandatory->second.find(transferSyntax) == mandatory->second.end())
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
300 {
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
301 // Should never fail because of (*)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
302 throw OrthancException(ErrorCode_InternalError);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
303 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
304
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
305 if (!ProposeStorageClass(sopClassUid, mandatory->second, hasPreferred, preferred))
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
306 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
307 // Should never happen in real life: There are no more than
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
308 // 128 transfer syntaxes in DICOM!
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
309 throw OrthancException(ErrorCode_InternalError,
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
310 "Too many transfer syntaxes for SOP class UID: " + sopClassUid);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
311 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
312 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
313
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
315 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
316 * Step 3: Propose all the previously spotted SOP classes, as
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
317 * registered through the "RegisterStorageClass()" method.
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
320 for (RegisteredClasses::const_iterator it = registeredClasses_.begin();
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
321 it != registeredClasses_.end(); ++it)
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
322 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
323 if (it->first != sopClassUid)
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
325 ProposeStorageClass(it->first, it->second, hasPreferred, preferred);
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
329
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 * Step 4: As long as there is room left in the proposed
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332 * presentation contexts, propose the uncompressed transfer syntaxes
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 * for the most common SOP classes, as can be found in the
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334 * "dcmShortSCUStorageSOPClassUIDs" array from DCMTK. The
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 * preferred transfer syntax is "LittleEndianImplicit".
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 if (proposeCommonClasses_)
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 {
3868
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
340 // The method "ProposeStorageClass()" will automatically add
d5be23fc0106 better negotiation of transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3862
diff changeset
341 // "LittleEndianImplicit"
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
342 std::set<DicomTransferSyntax> ts;
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
343
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 for (int i = 0; i < numberOfDcmShortSCUStorageSOPClassUIDs; i++)
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
345 {
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
346 std::string c(dcmShortSCUStorageSOPClassUIDs[i]);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
347
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
348 if (c != sopClassUid &&
3879
a18b34dec94a reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3875
diff changeset
349 registeredClasses_.find(c) == registeredClasses_.end())
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
351 ProposeStorageClass(c, ts, hasPreferred, preferred);
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
352 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
353 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 }
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
357 /**
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358 * Step 5: Open the association, and check whether the pair (SOP
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359 * class UID, transfer syntax) was accepted by the remote host.
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360 **/
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
361
3826
e82bd07c384e putting DicomAssociation behind pimpl
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3825
diff changeset
362 association_->Open(parameters_);
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 return LookupPresentationContext(presentationContextId, sopClassUid, transferSyntax);
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364 }
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
365
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
366
3881
f23ab7829a8d reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3880
diff changeset
367 void DicomStoreUserConnection::Store(std::string& sopClassUid,
f23ab7829a8d reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3880
diff changeset
368 std::string& sopInstanceUid,
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
369 DcmFileFormat& dicom,
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
370 bool hasMoveOriginator,
3881
f23ab7829a8d reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3880
diff changeset
371 const std::string& moveOriginatorAET,
f23ab7829a8d reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3880
diff changeset
372 uint16_t moveOriginatorID)
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
373 {
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
374 DicomTransferSyntax transferSyntax;
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
375 LookupParameters(sopClassUid, sopInstanceUid, transferSyntax, dicom);
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
376
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
377 uint8_t presID;
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
378 if (!NegotiatePresentationContext(presID, sopClassUid, transferSyntax, proposeUncompressedSyntaxes_,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
379 DicomTransferSyntax_LittleEndianExplicit))
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
380 {
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
381 throw OrthancException(ErrorCode_NetworkProtocol,
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
382 "No valid presentation context was negotiated for "
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
383 "SOP class UID [" + sopClassUid + "] and transfer "
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
384 "syntax [" + GetTransferSyntaxUid(transferSyntax) + "] "
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
385 "while sending to modality [" +
3875
ea1d32861cfc moving timeout from DicomAssocation to DicomAssociationParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3874
diff changeset
386 parameters_.GetRemoteModality().GetApplicationEntityTitle() + "]");
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
387 }
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
388
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
389 // Prepare the transmission of data
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
390 T_DIMSE_C_StoreRQ request;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
391 memset(&request, 0, sizeof(request));
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
392 request.MessageID = association_->GetDcmtkAssociation().nextMsgID++;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
393 strncpy(request.AffectedSOPClassUID, sopClassUid.c_str(), DIC_UI_LEN);
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
394 request.Priority = DIMSE_PRIORITY_MEDIUM;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
395 request.DataSetType = DIMSE_DATASET_PRESENT;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
396 strncpy(request.AffectedSOPInstanceUID, sopInstanceUid.c_str(), DIC_UI_LEN);
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
397
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
398 if (hasMoveOriginator)
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
399 {
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
400 strncpy(request.MoveOriginatorApplicationEntityTitle,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
401 moveOriginatorAET.c_str(), DIC_AE_LEN);
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
402 request.opts = O_STORE_MOVEORIGINATORAETITLE;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
403
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
404 request.MoveOriginatorID = moveOriginatorID; // The type DIC_US is an alias for uint16_t
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
405 request.opts |= O_STORE_MOVEORIGINATORID;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
406 }
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
407
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
408 if (dicom.getDataset() == NULL)
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
409 {
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
410 throw OrthancException(ErrorCode_InternalError);
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
411 }
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
412
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
413 // Finally conduct transmission of data
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
414 T_DIMSE_C_StoreRSP response;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
415 DcmDataset* statusDetail = NULL;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
416 DicomAssociation::CheckCondition(
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
417 DIMSE_storeUser(&association_->GetDcmtkAssociation(), presID, &request,
4281
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
418 NULL, dicom.getDataset(), ProgressCallback, NULL,
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
419 /*opt_blockMode*/ (GetParameters().HasTimeout() ? DIMSE_NONBLOCKING : DIMSE_BLOCKING),
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
420 /*opt_dimse_timeout*/ GetParameters().GetTimeout(),
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
421 &response, &statusDetail, NULL),
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
422 GetParameters(), "C-STORE");
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
423
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
424 if (statusDetail != NULL)
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
425 {
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
426 delete statusDetail;
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
427 }
4281
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
428
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
429 {
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
430 OFString str;
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
431 CLOG(TRACE, DICOM) << "Received Store Response:" << std::endl
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
432 << DIMSE_dumpMessage(str, response, DIMSE_INCOMING, NULL, presID);
d2f79a475b51 debug log for DCMTK SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
433 }
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
434
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
435 /**
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
436 * New in Orthanc 1.6.0: Deal with failures during C-STORE.
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
437 * http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_B.2.3.html#table_B.2-1
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
438 **/
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
439
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
440 if (response.DimseStatus != 0x0000 && // Success
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
441 response.DimseStatus != 0xB000 && // Warning - Coercion of Data Elements
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
442 response.DimseStatus != 0xB007 && // Warning - Data Set does not match SOP Class
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
443 response.DimseStatus != 0xB006) // Warning - Elements Discarded
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
444 {
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
445 char buf[16];
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
446 sprintf(buf, "%04X", response.DimseStatus);
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
447 throw OrthancException(ErrorCode_NetworkProtocol,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
448 "C-STORE SCU to AET \"" +
3875
ea1d32861cfc moving timeout from DicomAssocation to DicomAssociationParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3874
diff changeset
449 GetParameters().GetRemoteModality().GetApplicationEntityTitle() +
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
450 "\" has failed with DIMSE status 0x" + buf);
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
451 }
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
452 }
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
453
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
454
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
455 void DicomStoreUserConnection::Store(std::string& sopClassUid,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
456 std::string& sopInstanceUid,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
457 const void* buffer,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
458 size_t size,
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
459 bool hasMoveOriginator,
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
460 const std::string& moveOriginatorAET,
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
461 uint16_t moveOriginatorID)
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
462 {
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
463 std::unique_ptr<DcmFileFormat> dicom(
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
464 FromDcmtkBridge::LoadFromMemoryBuffer(buffer, size));
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
465
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
466 if (dicom.get() == NULL)
3862
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
467 {
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
468 throw OrthancException(ErrorCode_InternalError);
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
469 }
594263db316a DicomModalityStoreJob now uses DicomStoreUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3831
diff changeset
470
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
471 Store(sopClassUid, sopInstanceUid, *dicom, hasMoveOriginator, moveOriginatorAET, moveOriginatorID);
3831
83ea6939293d starting DicomStoreUserConnection::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3826
diff changeset
472 }
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
473
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
474
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
475 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
3882
904575738462 implemented IDicomTranscoder::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3881
diff changeset
476 void DicomStoreUserConnection::LookupTranscoding(std::set<DicomTransferSyntax>& acceptedSyntaxes,
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
477 const std::string& sopClassUid,
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
478 DicomTransferSyntax sourceSyntax,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
479 bool hasPreferred,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
480 DicomTransferSyntax preferred)
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
481 {
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
482 acceptedSyntaxes.clear();
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
483
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
484 // Make sure a negotiation has already occurred for this transfer
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
485 // syntax. We don't use the return code: Transcoding is possible
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
486 // even if the "sourceSyntax" is not supported.
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
487 uint8_t presID;
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
488 NegotiatePresentationContext(presID, sopClassUid, sourceSyntax, hasPreferred, preferred);
3880
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
489
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
490 std::map<DicomTransferSyntax, uint8_t> contexts;
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
491 if (association_->LookupAcceptedPresentationContext(contexts, sopClassUid))
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
492 {
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
493 for (std::map<DicomTransferSyntax, uint8_t>::const_iterator
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
494 it = contexts.begin(); it != contexts.end(); ++it)
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
495 {
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
496 acceptedSyntaxes.insert(it->first);
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
497 }
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
498 }
cdd0cb5ec4e4 DicomStoreUserConnection::LookupTranscoding()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3879
diff changeset
499 }
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
500 #endif
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
501
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
502
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
503 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
504 void DicomStoreUserConnection::Transcode(std::string& sopClassUid /* out */,
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
505 std::string& sopInstanceUid /* out */,
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
506 IDicomTranscoder& transcoder,
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
507 const void* buffer,
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
508 size_t size,
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
509 DicomTransferSyntax preferredTransferSyntax,
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
510 bool hasMoveOriginator,
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
511 const std::string& moveOriginatorAET,
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
512 uint16_t moveOriginatorID)
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
513 {
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
514 std::unique_ptr<DcmFileFormat> dicom(FromDcmtkBridge::LoadFromMemoryBuffer(buffer, size));
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
515 if (dicom.get() == NULL ||
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
516 dicom->getDataset() == NULL)
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
517 {
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
518 throw OrthancException(ErrorCode_NullPointer);
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
519 }
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
520
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
521 DicomTransferSyntax sourceSyntax;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
522 LookupParameters(sopClassUid, sopInstanceUid, sourceSyntax, *dicom);
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
523
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
524 std::set<DicomTransferSyntax> accepted;
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
525 LookupTranscoding(accepted, sopClassUid, sourceSyntax, true, preferredTransferSyntax);
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
526
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
527 if (accepted.find(sourceSyntax) != accepted.end())
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
528 {
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
529 // No need for transcoding
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
530 Store(sopClassUid, sopInstanceUid, *dicom,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3893
diff changeset
531 hasMoveOriginator, moveOriginatorAET, moveOriginatorID);
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
532 }
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
533 else
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
534 {
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
535 // Transcoding is needed
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3907
diff changeset
536 IDicomTranscoder::DicomImage source;
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3907
diff changeset
537 source.AcquireParsed(dicom.release());
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3907
diff changeset
538 source.SetExternalBuffer(buffer, size);
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
539
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
540 const std::string sourceUid = IDicomTranscoder::GetSopInstanceUid(source.GetParsed());
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
541
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3907
diff changeset
542 IDicomTranscoder::DicomImage transcoded;
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
543 bool success = false;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
544 bool isDestructiveCompressionAllowed = false;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
545 std::set<DicomTransferSyntax> attemptedSyntaxes;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
546
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
547 if (accepted.find(preferredTransferSyntax) != accepted.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
548 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
549 // New in Orthanc 1.9.0: The preferred transfer syntax is
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
550 // accepted by the remote modality => transcode to this syntax
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
551 std::set<DicomTransferSyntax> targetSyntaxes;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
552 targetSyntaxes.insert(preferredTransferSyntax);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
553 attemptedSyntaxes.insert(preferredTransferSyntax);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
554
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
555 success = transcoder.Transcode(transcoded, source, targetSyntaxes, true);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
556 isDestructiveCompressionAllowed = true;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
557 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
558
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
559 if (!success)
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
560 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
561 // Transcode to either one of the uncompressed transfer
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
562 // syntaxes that are accepted by the remote modality
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
563
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
564 std::set<DicomTransferSyntax> targetSyntaxes;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
565
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
566 if (accepted.find(DicomTransferSyntax_LittleEndianImplicit) != accepted.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
567 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
568 targetSyntaxes.insert(DicomTransferSyntax_LittleEndianImplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
569 attemptedSyntaxes.insert(DicomTransferSyntax_LittleEndianImplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
570 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
571
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
572 if (accepted.find(DicomTransferSyntax_LittleEndianExplicit) != accepted.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
573 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
574 targetSyntaxes.insert(DicomTransferSyntax_LittleEndianExplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
575 attemptedSyntaxes.insert(DicomTransferSyntax_LittleEndianExplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
576 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
577
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
578 if (accepted.find(DicomTransferSyntax_BigEndianExplicit) != accepted.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
579 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
580 targetSyntaxes.insert(DicomTransferSyntax_BigEndianExplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
581 attemptedSyntaxes.insert(DicomTransferSyntax_BigEndianExplicit);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
582 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
583
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
584 if (!targetSyntaxes.empty())
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
585 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
586 success = transcoder.Transcode(transcoded, source, targetSyntaxes, false);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
587 isDestructiveCompressionAllowed = false;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
588 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
589 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
590
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
591 if (success)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
592 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
593 std::string targetUid = IDicomTranscoder::GetSopInstanceUid(transcoded.GetParsed());
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
594 if (sourceUid != targetUid)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
595 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
596 if (isDestructiveCompressionAllowed)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
597 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
598 LOG(WARNING) << "Because of the use of a preferred transfer syntax that corresponds to "
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
599 << "a destructive compression, C-STORE SCU has hanged the SOP Instance UID "
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
600 << "of a DICOM instance from \"" << sourceUid << "\" to \"" << targetUid << "\"";
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
601 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
602 else
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
603 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
604 throw OrthancException(ErrorCode_Plugin, "The transcoder has changed the SOP "
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
605 "Instance UID while transcoding to an uncompressed transfer syntax");
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
606 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
607 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
608
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
609 DicomTransferSyntax transcodedSyntax;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
610
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
611 // Sanity check
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
612 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(transcodedSyntax, transcoded.GetParsed()) ||
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
613 accepted.find(transcodedSyntax) == accepted.end())
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
614 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
615 throw OrthancException(ErrorCode_InternalError);
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
616 }
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
617 else
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
618 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
619 Store(sopClassUid, sopInstanceUid, transcoded.GetParsed(),
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
620 hasMoveOriginator, moveOriginatorAET, moveOriginatorID);
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
621 }
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
622 }
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
623 else
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
624 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
625 std::string s;
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
626 for (std::set<DicomTransferSyntax>::const_iterator
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
627 it = attemptedSyntaxes.begin(); it != attemptedSyntaxes.end(); ++it)
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
628 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
629 s += " " + std::string(GetTransferSyntaxUid(*it));
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
630 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
631
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
632 throw OrthancException(ErrorCode_NotImplemented, "Cannot transcode from " +
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
633 std::string(GetTransferSyntaxUid(sourceSyntax)) +
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
634 " to one of [" + s + " ]");
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
635 }
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
636 }
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3882
diff changeset
637 }
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
638 #endif
4466
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
639
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
640
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
641 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
4466
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
642 void DicomStoreUserConnection::Transcode(std::string& sopClassUid /* out */,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
643 std::string& sopInstanceUid /* out */,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
644 IDicomTranscoder& transcoder,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
645 const void* buffer,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
646 size_t size,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
647 bool hasMoveOriginator,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
648 const std::string& moveOriginatorAET,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
649 uint16_t moveOriginatorID)
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
650 {
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
651 Transcode(sopClassUid, sopInstanceUid, transcoder, buffer, size, DicomTransferSyntax_LittleEndianExplicit,
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
652 hasMoveOriginator, moveOriginatorAET, moveOriginatorID);
2243f1bb909b ABI compatibility for DicomStoreUserConnection::Transcode()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
653 }
5252
742448a9b600 allow compilation of DICOM networking without support for transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
654 #endif
3825
4570c57668a8 refactoring DicomUserConnection as Dicom[Control|Store]UserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 }