annotate OrthancServer/Sources/ServerContext.cpp @ 5811:a451777236fb attach-custom-data tip

advanced storage: fix + customizable path
author Alain Mazy <am@orthanc.team>
date Tue, 24 Sep 2024 17:52:45 +0200
parents 023a99146dd0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1860
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1285
diff changeset
4 * Department, University Hospital of Liege, Belgium
5640
f7adfb22e20e updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5529
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
f7adfb22e20e updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5529
diff changeset
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium
5485
48b8dae6dc77 upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5450
diff changeset
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 *
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * This program is free software: you can redistribute it and/or
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * modify it under the terms of the GNU General Public License as
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * published by the Free Software Foundation, either version 3 of the
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * License, or (at your option) any later version.
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 *
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful, but
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * General Public License for more details.
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 *
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 824
diff changeset
24 #include "PrecompiledHeadersServer.h"
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 #include "ServerContext.h"
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
27 #include "../../OrthancFramework/Sources/Cache/SharedArchive.h"
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
28 #include "../../OrthancFramework/Sources/DicomFormat/DicomElement.h"
4499
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
29 #include "../../OrthancFramework/Sources/DicomFormat/DicomStreamReader.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
30 #include "../../OrthancFramework/Sources/DicomParsing/DcmtkTranscoder.h"
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
31 #include "../../OrthancFramework/Sources/DicomParsing/DicomModification.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
32 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
4196
37310bb1cd30 Fix handling of "ModalitiesInStudy" (0008,0061) in C-FIND and "/tools/find"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4143
diff changeset
33 #include "../../OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
34 #include "../../OrthancFramework/Sources/FileStorage/StorageAccessor.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
35 #include "../../OrthancFramework/Sources/HttpServer/FilesystemHttpSender.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
36 #include "../../OrthancFramework/Sources/HttpServer/HttpStreamTranscoder.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
37 #include "../../OrthancFramework/Sources/JobsEngine/SetOfInstancesJob.h"
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
38 #include "../../OrthancFramework/Sources/Logging.h"
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
39 #include "../../OrthancFramework/Sources/MallocMemoryBuffer.h"
4045
05b8fd21089c fix path
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
40 #include "../../OrthancFramework/Sources/MetricsRegistry.h"
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
41 #include "../Plugins/Engine/OrthancPlugins.h"
3095
beeeb6096f27 removing dependencies upon ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3094
diff changeset
42
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
43 #include "OrthancConfiguration.h"
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
44 #include "OrthancRestApi/OrthancRestApi.h"
5682
fd4c5e064cbe started refactoring of ServerContext::Apply()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5670
diff changeset
45 #include "ResourceFinder.h"
3094
61da3c9b4121 cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3061
diff changeset
46 #include "Search/DatabaseLookup.h"
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
47 #include "ServerJobs/OrthancJobUnserializer.h"
397
941ea46e9e26 lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 394
diff changeset
48 #include "ServerToolbox.h"
3736
0540b54324f1 StorageCommitmentReports
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3713
diff changeset
49 #include "StorageCommitmentReports.h"
226
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
50
794
437c4a83d2cc refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 792
diff changeset
51 #include <dcmtk/dcmdata/dcfilefo.h>
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
52 #include <dcmtk/dcmnet/dimse.h>
5160
9f16979b6124 fix osx build
Alain Mazy <am@osimis.io>
parents: 5159
diff changeset
53
9f16979b6124 fix osx build
Alain Mazy <am@osimis.io>
parents: 5159
diff changeset
54 #if HAVE_MALLOC_TRIM == 1
9f16979b6124 fix osx build
Alain Mazy <am@osimis.io>
parents: 5159
diff changeset
55 # include <malloc.h>
9f16979b6124 fix osx build
Alain Mazy <am@osimis.io>
parents: 5159
diff changeset
56 #endif
1001
f3929718ea7e autorouting primitives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 998
diff changeset
57
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
58 static size_t DICOM_CACHE_SIZE = 128 * 1024 * 1024; // 128 MB
1001
f3929718ea7e autorouting primitives
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 998
diff changeset
59
285
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
60
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
61 /**
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
62 * IMPORTANT: We make the assumption that the same instance of
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
63 * FileStorage can be accessed from multiple threads. This seems OK
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
64 * since the filesystem implements the required locking mechanisms,
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
65 * but maybe a read-writer lock on the "FileStorage" could be
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
66 * useful. Conversely, "ServerIndex" already implements mutex-based
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
67 * locking.
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
68 **/
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
69
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 namespace Orthanc
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
72 static void ComputeStudyTags(ExpandedResource& resource,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
73 ServerContext& context,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
74 const std::string& studyPublicId,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
75 const std::set<DicomTag>& requestedTags);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
76
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
77
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
78 static bool IsUncompressedTransferSyntax(DicomTransferSyntax transferSyntax)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
79 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
80 return (transferSyntax == DicomTransferSyntax_LittleEndianImplicit ||
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
81 transferSyntax == DicomTransferSyntax_LittleEndianExplicit ||
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
82 transferSyntax == DicomTransferSyntax_BigEndianExplicit);
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
83 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
84
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
85
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
86 static bool IsTranscodableTransferSyntax(DicomTransferSyntax transferSyntax)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
87 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
88 return (
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
89 // Do not try to transcode DICOM videos (new in Orthanc 1.8.2)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
90 transferSyntax != DicomTransferSyntax_MPEG2MainProfileAtMainLevel &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
91 transferSyntax != DicomTransferSyntax_MPEG2MainProfileAtHighLevel &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
92 transferSyntax != DicomTransferSyntax_MPEG4HighProfileLevel4_1 &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
93 transferSyntax != DicomTransferSyntax_MPEG4BDcompatibleHighProfileLevel4_1 &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
94 transferSyntax != DicomTransferSyntax_MPEG4HighProfileLevel4_2_For2DVideo &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
95 transferSyntax != DicomTransferSyntax_MPEG4HighProfileLevel4_2_For3DVideo &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
96 transferSyntax != DicomTransferSyntax_MPEG4StereoHighProfileLevel4_2 &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
97 transferSyntax != DicomTransferSyntax_HEVCMainProfileLevel5_1 &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
98 transferSyntax != DicomTransferSyntax_HEVCMain10ProfileLevel5_1 &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
99
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
100 // Do not try to transcode special transfer syntaxes
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
101 transferSyntax != DicomTransferSyntax_RFC2557MimeEncapsulation &&
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
102 transferSyntax != DicomTransferSyntax_XML);
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
103 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
104
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
105
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
106 ServerContext::StoreResult::StoreResult() :
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
107 status_(StoreStatus_Failure),
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
108 cstoreStatusCode_(0)
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
109 {
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
110 }
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
111
5182
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
112
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
113 #if HAVE_MALLOC_TRIM == 1
5183
5ec3dcdf78b9 renamed HousekeeperThread as MemoryTrimmingThread to avoid confusion with Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5182
diff changeset
114 void ServerContext::MemoryTrimmingThread(ServerContext* that,
5346
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
115 unsigned int intervalInSeconds)
5152
c81f363d3aa3 housekeeper thread to call malloc_trim and give back memory to the system
Alain Mazy <am@osimis.io>
parents: 5149
diff changeset
116 {
5450
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
117 Logging::SetCurrentThreadName("MEMORY-TRIM");
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
118
5346
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
119 boost::posix_time::ptime lastExecution = boost::posix_time::second_clock::universal_time();
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
120
5183
5ec3dcdf78b9 renamed HousekeeperThread as MemoryTrimmingThread to avoid confusion with Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5182
diff changeset
121 // This thread is started only if malloc_trim is defined
5152
c81f363d3aa3 housekeeper thread to call malloc_trim and give back memory to the system
Alain Mazy <am@osimis.io>
parents: 5149
diff changeset
122 while (!that->done_)
c81f363d3aa3 housekeeper thread to call malloc_trim and give back memory to the system
Alain Mazy <am@osimis.io>
parents: 5149
diff changeset
123 {
5346
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
124 boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time();
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
125 boost::posix_time::time_duration elapsed = now - lastExecution;
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
126
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
127 if (elapsed.total_seconds() > intervalInSeconds)
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
128 {
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
129 // If possible, gives memory back to the system
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
130 // (see OrthancServer/Resources/ImplementationNotes/memory_consumption.txt)
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
131 {
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
132 MetricsRegistry::Timer timer(that->GetMetricsRegistry(), "orthanc_memory_trimming_duration_ms");
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
133 malloc_trim(128*1024);
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
134 }
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
135 lastExecution = boost::posix_time::second_clock::universal_time();
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
136 }
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
137
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
138 boost::this_thread::sleep(boost::posix_time::milliseconds(100));
5152
c81f363d3aa3 housekeeper thread to call malloc_trim and give back memory to the system
Alain Mazy <am@osimis.io>
parents: 5149
diff changeset
139 }
c81f363d3aa3 housekeeper thread to call malloc_trim and give back memory to the system
Alain Mazy <am@osimis.io>
parents: 5149
diff changeset
140 }
5182
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
141 #endif
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
142
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
143
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
144 void ServerContext::ChangeThread(ServerContext* that,
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
145 unsigned int sleepDelay)
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
146 {
5450
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
147 Logging::SetCurrentThreadName("CHANGES");
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
148
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
149 while (!that->done_)
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
150 {
3712
2a170a8f1faf replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3679
diff changeset
151 std::unique_ptr<IDynamicObject> obj(that->pendingChanges_.Dequeue(sleepDelay));
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
152
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
153 if (obj.get() != NULL)
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
154 {
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
155 const ServerIndexChange& change = dynamic_cast<const ServerIndexChange&>(*obj.get());
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
156
3947
cf6eb4fc6841 fix issue 179: use a shared mutex to avoid deadlock in python plugins
Alain Mazy <alain@mazy.be>
parents: 3945
diff changeset
157 boost::shared_lock<boost::shared_mutex> lock(that->listenersMutex_);
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
158 for (ServerListeners::iterator it = that->listeners_.begin();
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
159 it != that->listeners_.end(); ++it)
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
160 {
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
161 try
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
162 {
2134
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
163 try
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
164 {
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
165 it->GetListener().SignalChange(change);
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
166 }
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
167 catch (std::bad_alloc&)
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
168 {
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
169 LOG(ERROR) << "Not enough memory while signaling a change";
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
170 }
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
171 catch (...)
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
172 {
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
173 throw OrthancException(ErrorCode_InternalError, "Error while signaling a change");
2134
ddc75c6c712d Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2128
diff changeset
174 }
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
175 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
176 catch (OrthancException& e)
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
177 {
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
178 LOG(ERROR) << "Error in the " << it->GetDescription()
2135
cadfe0a2a393 fix in the sample basic plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2134
diff changeset
179 << " callback while signaling a change: " << e.What()
cadfe0a2a393 fix in the sample basic plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2134
diff changeset
180 << " (code " << e.GetErrorCode() << ")";
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
181 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
182 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
183 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
184 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
185 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
186
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
187
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
188 void ServerContext::JobEventsThread(ServerContext* that,
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
189 unsigned int sleepDelay)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
190 {
5450
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
191 Logging::SetCurrentThreadName("JOB-EVENTS");
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
192
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
193 while (!that->done_)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
194 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
195 std::unique_ptr<IDynamicObject> obj(that->pendingJobEvents_.Dequeue(sleepDelay));
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
196
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
197 if (obj.get() != NULL)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
198 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
199 const JobEvent& event = dynamic_cast<const JobEvent&>(*obj.get());
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
200
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
201 boost::shared_lock<boost::shared_mutex> lock(that->listenersMutex_);
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
202 for (ServerListeners::iterator it = that->listeners_.begin();
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
203 it != that->listeners_.end(); ++it)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
204 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
205 try
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
206 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
207 try
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
208 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
209 it->GetListener().SignalJobEvent(event);
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
210 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
211 catch (std::bad_alloc&)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
212 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
213 LOG(ERROR) << "Not enough memory while signaling a job event";
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
214 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
215 catch (...)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
216 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
217 throw OrthancException(ErrorCode_InternalError, "Error while signaling a job event");
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
218 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
219 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
220 catch (OrthancException& e)
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
221 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
222 LOG(ERROR) << "Error in the " << it->GetDescription()
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
223 << " callback while signaling a job event: " << e.What()
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
224 << " (code " << e.GetErrorCode() << ")";
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
225 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
226 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
227 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
228 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
229 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
230
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
231
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
232 void ServerContext::SaveJobsThread(ServerContext* that,
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
233 unsigned int sleepDelay)
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
234 {
5450
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
235 Logging::SetCurrentThreadName("SAVE-JOBS");
9ffd6d18daf3 log lines now contain the thread name
Alain Mazy <am@osimis.io>
parents: 5442
diff changeset
236
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
237 static const boost::posix_time::time_duration PERIODICITY =
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
238 boost::posix_time::seconds(10);
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
239
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
240 boost::posix_time::ptime next =
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
241 boost::posix_time::microsec_clock::universal_time() + PERIODICITY;
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
242
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
243 while (!that->done_)
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
244 {
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
245 boost::this_thread::sleep(boost::posix_time::milliseconds(sleepDelay));
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
246
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
247 if (that->haveJobsChanged_ ||
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
248 boost::posix_time::microsec_clock::universal_time() >= next)
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
249 {
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
250 that->haveJobsChanged_ = false;
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
251 that->SaveJobsEngine();
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
252 next = boost::posix_time::microsec_clock::universal_time() + PERIODICITY;
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
253 }
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
254 }
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
255 }
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
256
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
257
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
258 void ServerContext::SignalJobSubmitted(const std::string& jobId)
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
259 {
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
260 haveJobsChanged_ = true;
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
261 pendingJobEvents_.Enqueue(new JobEvent(JobEventType_Submitted, jobId));
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
262 }
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
263
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
264
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
265 void ServerContext::SignalJobSuccess(const std::string& jobId)
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
266 {
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
267 haveJobsChanged_ = true;
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
268 pendingJobEvents_.Enqueue(new JobEvent(JobEventType_Success, jobId));
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
269 }
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
270
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
271
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
272 void ServerContext::SignalJobFailure(const std::string& jobId)
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
273 {
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
274 haveJobsChanged_ = true;
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
275 pendingJobEvents_.Enqueue(new JobEvent(JobEventType_Failure, jobId));
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
276 }
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
277
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
278
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
279 void ServerContext::SetupJobsEngine(bool unitTesting,
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
280 bool loadJobsFromDatabase)
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
281 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
282 if (loadJobsFromDatabase)
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
283 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
284 std::string serialized;
4607
f75c63aa9de0 differentiating between shared and private global properties
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4519
diff changeset
285 if (index_.LookupGlobalProperty(serialized, GlobalProperty_JobsRegistry, false /* not shared */))
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
286 {
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
287 LOG(WARNING) << "Reloading the jobs from the last execution of Orthanc";
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
288
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
289 try
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
290 {
4205
d962a2996637 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4203
diff changeset
291 OrthancJobUnserializer unserializer(*this);
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
292 jobsEngine_.LoadRegistryFromString(unserializer, serialized);
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
293 }
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
294 catch (OrthancException& e)
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
295 {
2925
a80ba85d89e6 Orthanc starts even if jobs from a previous execution cannot be unserialized
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2898
diff changeset
296 LOG(WARNING) << "Cannot unserialize the jobs engine, starting anyway: " << e.What();
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
297 }
5436
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
298 catch (const std::string& s)
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
299 {
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
300 LOG(WARNING) << "Cannot unserialize the jobs engine, starting anyway: \"" << s << "\"";
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
301 }
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
302 catch (...)
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
303 {
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
304 LOG(WARNING) << "Cannot unserialize the jobs engine, starting anyway";
6f2b11bfee8d handle unknown exceptions in job registry unserialization
Alain Mazy <am@osimis.io>
parents: 5431
diff changeset
305 }
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
306 }
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
307 else
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
308 {
2671
06c0a6b8a871 new command-line argument: --no-jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2668
diff changeset
309 LOG(INFO) << "The last execution of Orthanc has archived no job";
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
310 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
311 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
312 else
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
313 {
2925
a80ba85d89e6 Orthanc starts even if jobs from a previous execution cannot be unserialized
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2898
diff changeset
314 LOG(INFO) << "Not reloading the jobs from the last execution of Orthanc";
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
315 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
316
4024
1d2b31fc782f new 'changes': JobSubmitted, JobSuccess, JobFailure
Alain Mazy <alain@mazy.be>
parents: 4022
diff changeset
317 jobsEngine_.GetRegistry().SetObserver(*this);
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
318 jobsEngine_.Start();
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
319 isJobsEngineUnserialized_ = true;
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
320
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
321 saveJobsThread_ = boost::thread(SaveJobsThread, this, (unitTesting ? 20 : 100));
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
322 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
323
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
324
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
325 void ServerContext::SaveJobsEngine()
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
326 {
3165
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
327 if (saveJobs_)
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
328 {
4268
0ae2ca210077 new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4265
diff changeset
329 LOG(TRACE) << "Serializing the content of the jobs engine";
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
330
3165
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
331 try
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
332 {
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
333 Json::Value value;
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
334 jobsEngine_.GetRegistry().Serialize(value);
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
335
4392
3af1d763763a confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4384
diff changeset
336 std::string serialized;
4394
f7104e9d044c functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4392
diff changeset
337 Toolbox::WriteFastJson(serialized, value);
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
338
4607
f75c63aa9de0 differentiating between shared and private global properties
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4519
diff changeset
339 index_.SetGlobalProperty(GlobalProperty_JobsRegistry, false /* not shared */, serialized);
3165
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
340 }
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
341 catch (OrthancException& e)
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
342 {
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
343 LOG(ERROR) << "Cannot serialize the jobs engine: " << e.What();
1fe524e211af New configuration option: "SaveJobs" to specify whether jobs are stored in the database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3097
diff changeset
344 }
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
345 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
346 }
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
347
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
348
5431
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
349 void ServerContext::PublishCacheMetrics()
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
350 {
5431
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
351 metricsRegistry_->SetFloatValue("orthanc_dicom_cache_size_mb",
5337
b376abae664a Metrics can be stored either as floating-point numbers, or as integers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5334
diff changeset
352 static_cast<float>(dicomCache_.GetCurrentSize()) / static_cast<float>(1024 * 1024));
b376abae664a Metrics can be stored either as floating-point numbers, or as integers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5334
diff changeset
353 metricsRegistry_->SetIntegerValue("orthanc_dicom_cache_count", dicomCache_.GetNumberOfItems());
5431
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
354
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
355 metricsRegistry_->SetFloatValue("orthanc_storage_cache_size_mb",
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
356 static_cast<float>(storageCache_.GetCurrentSize()) / static_cast<float>(1024 * 1024));
4be5f117aa0d metrics
Alain Mazy <am@osimis.io>
parents: 5427
diff changeset
357 metricsRegistry_->SetIntegerValue("orthanc_storage_cache_count", storageCache_.GetNumberOfItems());
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
358 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
359
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
360
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
361 ServerContext::ServerContext(IDatabaseWrapper& database,
2665
389d050a2e66 fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2626
diff changeset
362 IStorageArea& area,
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
363 bool unitTesting,
5785
b4e7a85cde80 fix readonly init
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
364 size_t maxCompletedJobs,
b4e7a85cde80 fix readonly init
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
365 bool readOnly) :
b4e7a85cde80 fix readonly init
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
366 index_(*this, database, (unitTesting ? 20 : 500), readOnly),
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
367 area_(area),
656
08eca5d86aad fixes to cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 409
diff changeset
368 compressionEnabled_(false),
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
369 storeMD5_(true),
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
370 largeDicomThrottler_(1),
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
371 dicomCache_(DICOM_CACHE_SIZE),
2738
3a55b77339ff fix deadlock in Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2716
diff changeset
372 mainLua_(*this),
3a55b77339ff fix deadlock in Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2716
diff changeset
373 filterLua_(*this),
3a55b77339ff fix deadlock in Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2716
diff changeset
374 luaListener_(*this),
2950
dc18d5804746 support of JobsHistorySize set to zero
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2940
diff changeset
375 jobsEngine_(maxCompletedJobs),
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2135
diff changeset
376 #if ORTHANC_ENABLE_PLUGINS == 1
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
377 plugins_(NULL),
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
378 #endif
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
379 done_(false),
2673
8e0bc055d18c JobsRegistry::IObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2672
diff changeset
380 haveJobsChanged_(false),
3174
8ea7c4546c3a primitives to collect metrics in Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3165
diff changeset
381 isJobsEngineUnserialized_(false),
3533
2090ec6a83a5 create a default user if none is provided, while issuing a warning in Orthanc Explorer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3346
diff changeset
382 metricsRegistry_(new MetricsRegistry),
3535
41365091a41e display a security warning in the logs at startup when ExecuteLuaEnabled is true
Alain Mazy <alain@mazy.be>
parents: 3534
diff changeset
383 isHttpServerSecure_(true),
3813
aaaa442bfe39 moving SetOverwriteInstances from ServerIndex to ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3736
diff changeset
384 isExecuteLuaEnabled_(false),
5200
f8f1c4a9a216 New configuration option 'RestApiWriteToFileSystemEnabled'
Alain Mazy <am@osimis.io>
parents: 5185
diff changeset
385 isRestApiWriteToFileSystemEnabled_(false),
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
386 overwriteInstances_(false),
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
387 dcmtkTranscoder_(new DcmtkTranscoder),
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
388 isIngestTranscoding_(false),
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
389 ingestTranscodingOfUncompressed_(true),
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
390 ingestTranscodingOfCompressed_(true),
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
391 preferredTransferSyntax_(DicomTransferSyntax_LittleEndianExplicit),
5785
b4e7a85cde80 fix readonly init
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
392 readOnly_(readOnly),
5111
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
393 deidentifyLogs_(false),
5785
b4e7a85cde80 fix readonly init
Alain Mazy <am@orthanc.team>
parents: 5783
diff changeset
394 serverStartTimeUtc_(boost::posix_time::second_clock::universal_time())
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 {
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
396 try
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
397 {
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
398 unsigned int lossyQuality;
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
399
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
400 {
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
401 OrthancConfiguration::ReaderLock lock;
2965
9c0b0a6d8b54 MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2956
diff changeset
402
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
403 queryRetrieveArchive_.reset(
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
404 new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("QueryRetrieveSize", 100)));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
405 mediaArchive_.reset(
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
406 new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("MediaArchiveSize", 1)));
4143
1ec3e1e18f50 Add missing tag "Retrieve AE Title (0008,0054)" in C-FIND SCP responses
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4140
diff changeset
407 defaultLocalAet_ = lock.GetConfiguration().GetOrthancAET();
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
408 jobsEngine_.SetWorkersCount(lock.GetConfiguration().GetUnsignedIntegerParameter("ConcurrentJobs", 2));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
409 saveJobs_ = lock.GetConfiguration().GetBooleanParameter("SaveJobs", true);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
410 metricsRegistry_->SetEnabled(lock.GetConfiguration().GetBooleanParameter("MetricsEnabled", true));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
411
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
412 // New configuration options in Orthanc 1.5.1
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
413 findStorageAccessMode_ = StringToFindStorageAccessMode(lock.GetConfiguration().GetStringParameter("StorageAccessOnFind", "Always"));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
414 limitFindInstances_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindInstances", 0);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
415 limitFindResults_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindResults", 0);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
416
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
417 // New configuration option in Orthanc 1.6.0
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
418 storageCommitmentReports_.reset(new StorageCommitmentReports(lock.GetConfiguration().GetUnsignedIntegerParameter("StorageCommitmentReportsSize", 100)));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
419
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
420 // New options in Orthanc 1.7.0
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
421 transcodeDicomProtocol_ = lock.GetConfiguration().GetBooleanParameter("TranscodeDicomProtocol", true);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
422 builtinDecoderTranscoderOrder_ = StringToBuiltinDecoderTranscoderOrder(lock.GetConfiguration().GetStringParameter("BuiltinDecoderTranscoderOrder", "After"));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
423 lossyQuality = lock.GetConfiguration().GetUnsignedIntegerParameter("DicomLossyTranscodingQuality", 90);
3677
4182cde57afb refactoring FindStorageAccessMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
424
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
425 std::string s;
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
426 if (lock.GetConfiguration().LookupStringParameter(s, "IngestTranscoding"))
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
427 {
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
428 if (LookupTransferSyntax(ingestTransferSyntax_, s))
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
429 {
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
430 isIngestTranscoding_ = true;
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
431 LOG(WARNING) << "Incoming DICOM instances will automatically be transcoded to "
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
432 << "transfer syntax: " << GetTransferSyntaxUid(ingestTransferSyntax_);
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
433
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
434 // New options in Orthanc 1.8.2
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
435 ingestTranscodingOfUncompressed_ = lock.GetConfiguration().GetBooleanParameter("IngestTranscodingOfUncompressed", true);
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
436 ingestTranscodingOfCompressed_ = lock.GetConfiguration().GetBooleanParameter("IngestTranscodingOfCompressed", true);
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
437
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
438 LOG(WARNING) << " Ingest transcoding will "
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
439 << (ingestTranscodingOfUncompressed_ ? "be applied" : "*not* be applied")
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
440 << " to uncompressed transfer syntaxes (Little Endian Implicit/Explicit, Big Endian Explicit)";
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
441
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
442 LOG(WARNING) << " Ingest transcoding will "
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
443 << (ingestTranscodingOfCompressed_ ? "be applied" : "*not* be applied")
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
444 << " to compressed transfer syntaxes";
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
445 }
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
446 else
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
447 {
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
448 throw OrthancException(ErrorCode_ParameterOutOfRange,
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
449 "Unknown transfer syntax for ingest transcoding: " + s);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
450 }
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
451 }
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
452 else
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
453 {
3941
771dbd9eb3bd class CleaningInstancesJob to share cleaning code by merge/split jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3939
diff changeset
454 isIngestTranscoding_ = false;
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
455 LOG(INFO) << "Automated transcoding of incoming DICOM instances is disabled";
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
456 }
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
457
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
458 // New options in Orthanc 1.8.2
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
459 if (lock.GetConfiguration().GetBooleanParameter("DeidentifyLogs", true))
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
460 {
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
461 deidentifyLogs_ = true;
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
462 CLOG(INFO, DICOM) << "Deidentification of log contents (notably for DIMSE queries) is enabled";
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
463
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
464 DicomVersion version = StringToDicomVersion(
5334
5b2a5cc64cb1 upgraded anonymization to Basic Profile of PS 3.15-2023b Table E.1-1
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5333
diff changeset
465 lock.GetConfiguration().GetStringParameter("DeidentifyLogsDicomVersion", "2023b"));
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
466 CLOG(INFO, DICOM) << "Version of DICOM standard used for deidentification is "
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
467 << EnumerationToString(version);
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
468
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
469 logsDeidentifierRules_.SetupAnonymization(version);
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
470 }
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
471 else
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
472 {
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
473 deidentifyLogs_ = false;
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
474 CLOG(INFO, DICOM) << "Deidentification of log contents (notably for DIMSE queries) is disabled";
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
475 }
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
476
4473
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
477 // New options in Orthanc 1.9.0
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
478 if (lock.GetConfiguration().LookupStringParameter(s, "DicomScuPreferredTransferSyntax") &&
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
479 !LookupTransferSyntax(preferredTransferSyntax_, s))
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
480 {
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
481 throw OrthancException(ErrorCode_ParameterOutOfRange,
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
482 "Unknown preferred transfer syntax: " + s);
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
483 }
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
484
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
485 CLOG(INFO, DICOM) << "Preferred transfer syntax for Orthanc C-STORE SCU: "
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
486 << GetTransferSyntaxUid(preferredTransferSyntax_);
4473
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
487
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
488 lock.GetConfiguration().GetAcceptedTransferSyntaxes(acceptedTransferSyntaxes_);
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
489
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
490 isUnknownSopClassAccepted_ = lock.GetConfiguration().GetBooleanParameter("UnknownSopClassAccepted", false);
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
491 }
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
492
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
493 jobsEngine_.SetThreadSleep(unitTesting ? 20 : 200);
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
494
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
495 listeners_.push_back(ServerListener(luaListener_, "Lua"));
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
496 changeThread_ = boost::thread(ChangeThread, this, (unitTesting ? 20 : 100));
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
497 jobEventsThread_ = boost::thread(JobEventsThread, this, (unitTesting ? 20 : 100));
5182
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
498
5159
f5907aecbaed conditional usage of malloc_trim
Alain Mazy <am@osimis.io>
parents: 5152
diff changeset
499 #if HAVE_MALLOC_TRIM == 1
5346
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
500 LOG(INFO) << "Starting memory trimming thread at 30 seconds interval";
566e8d32bd3a Reduce the frequency of memory trimming from 100ms to 30s to avoid high idle CPU load
Alain Mazy <am@osimis.io>
parents: 5337
diff changeset
501 memoryTrimmingThread_ = boost::thread(MemoryTrimmingThread, this, 30);
5159
f5907aecbaed conditional usage of malloc_trim
Alain Mazy <am@osimis.io>
parents: 5152
diff changeset
502 #else
5183
5ec3dcdf78b9 renamed HousekeeperThread as MemoryTrimmingThread to avoid confusion with Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5182
diff changeset
503 LOG(INFO) << "Your platform does not support malloc_trim(), not starting the memory trimming thread";
5159
f5907aecbaed conditional usage of malloc_trim
Alain Mazy <am@osimis.io>
parents: 5152
diff changeset
504 #endif
5182
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5181
diff changeset
505
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
506 dynamic_cast<DcmtkTranscoder&>(*dcmtkTranscoder_).SetLossyQuality(lossyQuality);
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
507 }
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
508 catch (OrthancException&)
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
509 {
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
510 Stop();
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
511 throw;
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
512 }
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 }
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
515
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
516
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
517 ServerContext::~ServerContext()
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
518 {
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
519 if (!done_)
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
520 {
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
521 LOG(ERROR) << "INTERNAL ERROR: ServerContext::Stop() should be invoked manually to avoid mess in the destruction order!";
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
522 Stop();
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
523 }
1447
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
524 }
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
525
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
526
1447
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
527 void ServerContext::Stop()
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
528 {
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
529 if (!done_)
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
530 {
1459
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
531 {
3947
cf6eb4fc6841 fix issue 179: use a shared mutex to avoid deadlock in python plugins
Alain Mazy <alain@mazy.be>
parents: 3945
diff changeset
532 boost::unique_lock<boost::shared_mutex> lock(listenersMutex_);
1459
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
533 listeners_.clear();
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
534 }
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
535
1447
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
536 done_ = true;
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
537
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
538 if (changeThread_.joinable())
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
539 {
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
540 changeThread_.join();
5ba7471780ae refactoring: HttpToolbox, DumpJson in Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1436
diff changeset
541 }
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
542
5410
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
543 if (jobEventsThread_.joinable())
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
544 {
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
545 jobEventsThread_.join();
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
546 }
16cbfefa15e9 Solved a deadlock related to the Job Engine events and plugins
Alain Mazy <am@osimis.io>
parents: 5346
diff changeset
547
2672
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
548 if (saveJobsThread_.joinable())
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
549 {
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
550 saveJobsThread_.join();
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
551 }
3efc44fac209 periodically saving jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2671
diff changeset
552
5183
5ec3dcdf78b9 renamed HousekeeperThread as MemoryTrimmingThread to avoid confusion with Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5182
diff changeset
553 if (memoryTrimmingThread_.joinable())
5181
65b05b44ae4c properly finalizing the housekeeper thread that periodically calls malloc_trim()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5176
diff changeset
554 {
5183
5ec3dcdf78b9 renamed HousekeeperThread as MemoryTrimmingThread to avoid confusion with Housekeeper plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5182
diff changeset
555 memoryTrimmingThread_.join();
5181
65b05b44ae4c properly finalizing the housekeeper thread that periodically calls malloc_trim()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5176
diff changeset
556 }
65b05b44ae4c properly finalizing the housekeeper thread that periodically calls malloc_trim()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5176
diff changeset
557
4024
1d2b31fc782f new 'changes': JobSubmitted, JobSuccess, JobFailure
Alain Mazy <alain@mazy.be>
parents: 4022
diff changeset
558 jobsEngine_.GetRegistry().ResetObserver();
2815
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
559
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
560 if (isJobsEngineUnserialized_)
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
561 {
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
562 // Avoid losing jobs if the JobsRegistry cannot be unserialized
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
563 SaveJobsEngine();
925d8dc03a23 unserialization of jobs from plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2808
diff changeset
564 }
2668
d26dd081df97 saving jobs engine on exit
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2665
diff changeset
565
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
566 // Do not change the order below!
2570
2e879c796ec7 JobsRegistry::SubmitAndWait(), StoreScuJob
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2507
diff changeset
567 jobsEngine_.Stop();
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
568 index_.Stop();
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
569 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
570 }
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
571
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
572
236
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
573 void ServerContext::SetCompressionEnabled(bool enabled)
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
574 {
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
575 if (enabled)
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
576 LOG(WARNING) << "Disk compression is enabled";
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
577 else
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
578 LOG(WARNING) << "Disk compression is disabled";
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
579
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
580 compressionEnabled_ = enabled;
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
581 }
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
582
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
583
1126
bf67431a7383 handling of file content type in IStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1124
diff changeset
584 void ServerContext::RemoveFile(const std::string& fileUuid,
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
585 FileContentType type,
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
586 const std::string& customData)
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
587 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
588 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
589 accessor.Remove(fileUuid, type, customData);
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
590 }
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
591
996
cf52f3bcb2b3 clarification of Lua classes wrt multithreading
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
592
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
593 ServerContext::StoreResult ServerContext::StoreAfterTranscoding(std::string& resultPublicId,
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
594 DicomInstanceToStore& dicom,
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
595 StoreInstanceMode mode,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
596 bool isReconstruct)
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
597 {
3814
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
598 bool overwrite;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
599 switch (mode)
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
600 {
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
601 case StoreInstanceMode_Default:
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
602 overwrite = overwriteInstances_;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
603 break;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
604
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
605 case StoreInstanceMode_OverwriteDuplicate:
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
606 overwrite = true;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
607 break;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
608
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
609 case StoreInstanceMode_IgnoreDuplicate:
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
610 overwrite = false;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
611 break;
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
612
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
613 default:
023b2a9f3aa1 new enum: StoreInstanceMode
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3813
diff changeset
614 throw OrthancException(ErrorCode_ParameterOutOfRange);
4499
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
615 }
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
616
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
617 bool hasPixelDataOffset;
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
618 uint64_t pixelDataOffset;
5316
03501a258d9e added instance metadata "PixelDataVR"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5296
diff changeset
619 ValueRepresentation pixelDataVR;
4499
6f99949b2878 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4473
diff changeset
620 hasPixelDataOffset = DicomStreamReader::LookupPixelDataOffset(
5316
03501a258d9e added instance metadata "PixelDataVR"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5296
diff changeset
621 pixelDataOffset, pixelDataVR, dicom.GetBufferData(), dicom.GetBufferSize());
4506
ac69c9f76c71 refactoring ServerIndex::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4505
diff changeset
622
4507
b4c58795f3a8 widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4506
diff changeset
623 DicomTransferSyntax transferSyntax;
4506
ac69c9f76c71 refactoring ServerIndex::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4505
diff changeset
624 bool hasTransferSyntax = dicom.LookupTransferSyntax(transferSyntax);
4507
b4c58795f3a8 widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4506
diff changeset
625
4505
97d103b57cd1 removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4504
diff changeset
626 DicomMap summary;
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
627 dicom.GetSummary(summary); // -> from Orthanc 1.11.1, this includes the leaf nodes and sequences
5036
877bc3b96476 Handle Dicom sequences in ExtraMainDicomTags and save them in the 'MainDicomSequences' metadata
Alain Mazy <am@osimis.io>
parents: 4994
diff changeset
628
5176
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5160
diff changeset
629 std::set<DicomTag> allMainDicomTags;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5160
diff changeset
630 DicomMap::GetAllMainDicomTags(allMainDicomTags);
4505
97d103b57cd1 removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4504
diff changeset
631
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
632 try
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
633 {
3175
574890d14c92 new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3174
diff changeset
634 MetricsRegistry::Timer timer(GetMetricsRegistry(), "orthanc_store_dicom_duration_ms");
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
635 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
636
4507
b4c58795f3a8 widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4506
diff changeset
637 DicomInstanceHasher hasher(summary);
b4c58795f3a8 widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4506
diff changeset
638 resultPublicId = hasher.HashInstance();
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
639
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
640 Json::Value dicomAsJson;
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
641 dicom.GetDicomAsJson(dicomAsJson, allMainDicomTags); // don't crop any main dicom tags
5036
877bc3b96476 Handle Dicom sequences in ExtraMainDicomTags and save them in the 'MainDicomSequences' metadata
Alain Mazy <am@osimis.io>
parents: 4994
diff changeset
642
1574
0c29ebe80ac9 give access to full request origin in ReceivedInstanceFilter (Lua)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1550
diff changeset
643 Json::Value simplifiedTags;
4504
7d1eabfac6e0 removed cached dicom-as-json from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4500
diff changeset
644 Toolbox::SimplifyDicomAsJson(simplifiedTags, dicomAsJson, DicomToJsonFormat_Human);
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
645
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
646 // Test if the instance must be filtered out
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
647 StoreResult result;
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
648
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
649 if (!isReconstruct) // skip all filters if this is a reconstruction
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
650 {
3947
cf6eb4fc6841 fix issue 179: use a shared mutex to avoid deadlock in python plugins
Alain Mazy <alain@mazy.be>
parents: 3945
diff changeset
651 boost::shared_lock<boost::shared_mutex> lock(listenersMutex_);
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
652
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
653 for (ServerListeners::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
654 {
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
655 try
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
656 {
1574
0c29ebe80ac9 give access to full request origin in ReceivedInstanceFilter (Lua)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1550
diff changeset
657 if (!it->GetListener().FilterIncomingInstance(dicom, simplifiedTags))
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
658 {
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
659 result.SetStatus(StoreStatus_FilteredOut);
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
660 result.SetCStoreStatusCode(STATUS_Success); // to keep backward compatibility, we still return 'success'
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
661 break;
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
662 }
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
663
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
664 if (dicom.GetOrigin().GetRequestOrigin() == Orthanc::RequestOrigin_DicomProtocol)
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
665 {
4921
309fb4f02704 fix signature of OrthancPluginIncomingCStoreInstanceFilter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4919
diff changeset
666 uint16_t filterResult = STATUS_Success;
309fb4f02704 fix signature of OrthancPluginIncomingCStoreInstanceFilter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4919
diff changeset
667 if (!it->GetListener().FilterIncomingCStoreInstance(filterResult, dicom, simplifiedTags))
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
668 {
4921
309fb4f02704 fix signature of OrthancPluginIncomingCStoreInstanceFilter
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4919
diff changeset
669 // The instance is to be discarded
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
670 result.SetStatus(StoreStatus_FilteredOut);
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
671 result.SetCStoreStatusCode(filterResult);
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
672 break;
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
673 }
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
674 }
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
675
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
676 }
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
677 catch (OrthancException& e)
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
678 {
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
679 LOG(ERROR) << "Error in the " << it->GetDescription()
2135
cadfe0a2a393 fix in the sample basic plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2134
diff changeset
680 << " callback while receiving an instance: " << e.What()
cadfe0a2a393 fix in the sample basic plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2134
diff changeset
681 << " (code " << e.GetErrorCode() << ")";
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
682 throw;
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1447
diff changeset
683 }
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
684 }
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
685 }
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
686
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
687 if (result.GetStatus() == StoreStatus_FilteredOut)
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
688 {
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
689 LOG(INFO) << "An incoming instance has been discarded by the filter";
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
690 return result;
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
691 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
692
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
693 // Remove the file from the DicomCache (useful if
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
694 // "OverwriteInstances" is set to "true")
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
695 dicomCache_.Invalidate(resultPublicId);
2825
8aa6aef11b70 New configuration option "OverwriteInstances" to choose how duplicate SOPInstanceUID are handled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2815
diff changeset
696
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
697 // TODO Should we use "gzip" instead?
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
698 CompressionType compression = (compressionEnabled_ ? CompressionType_ZlibWithSize : CompressionType_None);
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
699
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
700 std::string dicomCustomData;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
701 std::string dicomUuid = Toolbox::GenerateUuid();
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
702
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
703 FileInfo dicomInfo = accessor.WriteInstance(dicomCustomData, dicom, dicom.GetBufferData(), dicom.GetBufferSize(),
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
704 FileContentType_Dicom, compression, storeMD5_, dicomUuid);
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
705
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
706 ServerIndex::Attachments attachments;
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
707 attachments.push_back(dicomInfo);
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
708
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
709 FileInfo dicomUntilPixelData;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
710 if (hasPixelDataOffset &&
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
711 (!area_.HasReadRange() ||
4519
a3c6678aa7b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
712 compressionEnabled_))
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
713 {
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
714 std::string dicomHeaderCustomData;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
715 std::string dicomHeaderUuid = Toolbox::GenerateUuid();
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
716
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
717 dicomUntilPixelData = accessor.WriteInstance(dicomHeaderCustomData, dicom, dicom.GetBufferData(), pixelDataOffset,
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
718 FileContentType_DicomUntilPixelData, compression, storeMD5_, dicomHeaderUuid);
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
719 attachments.push_back(dicomUntilPixelData);
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
720 }
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
721
1067
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
722 typedef std::map<MetadataType, std::string> InstanceMetadata;
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
723 InstanceMetadata instanceMetadata;
5464
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
724
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
725 try
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
726 {
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
727 result.SetStatus(index_.Store(
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
728 instanceMetadata, summary, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite,
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
729 hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, pixelDataVR, isReconstruct));
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
730 }
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
731 catch (OrthancException& ex)
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
732 {
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
733 if (ex.GetErrorCode() == ErrorCode_DuplicateResource)
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
734 {
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
735 LOG(WARNING) << "Duplicate instance, deleting the attachments";
5529
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
736 }
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
737 else
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
738 {
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
739 LOG(ERROR) << "Unexpected error while storing an instance in DB, cancelling and deleting the attachments: " << ex.GetDetails();
5464
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
740 }
5514
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5497
diff changeset
741
5529
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
742 accessor.Remove(dicomInfo);
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
743
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
744 if (dicomUntilPixelData.IsValid())
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
745 {
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
746 accessor.Remove(dicomUntilPixelData);
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
747 }
acdb8d78bf99 Whatever the SQL error that happens while inserting an instance in DB, remove the attachments that have been added to avoid orphan files
Alain Mazy <am@osimis.io>
parents: 5514
diff changeset
748
5514
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5497
diff changeset
749 throw;
5464
38f1d06875ad delete attachment in case of same instance being uploaded multiple times at the same time
Alain Mazy <am@osimis.io>
parents: 5450
diff changeset
750 }
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
751
1433
461e7554bff7 refactoring: LuaScripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
752 // Only keep the metadata for the "instance" level
4506
ac69c9f76c71 refactoring ServerIndex::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4505
diff changeset
753 dicom.ClearMetadata();
1067
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
754
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
755 for (InstanceMetadata::const_iterator it = instanceMetadata.begin();
1304
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
756 it != instanceMetadata.end(); ++it)
1067
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
757 {
4506
ac69c9f76c71 refactoring ServerIndex::Store()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4505
diff changeset
758 dicom.AddMetadata(ResourceType_Instance, it->first, it->second);
1067
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
759 }
ace99e272203 access metadata in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1066
diff changeset
760
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
761 if (result.GetStatus() != StoreStatus_Success)
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
762 {
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
763 accessor.Remove(dicomInfo);
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
764
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
765 if (dicomUntilPixelData.IsValid())
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
766 {
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
767 accessor.Remove(dicomUntilPixelData);
4500
3b4940bca158 added safeguards in Orthanc::FileInfo
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4499
diff changeset
768 }
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
769 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
770
4994
2f30aa99c2db cppcheck
Alain Mazy <am@osimis.io>
parents: 4988
diff changeset
771 if (!isReconstruct)
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
772 {
4994
2f30aa99c2db cppcheck
Alain Mazy <am@osimis.io>
parents: 4988
diff changeset
773 // skip logs in case of reconstruction
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
774 switch (result.GetStatus())
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
775 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
776 case StoreStatus_Success:
5496
e4294feb0a3a logs: display instance id when stored
Alain Mazy <am@osimis.io>
parents: 5485
diff changeset
777 LOG(INFO) << "New instance stored (" << resultPublicId << ")";
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
778 break;
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
779
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
780 case StoreStatus_AlreadyStored:
5496
e4294feb0a3a logs: display instance id when stored
Alain Mazy <am@osimis.io>
parents: 5485
diff changeset
781 LOG(INFO) << "Instance already stored (" << resultPublicId << ")";
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
782 break;
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
783
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
784 case StoreStatus_Failure:
5496
e4294feb0a3a logs: display instance id when stored
Alain Mazy <am@osimis.io>
parents: 5485
diff changeset
785 LOG(ERROR) << "Unknown store failure while storing instance " << resultPublicId;
5296
5053a10da5a2 Fix orphan files remaining in storage when working with MaximumStorageSize
Alain Mazy <am@osimis.io>
parents: 5248
diff changeset
786 throw OrthancException(ErrorCode_InternalError, HttpStatus_500_InternalServerError);
5053a10da5a2 Fix orphan files remaining in storage when working with MaximumStorageSize
Alain Mazy <am@osimis.io>
parents: 5248
diff changeset
787
5053a10da5a2 Fix orphan files remaining in storage when working with MaximumStorageSize
Alain Mazy <am@osimis.io>
parents: 5248
diff changeset
788 case StoreStatus_StorageFull:
5496
e4294feb0a3a logs: display instance id when stored
Alain Mazy <am@osimis.io>
parents: 5485
diff changeset
789 LOG(ERROR) << "Storage full while storing instance " << resultPublicId;
5296
5053a10da5a2 Fix orphan files remaining in storage when working with MaximumStorageSize
Alain Mazy <am@osimis.io>
parents: 5248
diff changeset
790 throw OrthancException(ErrorCode_FullStorage, HttpStatus_507_InsufficientStorage);
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
791
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
792 default:
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
793 // This should never happen
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
794 break;
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
795 }
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
796
4994
2f30aa99c2db cppcheck
Alain Mazy <am@osimis.io>
parents: 4988
diff changeset
797 // skip all signals if this is a reconstruction
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
798 if (result.GetStatus() == StoreStatus_Success ||
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
799 result.GetStatus() == StoreStatus_AlreadyStored)
1066
bb82e5e818e9 OnStoredInstance callback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1065
diff changeset
800 {
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
801 boost::shared_lock<boost::shared_mutex> lock(listenersMutex_);
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
802
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
803 for (ServerListeners::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
1066
bb82e5e818e9 OnStoredInstance callback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1065
diff changeset
804 {
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
805 try
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
806 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
807 it->GetListener().SignalStoredInstance(resultPublicId, dicom, simplifiedTags);
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
808 }
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
809 catch (OrthancException& e)
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
810 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
811 LOG(ERROR) << "Error in the " << it->GetDescription()
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
812 << " callback while receiving an instance: " << e.What()
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
813 << " (code " << e.GetErrorCode() << ")";
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
814 }
1066
bb82e5e818e9 OnStoredInstance callback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1065
diff changeset
815 }
bb82e5e818e9 OnStoredInstance callback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1065
diff changeset
816 }
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
817 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
818
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
819 return result;
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
820 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
821 catch (OrthancException& e)
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
822 {
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
823 if (e.GetErrorCode() == ErrorCode_InexistentTag)
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
824 {
4505
97d103b57cd1 removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4504
diff changeset
825 summary.LogMissingTagsForStore();
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
826 }
4505
97d103b57cd1 removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4504
diff changeset
827
1004
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
828 throw;
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
829 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
830 }
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
831
a226e0959d8b DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1002
diff changeset
832
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
833 ServerContext::StoreResult ServerContext::Store(std::string& resultPublicId,
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
834 DicomInstanceToStore& receivedDicom,
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
835 StoreInstanceMode mode)
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
836 {
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
837 DicomInstanceToStore* dicom = &receivedDicom;
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
838
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
839 // WARNING: The scope of "modifiedBuffer" and "modifiedDicom" must
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
840 // be the same as that of "dicom"
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
841 MallocMemoryBuffer modifiedBuffer;
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
842 std::unique_ptr<DicomInstanceToStore> modifiedDicom;
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
843
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
844 #if ORTHANC_ENABLE_PLUGINS == 1
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
845 if (HasPlugins())
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
846 {
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
847 // New in Orthanc 1.10.0
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
848
4919
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
849 OrthancPluginReceivedInstanceAction action = GetPlugins().ApplyReceivedInstanceCallbacks(
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
850 modifiedBuffer, receivedDicom.GetBufferData(), receivedDicom.GetBufferSize(), receivedDicom.GetOrigin().GetRequestOrigin());
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
851
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
852 switch (action)
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
853 {
4919
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
854 case OrthancPluginReceivedInstanceAction_Discard:
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
855 {
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
856 CLOG(INFO, PLUGINS) << "A plugin has discarded the instance in its ReceivedInstanceCallback";
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
857 StoreResult result;
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
858 result.SetStatus(StoreStatus_FilteredOut);
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
859 return result;
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
860 }
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
861
4919
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
862 case OrthancPluginReceivedInstanceAction_KeepAsIs:
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
863 // This path is also used when no ReceivedInstanceCallback is installed by the plugins
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
864 break;
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
865
4919
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
866 case OrthancPluginReceivedInstanceAction_Modify:
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
867 if (modifiedBuffer.GetSize() > 0 &&
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
868 modifiedBuffer.GetData() != NULL)
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
869 {
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
870 CLOG(INFO, PLUGINS) << "A plugin has modified the instance in its ReceivedInstanceCallback";
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
871 modifiedDicom.reset(DicomInstanceToStore::CreateFromBuffer(modifiedBuffer.GetData(), modifiedBuffer.GetSize()));
4919
676e03e69703 added origin in OrthancPluginReceivedInstanceCallback
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4913
diff changeset
872 modifiedDicom->SetOrigin(receivedDicom.GetOrigin());
4913
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
873 dicom = modifiedDicom.get();
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
874 }
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
875 else
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
876 {
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
877 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback plugin is not returning a modified buffer while it has modified the instance");
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
878 }
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
879 break;
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
880
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
881 default:
c1b19f95e166 fix signature of OrthancPluginReceivedInstanceCallback for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4900
diff changeset
882 throw OrthancException(ErrorCode_Plugin, "The ReceivedInstanceCallback has returned an invalid value");
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
883 }
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
884 }
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
885 #endif
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
886
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
887 return TranscodeAndStore(resultPublicId, dicom, mode);
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
888 }
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
889
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
890 ServerContext::StoreResult ServerContext::TranscodeAndStore(std::string& resultPublicId,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
891 DicomInstanceToStore* dicom,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
892 StoreInstanceMode mode,
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
893 bool isReconstruct)
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
894 {
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
895
5148
2df546a76e17 If specifying 'Transcode' option to /modify or /anonymize, this value will take over the 'IngestTranscoding' global configuration
Alain Mazy <am@osimis.io>
parents: 5147
diff changeset
896 if (!isIngestTranscoding_ || dicom->SkipIngestTranscoding())
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
897 {
3941
771dbd9eb3bd class CleaningInstancesJob to share cleaning code by merge/split jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3939
diff changeset
898 // No automated transcoding. This was the only path in Orthanc <= 1.6.1.
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
899 return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
900 }
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
901 else
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
902 {
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
903 // Automated transcoding of incoming DICOM instance
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
904
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
905 bool transcode = false;
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
906
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
907 DicomTransferSyntax sourceSyntax;
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
908 if (!dicom->LookupTransferSyntax(sourceSyntax) ||
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
909 sourceSyntax == ingestTransferSyntax_)
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
910 {
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
911 // Don't transcode if the incoming DICOM is already in the proper transfer syntax
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
912 transcode = false;
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
913 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
914 else if (!IsTranscodableTransferSyntax(sourceSyntax))
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
915 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
916 // Don't try to transcode video files, this is useless (new in
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
917 // Orthanc 1.8.2). This could be accepted in the future if
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
918 // video transcoding gets implemented.
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
919 transcode = false;
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
920 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
921 else if (IsUncompressedTransferSyntax(sourceSyntax))
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
922 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
923 // This is an uncompressed transfer syntax (new in Orthanc 1.8.2)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
924 transcode = ingestTranscodingOfUncompressed_;
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
925 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
926 else
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
927 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
928 // This is an compressed transfer syntax (new in Orthanc 1.8.2)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
929 transcode = ingestTranscodingOfCompressed_;
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
930 }
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
931
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
932 if (!transcode)
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
933 {
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
934 // No transcoding
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
935 return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
936 }
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
937 else
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
938 {
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
939 // Trancoding
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
940 std::set<DicomTransferSyntax> syntaxes;
3939
c205f670098e new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3938
diff changeset
941 syntaxes.insert(ingestTransferSyntax_);
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
942
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
943 IDicomTranscoder::DicomImage source;
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
944 source.SetExternalBuffer(dicom->GetBufferData(), dicom->GetBufferSize());
4384
7e0d015ad109 new configuration options IngestTranscodingOfUncompressed and IngestTranscodingOfCompressed
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4376
diff changeset
945
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
946 IDicomTranscoder::DicomImage transcoded;
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3947
diff changeset
947 if (Transcode(transcoded, source, syntaxes, true /* allow new SOP instance UID */))
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
948 {
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
949 std::unique_ptr<ParsedDicomFile> tmp(transcoded.ReleaseAsParsedDicomFile());
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
950
4508
8f9090b137f1 Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4507
diff changeset
951 std::unique_ptr<DicomInstanceToStore> toStore(DicomInstanceToStore::CreateFromParsedDicomFile(*tmp));
4845
02d77189d8ba added ReceivedInstanceCallback + sample C++ plugin
Alain Mazy <am@osimis.io>
parents: 4831
diff changeset
952 toStore->SetOrigin(dicom->GetOrigin());
5147
19ccae2e0371 Fix issue #212 (Anonymization process transcodes data and loses resource link)
Alain Mazy <am@osimis.io>
parents: 5111
diff changeset
953 toStore->CopyMetadata(dicom->GetMetadata());
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
954
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
955 StoreResult result = StoreAfterTranscoding(resultPublicId, *toStore, mode, isReconstruct);
3938
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3931
diff changeset
956 assert(resultPublicId == tmp->GetHasher().HashInstance());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3931
diff changeset
957
4796
94616af363ec added ReceivedCStoreInstanceFilter lua callback + OrthancPluginRegisterIncomingCStoreInstanceFilter in sdk
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
958 return result;
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
959 }
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
960 else
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
961 {
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
962 // Cannot transcode => store the original file
4988
8fba26292a9f Housekeeper plugin: finalizing + integration tests ok
Alain Mazy <am@osimis.io>
parents: 4984
diff changeset
963 return StoreAfterTranscoding(resultPublicId, *dicom, mode, isReconstruct);
3945
0b3256c3ee14 simplified IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3944
diff changeset
964 }
3912
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
965 }
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
966 }
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
967 }
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
968
7610af1532c3 prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3911
diff changeset
969
1146
200fcac0deb4 optimization for access to attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1145
diff changeset
970 void ServerContext::AnswerAttachment(RestApiOutput& output,
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
971 const std::string& resourceId,
1146
200fcac0deb4 optimization for access to attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1145
diff changeset
972 FileContentType content)
226
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
973 {
232
5368bbe813cf refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 227
diff changeset
974 FileInfo attachment;
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
975 int64_t revision;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
976 if (!index_.LookupAttachment(attachment, revision, resourceId, content))
232
5368bbe813cf refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 227
diff changeset
977 {
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
978 throw OrthancException(ErrorCode_UnknownResource);
236
6d9be2b470b4 compression
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 233
diff changeset
979 }
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
980 else
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
981 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
982 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
983 accessor.AnswerFile(output, attachment, GetFileContentMime(content));
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
984 }
226
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
985 }
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
986
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
987
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
988 void ServerContext::ChangeAttachmentCompression(const std::string& resourceId,
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
989 ResourceType resourceType,
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
990 FileContentType attachmentType,
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
991 CompressionType compression)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
992 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
993 LOG(INFO) << "Changing compression type for attachment "
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
994 << EnumerationToString(attachmentType)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
995 << " of resource " << resourceId << " to "
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
996 << compression;
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
997
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
998 FileInfo attachment;
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
999 int64_t revision;
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1000 if (!index_.LookupAttachment(attachment, revision, resourceId, attachmentType))
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1001 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1002 throw OrthancException(ErrorCode_UnknownResource);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1003 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1004
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1005 if (attachment.GetCompressionType() == compression)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1006 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1007 // Nothing to do
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1008 return;
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1009 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1010
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1011 std::string content;
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1012
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1013 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1014 accessor.Read(content, attachment);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1015
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1016 std::string newUuid = Toolbox::GenerateUuid();
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1017 std::string newCustomData;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1018 FileInfo modified;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1019
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1020 // if (attachmentType == FileContentType_Dicom || attachmentType == FileContentType_DicomUntilPixelData)
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1021 // {
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1022 // // DicomInstanceToStore instance;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1023 // // TODO_CUSTOM_DATA: get the Instance such that we can call accessor.GetCustomData ...
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1024 // // modified = accessor.WriteInstance(newCustomData, instance, content.empty() ? NULL : content.c_str(),
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1025 // // content.size(), attachmentType, compression, storeMD5_, newUuid);
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1026 // }
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1027 // else
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1028 {
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1029 ResourceType resourceType = ResourceType_Instance; //TODO_CUSTOM_DATA: get it from above in the stack
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1030 modified = accessor.WriteAttachment(newCustomData, resourceId, resourceType, content.empty() ? NULL : content.c_str(),
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1031 content.size(), attachmentType, compression, storeMD5_, newUuid);
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1032 }
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1033
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1034
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1035
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1036 try
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1037 {
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1038 int64_t newRevision; // ignored
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4629
diff changeset
1039 StoreStatus status = index_.AddAttachment(newRevision, modified, resourceId,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4629
diff changeset
1040 true, revision, modified.GetUncompressedMD5());
1700
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1041 if (status != StoreStatus_Success)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1042 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1043 accessor.Remove(modified);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1044 throw OrthancException(ErrorCode_Database);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1045 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1046 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1047 catch (OrthancException&)
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1048 {
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1049 accessor.Remove(modified);
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1050 throw;
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1051 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1052 }
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1053
f5ddbd9239dd New URIs for attachments: ".../compress", ".../uncompress" and ".../is-compressed"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1632
diff changeset
1054
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1055 static void InjectEmptyPixelData(Json::Value& dicomAsJson)
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1056 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1057 // This is for backward compatibility with Orthanc <= 1.9.0
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1058 Json::Value pixelData = Json::objectValue;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1059 pixelData["Name"] = "PixelData";
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1060 pixelData["Type"] = "Null";
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1061 pixelData["Value"] = Json::nullValue;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1062
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1063 dicomAsJson["7fe0,0010"] = pixelData;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1064 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1065
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1066
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1067 static bool LookupMetadata(std::string& value,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1068 MetadataType key,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1069 const std::map<MetadataType, std::string>& instanceMetadata)
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1070 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1071 std::map<MetadataType, std::string>::const_iterator found = instanceMetadata.find(key);
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1072
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1073 if (found == instanceMetadata.end())
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1074 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1075 return false;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1076 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1077 else
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1078 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1079 value = found->second;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1080 return true;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1081 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1082 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1083
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1084
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1085 static bool LookupAttachment(FileInfo& target,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1086 FileContentType type,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1087 const std::map<FileContentType, FileInfo>& attachments)
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1088 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1089 std::map<FileContentType, FileInfo>::const_iterator found = attachments.find(type);
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1090
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1091 if (found == attachments.end())
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1092 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1093 return false;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1094 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1095 else if (found->second.GetContentType() == type)
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1096 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1097 target = found->second;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1098 return true;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1099 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1100 else
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1101 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1102 throw OrthancException(ErrorCode_DatabasePlugin);
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1103 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1104 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1105
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1106
2124
2b1520efa282 cleaning up
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2122
diff changeset
1107 void ServerContext::ReadDicomAsJson(Json::Value& result,
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1108 const std::string& instancePublicId,
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1109 const std::set<DicomTag>& ignoreTagLength)
226
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
1110 {
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1111 // TODO-FIND: This is a compatibility method, should be removed
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1112
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1113 std::map<MetadataType, std::string> metadata;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1114 std::map<FileContentType, FileInfo> attachments;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1115
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1116 FileInfo attachment;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1117 int64_t revision; // Ignored
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1118
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1119 if (index_.LookupAttachment(attachment, revision, instancePublicId, FileContentType_Dicom))
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1120 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1121 attachments[FileContentType_Dicom] = attachment;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1122 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1123
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1124 if (index_.LookupAttachment(attachment, revision, instancePublicId, FileContentType_DicomUntilPixelData))
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1125 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1126 attachments[FileContentType_DicomUntilPixelData] = attachment;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1127 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1128
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1129 if (index_.LookupAttachment(attachment, revision, instancePublicId, FileContentType_DicomAsJson))
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1130 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1131 attachments[FileContentType_DicomAsJson] = attachment;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1132 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1133
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1134 std::string s;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1135 if (index_.LookupMetadata(s, revision, instancePublicId, ResourceType_Instance,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1136 MetadataType_Instance_PixelDataOffset))
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1137 {
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1138 metadata[MetadataType_Instance_PixelDataOffset] = s;
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1139 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1140
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1141 ReadDicomAsJson(result, instancePublicId, metadata, attachments, ignoreTagLength);
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1142 }
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1143
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1144
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1145 void ServerContext::ReadDicomAsJson(Json::Value& result,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1146 const std::string& instancePublicId,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1147 const std::map<MetadataType, std::string>& instanceMetadata,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1148 const std::map<FileContentType, FileInfo>& instanceAttachments,
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1149 const std::set<DicomTag>& ignoreTagLength)
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1150 {
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1151 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1152 * CASE 1: The DICOM file, truncated at pixel data, is available
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1153 * as an attachment (it was created either because the storage
4666
Alain Mazy <am@osimis.io>
parents: 4640
diff changeset
1154 * area does not support range reads, or if "StorageCompression"
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1155 * is enabled). Simply return this attachment.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1156 **/
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1157
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1158 FileInfo attachment;
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1159
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1160 if (LookupAttachment(attachment, FileContentType_DicomUntilPixelData, instanceAttachments))
2409
e4045b3c9772 ignore-length argument if retrieving DICOM tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
1161 {
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1162 std::string dicom;
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1163
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1164 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1165 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1166 accessor.Read(dicom, attachment);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1167 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1168
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1169 ParsedDicomFile parsed(dicom);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1170 OrthancConfiguration::DefaultDicomDatasetToJson(result, parsed, ignoreTagLength);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1171 InjectEmptyPixelData(result);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1172 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1173 else
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1174 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1175 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1176 * The truncated DICOM file is not stored as a standalone
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1177 * attachment. Lookup whether the pixel data offset has already
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1178 * been computed for this instance.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1179 **/
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1180
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1181 bool hasPixelDataOffset;
4519
a3c6678aa7b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1182 uint64_t pixelDataOffset = 0; // dummy initialization
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1183
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1184 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1185 std::string s;
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1186 if (LookupMetadata(s, MetadataType_Instance_PixelDataOffset, instanceMetadata))
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1187 {
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1188 hasPixelDataOffset = false;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1189
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1190 if (!s.empty())
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1191 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1192 try
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1193 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1194 pixelDataOffset = boost::lexical_cast<uint64_t>(s);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1195 hasPixelDataOffset = true;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1196 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1197 catch (boost::bad_lexical_cast&)
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1198 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1199 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1200 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1201
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1202 if (!hasPixelDataOffset)
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1203 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1204 LOG(ERROR) << "Metadata \"PixelDataOffset\" is corrupted for instance: " << instancePublicId;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1205 }
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1206 }
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1207 else
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1208 {
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1209 // This instance was created by a version of Orthanc <= 1.9.0
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1210 hasPixelDataOffset = false;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1211 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1212 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1213
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1214
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1215 if (hasPixelDataOffset &&
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1216 area_.HasReadRange() &&
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1217 LookupAttachment(attachment, FileContentType_Dicom, instanceAttachments) &&
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1218 attachment.GetCompressionType() == CompressionType_None)
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1219 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1220 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1221 * CASE 2: The pixel data offset is known, AND that a range read
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1222 * can be used to retrieve the truncated DICOM file. Note that
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1223 * this case cannot be used if "StorageCompression" option is
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1224 * "true".
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1225 **/
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1226
4900
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1227 std::string dicom;
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1228
4519
a3c6678aa7b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1229 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1230 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
5420
d37dff2c0028 Optimized the MemoryStringCache to prevent loading the same file multiple times if multiple users request the same file at the same time
Alain Mazy <am@osimis.io>
parents: 5410
diff changeset
1231 accessor.ReadStartRange(dicom, attachment, pixelDataOffset);
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1232 }
4900
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1233
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1234 assert(dicom.size() == pixelDataOffset);
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1235 ParsedDicomFile parsed(dicom);
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1236 OrthancConfiguration::DefaultDicomDatasetToJson(result, parsed, ignoreTagLength);
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1237 InjectEmptyPixelData(result);
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1238 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1239 else if (ignoreTagLength.empty() &&
5772
093a8693ba16 replaced SetRetrieveOneInstanceIdentifier() by SetRetrieveOneInstanceMetadataAndAttachments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5768
diff changeset
1240 LookupAttachment(attachment, FileContentType_DicomAsJson, instanceAttachments))
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1241 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1242 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1243 * CASE 3: This instance was created using Orthanc <=
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1244 * 1.9.0. Reuse the old "DICOM-as-JSON" attachment if available.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1245 * This is for backward compatibility: A call to
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1246 * "/tools/invalidate-tags" or to one flavors of
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1247 * "/.../.../reconstruct" will disable this case.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1248 **/
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1249
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1250 std::string dicomAsJson;
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1251
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1252 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1253 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1254 accessor.Read(dicomAsJson, attachment);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1255 }
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1256
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1257 if (!Toolbox::ReadJson(result, dicomAsJson))
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1258 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1259 throw OrthancException(ErrorCode_CorruptedFile,
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1260 "Corrupted DICOM-as-JSON attachment of instance: " + instancePublicId);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1261 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1262 }
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1263 else
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1264 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1265 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1266 * CASE 4: Neither the truncated DICOM file is accessible, nor
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1267 * the DICOM-as-JSON summary. We have to retrieve the full DICOM
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1268 * file from the storage area.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1269 **/
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1270
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1271 std::string dicom;
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1272 ReadDicom(dicom, instancePublicId);
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1273
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1274 ParsedDicomFile parsed(dicom);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1275 OrthancConfiguration::DefaultDicomDatasetToJson(result, parsed, ignoreTagLength);
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1276
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1277 if (!hasPixelDataOffset)
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1278 {
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1279 /**
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1280 * The pixel data offset was never computed for this
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1281 * instance, which indicates that it was created using
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1282 * Orthanc <= 1.9.0, or that calls to
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1283 * "LookupPixelDataOffset()" from earlier versions of
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1284 * Orthanc have failed. Try again this precomputation now
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1285 * for future calls.
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1286 **/
5316
03501a258d9e added instance metadata "PixelDataVR"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5296
diff changeset
1287 ValueRepresentation pixelDataVR;
03501a258d9e added instance metadata "PixelDataVR"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5296
diff changeset
1288 if (DicomStreamReader::LookupPixelDataOffset(pixelDataOffset, pixelDataVR, dicom) &&
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1289 pixelDataOffset < dicom.size())
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1290 {
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1291 index_.OverwriteMetadata(instancePublicId, MetadataType_Instance_PixelDataOffset,
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1292 boost::lexical_cast<std::string>(pixelDataOffset));
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1293
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1294 if (!area_.HasReadRange() ||
4519
a3c6678aa7b1 cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4514
diff changeset
1295 compressionEnabled_)
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1296 {
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1297 int64_t newRevision;
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1298 AddAttachment(newRevision, instancePublicId, ResourceType_Instance, FileContentType_DicomUntilPixelData,
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1299 dicom.empty() ? NULL: dicom.c_str(), pixelDataOffset,
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1300 false /* no old revision */, -1 /* dummy revision */, "" /* dummy MD5 */);
4514
5b929e6b3c36 removal of "dicom-as-json" attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4513
diff changeset
1301 }
4513
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1302 }
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1303 }
1f455b86b054 simplification in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4511
diff changeset
1304 }
226
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
1305 }
8a26a8e85edf refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 224
diff changeset
1306 }
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1307
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1308
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1309 void ServerContext::ReadDicomAsJson(Json::Value& result,
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1310 const std::string& instancePublicId)
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1311 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1312 std::set<DicomTag> ignoreTagLength;
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1313 ReadDicomAsJson(result, instancePublicId, ignoreTagLength);
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1314 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1315
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1316
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1317 void ServerContext::ReadDicom(std::string& dicom,
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1318 std::string& attachmentId,
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1319 const std::string& instancePublicId)
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1320 {
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1321 int64_t revision;
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1322 ReadAttachment(dicom, revision, attachmentId, instancePublicId, FileContentType_Dicom, true /* uncompress */);
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1323 }
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1324
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1325
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1326 void ServerContext::ReadDicom(std::string& dicom,
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1327 const std::string& instancePublicId)
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1328 {
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1329 std::string attachmentId;
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1330 ReadDicom(dicom, attachmentId, instancePublicId);
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1331 }
4792
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1332
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1333 void ServerContext::ReadDicomForHeader(std::string& dicom,
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1334 const std::string& instancePublicId)
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1335 {
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1336 if (!ReadDicomUntilPixelData(dicom, instancePublicId))
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1337 {
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1338 ReadDicom(dicom, instancePublicId);
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1339 }
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1340 }
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1341
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1342 bool ServerContext::ReadDicomUntilPixelData(std::string& dicom,
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1343 const std::string& instancePublicId)
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1344 {
5333
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1345 FileInfo attachment;
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1346 int64_t revision; // Ignored
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1347 if (index_.LookupAttachment(attachment, revision, instancePublicId, FileContentType_DicomUntilPixelData))
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1348 {
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1349 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1350
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1351 accessor.Read(dicom, attachment);
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1352 assert(dicom.size() == attachment.GetUncompressedSize());
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1353
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1354 return true;
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1355 }
816968b5a031 speeded up ServerContext::ReadDicomUntilPixelData() if storage compression is on
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5330
diff changeset
1356
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1357 if (!area_.HasReadRange())
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1358 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1359 return false;
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1360 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1361
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1362 if (!index_.LookupAttachment(attachment, revision, instancePublicId, FileContentType_Dicom))
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1363 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1364 throw OrthancException(ErrorCode_InternalError,
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1365 "Unable to read the DICOM file of instance " + instancePublicId);
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1366 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1367
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1368 std::string s;
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1369
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1370 if (attachment.GetCompressionType() == CompressionType_None &&
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1371 index_.LookupMetadata(s, revision, instancePublicId, ResourceType_Instance,
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1372 MetadataType_Instance_PixelDataOffset) &&
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1373 !s.empty())
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1374 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1375 try
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1376 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1377 uint64_t pixelDataOffset = boost::lexical_cast<uint64_t>(s);
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1378
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1379 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
4792
434843934307 Added a StorageCache in the StorageAccessor
Alain Mazy <am@osimis.io>
parents: 4789
diff changeset
1380
5420
d37dff2c0028 Optimized the MemoryStringCache to prevent loading the same file multiple times if multiple users request the same file at the same time
Alain Mazy <am@osimis.io>
parents: 5410
diff changeset
1381 accessor.ReadStartRange(dicom, attachment, pixelDataOffset);
4900
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1382 assert(dicom.size() == pixelDataOffset);
ea5f1c6ed07e fix cache of storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4892
diff changeset
1383
4511
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1384 return true; // Success
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1385 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1386 catch (boost::bad_lexical_cast&)
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1387 {
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1388 LOG(ERROR) << "Metadata \"PixelDataOffset\" is corrupted for instance: " << instancePublicId;
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1389 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1390 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1391
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1392 return false;
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1393 }
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1394
1ec156a0da38 ServerContext::ReadDicomUntilPixelData()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4509
diff changeset
1395
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
1396 void ServerContext::ReadAttachment(std::string& result,
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1397 int64_t& revision,
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1398 std::string& attachmentId,
2128
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
1399 const std::string& instancePublicId,
9329ba17a069 Possibility to DELETE "dicom-as-json" attachments to reconstruct them
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2127
diff changeset
1400 FileContentType content,
5048
22966345eaba skip StorageCache when verifying md5 or when re-compressing attachments
Alain Mazy <am@osimis.io>
parents: 5044
diff changeset
1401 bool uncompressIfNeeded,
22966345eaba skip StorageCache when verifying md5 or when re-compressing attachments
Alain Mazy <am@osimis.io>
parents: 5044
diff changeset
1402 bool skipCache)
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1403 {
232
5368bbe813cf refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 227
diff changeset
1404 FileInfo attachment;
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1405 if (!index_.LookupAttachment(attachment, revision, instancePublicId, content))
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1406 {
2956
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
1407 throw OrthancException(ErrorCode_InternalError,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
1408 "Unable to read attachment " + EnumerationToString(content) +
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2950
diff changeset
1409 " of instance " + instancePublicId);
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1410 }
1550
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1549
diff changeset
1411
3175
574890d14c92 new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3174
diff changeset
1412 assert(attachment.GetContentType() == content);
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1413 attachmentId = attachment.GetUuid();
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
1414
1550
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1549
diff changeset
1415 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1416 std::unique_ptr<StorageAccessor> accessor;
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1417
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1418 if (skipCache)
5048
22966345eaba skip StorageCache when verifying md5 or when re-compressing attachments
Alain Mazy <am@osimis.io>
parents: 5044
diff changeset
1419 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1420 accessor.reset(new StorageAccessor(area_, GetMetricsRegistry()));
5048
22966345eaba skip StorageCache when verifying md5 or when re-compressing attachments
Alain Mazy <am@osimis.io>
parents: 5044
diff changeset
1421 }
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1422 else
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1423 {
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1424 accessor.reset(new StorageAccessor(area_, storageCache_, GetMetricsRegistry()));
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1425 }
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1426
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1427 if (uncompressIfNeeded)
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1428 {
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1429 accessor->Read(result, attachment);
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1430 }
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1431 else
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1432 {
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1433 // Do not uncompress the content of the storage area, return the
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1434 // raw data
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1435 accessor->ReadRaw(result, attachment);
4509
98b7b9d21d83 removed ServerContext::ReadAttachment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4508
diff changeset
1436 }
1550
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1549
diff changeset
1437 }
227
209ca3f6db62 dicom-scu from rest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 226
diff changeset
1438 }
285
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
1439
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
1440
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1441 ServerContext::DicomCacheLocker::DicomCacheLocker(ServerContext& context,
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1442 const std::string& instancePublicId) :
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1443 context_(context),
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1444 instancePublicId_(instancePublicId)
285
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
1445 {
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1446 accessor_.reset(new ParsedDicomCache::Accessor(context_.dicomCache_, instancePublicId));
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1447
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1448 if (!accessor_->IsValid())
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1449 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1450 accessor_.reset(NULL);
285
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
1451
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1452 // Throttle to avoid loading several large DICOM files simultaneously
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1453 largeDicomLocker_.reset(new Semaphore::Locker(context.largeDicomThrottler_));
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1454
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1455 context_.ReadDicom(buffer_, instancePublicId_);
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1456
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1457 // Release the throttle if loading "small" DICOM files (under
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1458 // 50MB, which is an arbitrary value)
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1459 if (buffer_.size() < 50 * 1024 * 1024)
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1460 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1461 largeDicomLocker_.reset(NULL);
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1462 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1463
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1464 dicom_.reset(new ParsedDicomFile(buffer_));
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1465 dicomSize_ = buffer_.size();
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1466 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1467
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1468 assert(accessor_.get() != NULL ||
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1469 dicom_.get() != NULL);
778
aebf0071020e refactoring of the mutex for the dicom cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 774
diff changeset
1470 }
aebf0071020e refactoring of the mutex for the dicom cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 774
diff changeset
1471
aebf0071020e refactoring of the mutex for the dicom cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 774
diff changeset
1472
aebf0071020e refactoring of the mutex for the dicom cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 774
diff changeset
1473 ServerContext::DicomCacheLocker::~DicomCacheLocker()
aebf0071020e refactoring of the mutex for the dicom cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 774
diff changeset
1474 {
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1475 if (dicom_.get() != NULL)
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1476 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1477 try
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1478 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1479 context_.dicomCache_.Acquire(instancePublicId_, dicom_.release(), dicomSize_);
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1480 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1481 catch (OrthancException&)
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1482 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1483 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1484 }
285
4031f73fe0e4 access to the raw dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 269
diff changeset
1485 }
304
4eea080e6e7a refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 291
diff changeset
1486
4eea080e6e7a refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 291
diff changeset
1487
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1488 ParsedDicomFile& ServerContext::DicomCacheLocker::GetDicom() const
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1489 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1490 if (dicom_.get() != NULL)
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1491 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1492 return *dicom_;
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1493 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1494 else
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1495 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1496 assert(accessor_.get() != NULL);
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1497 return accessor_->GetDicom();
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1498 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1499 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1500
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1501 const std::string& ServerContext::DicomCacheLocker::GetBuffer()
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1502 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1503 if (buffer_.size() > 0)
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1504 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1505 return buffer_;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1506 }
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1507 else
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1508 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1509 context_.ReadDicom(buffer_, instancePublicId_);
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1510 return buffer_;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1511 }
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1512 }
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1513
695
c59bc408fb10 parameter to disable the computation of the MD5
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
1514 void ServerContext::SetStoreMD5ForAttachments(bool storeMD5)
c59bc408fb10 parameter to disable the computation of the MD5
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
1515 {
c59bc408fb10 parameter to disable the computation of the MD5
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
1516 LOG(INFO) << "Storing MD5 for attachments: " << (storeMD5 ? "yes" : "no");
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
1517 storeMD5_ = storeMD5;
695
c59bc408fb10 parameter to disable the computation of the MD5
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
1518 }
c59bc408fb10 parameter to disable the computation of the MD5
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
1519
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1520
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1521 bool ServerContext::AddAttachment(int64_t& newRevision,
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1522 const std::string& resourceId,
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1523 ResourceType resourceType,
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1524 FileContentType attachmentType,
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1525 const void* data,
4627
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1526 size_t size,
f7d5372b59b3 handling revisions of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4623
diff changeset
1527 bool hasOldRevision,
4640
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4629
diff changeset
1528 int64_t oldRevision,
66109d24d26e "ETag" headers for metadata and attachments now allow strong comparison (MD5 is included)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4629
diff changeset
1529 const std::string& oldMD5)
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1530 {
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1531 LOG(INFO) << "Adding attachment " << EnumerationToString(attachmentType) << " to resource " << resourceId;
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1532
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
1533 // TODO Should we use "gzip" instead?
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
1534 CompressionType compression = (compressionEnabled_ ? CompressionType_ZlibWithSize : CompressionType_None);
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1535
5184
dd085f7e7e71 cleaning new constructors of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5183
diff changeset
1536 StorageAccessor accessor(area_, storageCache_, GetMetricsRegistry());
5807
8279eaab0d1d merged default -> attach-custom-data
Alain Mazy <am@orthanc.team>
parents: 5080 5767
diff changeset
1537
5080
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1538 std::string uuid = Toolbox::GenerateUuid();
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1539 std::string customData;
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1540
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1541 assert(attachmentType != FileContentType_Dicom && attachmentType != FileContentType_DicomUntilPixelData); // this method can not be used to store instances
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1542
d7274e43ea7c allow plugins to store a customData in the Attachments table to e.g. store custom paths without requiring an external DB
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
1543 FileInfo attachment = accessor.WriteAttachment(customData, resourceId, resourceType, data, size, attachmentType, compression, storeMD5_, uuid);
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1544
4752
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1545 try
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1546 {
4752
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1547 StoreStatus status = index_.AddAttachment(
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1548 newRevision, attachment, resourceId, hasOldRevision, oldRevision, oldMD5);
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1549 if (status != StoreStatus_Success)
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1550 {
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1551 accessor.Remove(attachment);
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1552 return false;
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1553 }
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1554 else
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1555 {
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1556 return true;
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1557 }
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1558 }
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1559 catch (OrthancException&)
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1560 {
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1561 // Fixed in Orthanc 1.9.6
1549
e5e975e9b738 refactoring and simplification of StorageAccessor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1548
diff changeset
1562 accessor.Remove(attachment);
4752
2f35e6b765e5 Fix orphaned attachments if bad revision number is provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4694
diff changeset
1563 throw;
699
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1564 }
2929e17f8447 add attachments to resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 697
diff changeset
1565 }
1145
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1566
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1567
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4677
diff changeset
1568 bool ServerContext::DeleteResource(Json::Value& remainingAncestor,
1145
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1569 const std::string& uuid,
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1570 ResourceType expectedType)
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1571 {
2507
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1572 if (expectedType == ResourceType_Instance)
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1573 {
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1574 // remove the file from the DicomCache
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1575 dicomCache_.Invalidate(uuid);
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1576 }
99116ed6f38c invalidate DicomCache when deleting instance
amazy
parents: 2447
diff changeset
1577
4694
da1edb7d6332 "/tools/bulk-delete" to delete a group of multiple, unrelated resources at once
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4677
diff changeset
1578 return index_.DeleteResource(remainingAncestor, uuid, expectedType);
1145
0479d02c6778 Plugins can retrieve the path to Orthanc and to its configuration file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1134
diff changeset
1579 }
1189
6b9b02a16e99 NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1165
diff changeset
1580
6b9b02a16e99 NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1165
diff changeset
1581
1198
1169528a9a5f refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1189
diff changeset
1582 void ServerContext::SignalChange(const ServerIndexChange& change)
1189
6b9b02a16e99 NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1165
diff changeset
1583 {
4457
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1584 if (change.GetResourceType() == ResourceType_Instance &&
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1585 change.GetChangeType() == ChangeType_Deleted)
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1586 {
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1587 dicomCache_.Invalidate(change.GetPublicId());
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1588 }
789676a8c96a Refactoring and improvements to the cache of DICOM files in ServerContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
1589
1436
0a3e3be59094 uncoupling of SignalChange for Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1434
diff changeset
1590 pendingChanges_.Enqueue(change.Clone());
1189
6b9b02a16e99 NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1165
diff changeset
1591 }
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1592
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1593
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2135
diff changeset
1594 #if ORTHANC_ENABLE_PLUGINS == 1
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1595 void ServerContext::SetPlugins(OrthancPlugins& plugins)
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1596 {
3947
cf6eb4fc6841 fix issue 179: use a shared mutex to avoid deadlock in python plugins
Alain Mazy <alain@mazy.be>
parents: 3945
diff changeset
1597 boost::unique_lock<boost::shared_mutex> lock(listenersMutex_);
1459
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
1598
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1599 plugins_ = &plugins;
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1600
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1601 // TODO REFACTOR THIS
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1602 listeners_.clear();
2738
3a55b77339ff fix deadlock in Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2716
diff changeset
1603 listeners_.push_back(ServerListener(luaListener_, "Lua"));
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1604 listeners_.push_back(ServerListener(plugins, "plugin"));
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1605 }
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1606
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1607
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1608 void ServerContext::ResetPlugins()
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1609 {
3947
cf6eb4fc6841 fix issue 179: use a shared mutex to avoid deadlock in python plugins
Alain Mazy <alain@mazy.be>
parents: 3945
diff changeset
1610 boost::unique_lock<boost::shared_mutex> lock(listenersMutex_);
1459
040d58493998 security
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1456
diff changeset
1611
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1612 plugins_ = NULL;
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1613
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1614 // TODO REFACTOR THIS
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1615 listeners_.clear();
2738
3a55b77339ff fix deadlock in Lua scripts
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2716
diff changeset
1616 listeners_.push_back(ServerListener(luaListener_, "Lua"));
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1617 }
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1618
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1619
1434
f9cd40166269 refactoring of OrthancPlugins, improvement in ServeFolders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1433
diff changeset
1620 const OrthancPlugins& ServerContext::GetPlugins() const
1232
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1621 {
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1622 if (HasPlugins())
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1623 {
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1624 return *plugins_;
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1625 }
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1626 else
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1627 {
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1628 throw OrthancException(ErrorCode_InternalError);
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1629 }
f1c01451a8ee Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1198
diff changeset
1630 }
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1631
1741
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1632 OrthancPlugins& ServerContext::GetPlugins()
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1633 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1634 if (HasPlugins())
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1635 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1636 return *plugins_;
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1637 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1638 else
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1639 {
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1640 throw OrthancException(ErrorCode_InternalError);
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1641 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1642 }
06addfcd1d4c OrthancStarted and OrthancStopped events in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1701
diff changeset
1643
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1644 #endif
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1645
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1646
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1647 bool ServerContext::HasPlugins() const
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1648 {
2136
dd609a99d39a uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2135
diff changeset
1649 #if ORTHANC_ENABLE_PLUGINS == 1
1632
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1650 return (plugins_ != NULL);
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1651 #else
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1652 return false;
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1653 #endif
eb8fbcf008b5 fix build with plugins disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
1654 }
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1655
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1656
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1657 void ServerContext::Apply(ILookupVisitor& visitor,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1658 const DatabaseLookup& lookup,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1659 ResourceType queryLevel,
5683
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5669
diff changeset
1660 const std::set<std::string>& labels,
0c218d90096e moved handling of labels out of DatabaseLookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5669
diff changeset
1661 LabelsConstraint labelsConstraint,
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1662 size_t since,
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1663 size_t limit)
4196
37310bb1cd30 Fix handling of "ModalitiesInStudy" (0008,0061) in C-FIND and "/tools/find"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4143
diff changeset
1664 {
5688
d0a264b803f1 first implementation of database paging
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5686
diff changeset
1665 const uint64_t databaseLimit = GetDatabaseLimits(queryLevel);
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1666
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1667 std::vector<std::string> resources, instances;
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1668 const DicomTagConstraint* dicomModalitiesConstraint = NULL;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1669
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1670 bool hasModalitiesInStudyLookup = (queryLevel == ResourceType_Study &&
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1671 lookup.GetConstraint(dicomModalitiesConstraint, DICOM_TAG_MODALITIES_IN_STUDY) &&
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1672 ((dicomModalitiesConstraint->GetConstraintType() == ConstraintType_Equal && !dicomModalitiesConstraint->GetValue().empty()) ||
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1673 (dicomModalitiesConstraint->GetConstraintType() == ConstraintType_List && !dicomModalitiesConstraint->GetValues().empty())));
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1674
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1675 std::unique_ptr<DatabaseLookup> fastLookup(lookup.Clone());
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1676
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1677 if (hasModalitiesInStudyLookup)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1678 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1679 fastLookup->RemoveConstraint(DICOM_TAG_MODALITIES_IN_STUDY);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1680 }
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1681
5714
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
1682 const size_t lookupLimit = (databaseLimit == 0 ? 0 : databaseLimit + 1);
2b05428843d2 removed dangerous overload of ResourceFinder::Execute()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5690
diff changeset
1683 GetIndex().ApplyLookupResources(resources, &instances, *fastLookup, queryLevel, labels, labelsConstraint, lookupLimit);
3025
039a9d262d64 preparing to speed up find in databases
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3021
diff changeset
1684
3033
5da6d1063d8f effectively replacing LookupResource by DatabaseLookup in searches
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3031
diff changeset
1685 bool complete = (databaseLimit == 0 ||
3204
8792867b739a fix incorrect "too many results"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3175
diff changeset
1686 resources.size() <= databaseLimit);
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1687
3005
8265a6b56100 DicomMap::FromDicomAsJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3003
diff changeset
1688 LOG(INFO) << "Number of candidate resources after fast DB filtering on main DICOM tags: " << resources.size();
3003
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1689
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1690 /**
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1691 * "resources" contains the Orthanc ID of the resource at level
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1692 * "queryLevel", "instances" contains one the Orthanc ID of one
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1693 * sample instance from this resource.
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1694 **/
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1695 assert(resources.size() == instances.size());
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1696
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2965
diff changeset
1697 size_t countResults = 0;
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
1698 size_t skipped = 0;
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1699
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1700 const bool isDicomAsJsonNeeded = visitor.IsDicomAsJsonNeeded();
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1701
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1702 for (size_t i = 0; i < instances.size(); i++)
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1703 {
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1704 // Optimization in Orthanc 1.5.1 - Don't read the full JSON from
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1705 // the disk if only "main DICOM tags" are to be returned
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1706
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
1707 boost::shared_ptr<Json::Value> dicomAsJson;
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1708
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1709 bool hasOnlyMainDicomTags;
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1710 DicomMap dicom;
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
1711 DicomMap allMainDicomTagsFromDB;
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1712
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
1713 if (!IsStorageAccessAllowedForAnswers(findStorageAccessMode_)
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
1714 || fastLookup->HasOnlyMainDicomTags())
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1715 {
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1716 // Case (1): The main DICOM tags, as stored in the database,
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1717 // are sufficient to look for match
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1718
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
1719 if (!GetIndex().GetAllMainDicomTags(allMainDicomTagsFromDB, instances[i]))
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1720 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1721 // The instance has been removed during the execution of the
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1722 // lookup, ignore it
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1723 continue;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1724 }
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1725
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1726 // New in Orthanc 1.6.0: Only keep the main DICOM tags at the
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1727 // level of interest for the query
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1728 switch (queryLevel)
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1729 {
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1730 // WARNING: Don't reorder cases below, and don't add "break"
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1731 case ResourceType_Instance:
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
1732 dicom.MergeMainDicomTags(allMainDicomTagsFromDB, ResourceType_Instance);
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1733
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1734 case ResourceType_Series:
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
1735 dicom.MergeMainDicomTags(allMainDicomTagsFromDB, ResourceType_Series);
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1736
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1737 case ResourceType_Study:
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
1738 dicom.MergeMainDicomTags(allMainDicomTagsFromDB, ResourceType_Study);
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1739
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1740 case ResourceType_Patient:
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
1741 dicom.MergeMainDicomTags(allMainDicomTagsFromDB, ResourceType_Patient);
3679
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1742 break;
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1743
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1744 default:
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1745 throw OrthancException(ErrorCode_InternalError);
6358923d3ced C-FIND: forbid wildcard matching on some VRs, ignore main tags below the queried level
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3677
diff changeset
1746 }
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1747
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1748 hasOnlyMainDicomTags = true;
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1749 }
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1750 else
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1751 {
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1752 // Case (2): Need to read the "DICOM-as-JSON" attachment from
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1753 // the storage area
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1754 dicomAsJson.reset(new Json::Value);
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1755 ReadDicomAsJson(*dicomAsJson, instances[i]);
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1756
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1757 dicom.FromDicomAsJson(*dicomAsJson);
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1758
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1759 // This map contains the entire JSON, i.e. more than the main DICOM tags
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1760 hasOnlyMainDicomTags = false;
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1761 }
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1762
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1763 if (fastLookup->IsMatch(dicom))
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1764 {
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1765 bool isMatch = true;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1766
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1767 if (hasModalitiesInStudyLookup)
2304
563bf878407a Argument "Since" in URI "/tools/find" (related to issue 53)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
1768 {
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1769 std::set<DicomTag> requestedTags;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1770 requestedTags.insert(DICOM_TAG_MODALITIES_IN_STUDY);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1771 ExpandedResource resource;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1772 ComputeStudyTags(resource, *this, resources[i], requestedTags);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1773
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1774 std::vector<std::string> modalities;
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
1775 Toolbox::TokenizeString(modalities, resource.GetMainDicomTags().GetValue(DICOM_TAG_MODALITIES_IN_STUDY).GetContent(), '\\');
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1776 bool hasAtLeastOneModalityMatching = false;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1777 for (size_t m = 0; m < modalities.size(); m++)
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1778 {
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1779 hasAtLeastOneModalityMatching |= dicomModalitiesConstraint->IsMatch(modalities[m]);
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1780 }
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1781
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1782 isMatch = isMatch && hasAtLeastOneModalityMatching;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1783 // copy the value of ModalitiesInStudy such that it can be reused to build the answer
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
1784 allMainDicomTagsFromDB.SetValue(DICOM_TAG_MODALITIES_IN_STUDY, resource.GetMainDicomTags().GetValue(DICOM_TAG_MODALITIES_IN_STUDY));
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1785 }
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1786
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1787 if (isMatch)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1788 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1789 if (skipped < since)
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1790 {
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1791 skipped++;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1792 }
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1793 else if (limit != 0 &&
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1794 countResults >= limit)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1795 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1796 // Too many results, don't mark as complete
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1797 complete = false;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1798 break;
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1799 }
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1800 else
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1801 {
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
1802 if (IsStorageAccessAllowedForAnswers(findStorageAccessMode_) &&
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1803 dicomAsJson.get() == NULL &&
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1804 isDicomAsJsonNeeded)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1805 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1806 dicomAsJson.reset(new Json::Value);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1807 ReadDicomAsJson(*dicomAsJson, instances[i]);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1808 }
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1809
4978
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1810 if (hasOnlyMainDicomTags)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1811 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1812 // This is Case (1): The variable "dicom" only contains the main DICOM tags
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1813 visitor.Visit(resources[i], instances[i], allMainDicomTagsFromDB, dicomAsJson.get());
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1814 }
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1815 else
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1816 {
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1817 // Remove the non-main DICOM tags from "dicom" if Case (2)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1818 // was used, for consistency with Case (1)
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1819
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1820 DicomMap mainDicomTags;
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1821 mainDicomTags.ExtractMainDicomTags(dicom);
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1822 visitor.Visit(resources[i], instances[i], mainDicomTags, dicomAsJson.get());
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1823 }
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1824
2cfa50d8eb60 Speed-up handling of DicomModalitiesInStudy in C-Find and tools/find queries
Alain Mazy <am@osimis.io>
parents: 4977
diff changeset
1825 countResults ++;
3012
af1530b45290 Optimization: On finds, do not read JSON (disk) if main DICOM tags (DB) are sufficient
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3005
diff changeset
1826 }
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1827 }
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1828 }
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1829 }
3001
7695a9c81099 refactoring /tools/find using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2965
diff changeset
1830
3003
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1831 if (complete)
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1832 {
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1833 visitor.MarkAsComplete();
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1834 }
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1835
5ae3ff2398e9 refactoring OrthancFindRequestHandler using LookupResource::IVisitor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3001
diff changeset
1836 LOG(INFO) << "Number of matching resources: " << countResults;
1757
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1837 }
98abb8d7f905 ServerContext::Apply lookup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1741
diff changeset
1838
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1839 bool ServerContext::LookupOrReconstructMetadata(std::string& target,
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1840 const std::string& publicId,
4460
6831de40acd9 New metadata automatically computed at the series level: "RemoteAET"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4457
diff changeset
1841 ResourceType level,
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1842 MetadataType metadata)
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1843 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1844 // This is a backwards-compatibility function, that can
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1845 // reconstruct metadata that were not generated by an older
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1846 // release of Orthanc
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1847
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1848 if (metadata == MetadataType_Instance_SopClassUid ||
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1849 metadata == MetadataType_Instance_TransferSyntax)
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1850 {
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1851 int64_t revision; // Ignored
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1852 if (index_.LookupMetadata(target, revision, publicId, level, metadata))
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1853 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1854 return true;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1855 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1856 else
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1857 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1858 // These metadata are mandatory in DICOM instances, and were
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1859 // introduced in Orthanc 1.2.0. The fact that
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1860 // "LookupMetadata()" has failed indicates that this database
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1861 // comes from an older release of Orthanc.
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1862
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1863 DicomTag tag(0, 0);
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1864
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1865 switch (metadata)
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1866 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1867 case MetadataType_Instance_SopClassUid:
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1868 tag = DICOM_TAG_SOP_CLASS_UID;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1869 break;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1870
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1871 case MetadataType_Instance_TransferSyntax:
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1872 tag = DICOM_TAG_TRANSFER_SYNTAX_UID;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1873 break;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1874
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1875 default:
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1876 throw OrthancException(ErrorCode_InternalError);
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1877 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1878
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1879 Json::Value dicomAsJson;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1880 ReadDicomAsJson(dicomAsJson, publicId);
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1881
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1882 DicomMap tags;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1883 tags.FromDicomAsJson(dicomAsJson);
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1884
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1885 const DicomValue* value = tags.TestAndGetValue(tag);
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1886
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1887 if (value != NULL &&
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1888 !value->IsNull() &&
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1889 !value->IsBinary())
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1890 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1891 target = value->GetContent();
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1892
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1893 // Store for reuse
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1894 index_.OverwriteMetadata(publicId, metadata, target);
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1895 return true;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1896 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1897 else
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1898 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1899 // Should never happen
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1900 return false;
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1901 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1902 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1903 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1904 else
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1905 {
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1906 // No backward
4623
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1907 int64_t revision; // Ignored
95ffe3b6ef7c handling of revisions for metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4607
diff changeset
1908 return index_.LookupMetadata(target, revision, publicId, level, metadata);
3015
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1909 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1910 }
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1911
abe49ca61cd5 On C-FIND, avoid accessing the storage area whenever possible
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3012
diff changeset
1912
2626
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1913 void ServerContext::AddChildInstances(SetOfInstancesJob& job,
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1914 const std::string& publicId)
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1915 {
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1916 std::list<std::string> instances;
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1917 GetIndex().GetChildInstances(instances, publicId);
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1918
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1919 job.Reserve(job.GetInstancesCount() + instances.size());
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1920
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1921 for (std::list<std::string>::const_iterator
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1922 it = instances.begin(); it != instances.end(); ++it)
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1923 {
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1924 job.AddInstance(*it);
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1925 }
e09021ddc00d cleanup
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2617
diff changeset
1926 }
2940
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1927
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1928
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1929 void ServerContext::SignalUpdatedModalities()
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1930 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1931 #if ORTHANC_ENABLE_PLUGINS == 1
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1932 if (HasPlugins())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1933 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1934 GetPlugins().SignalUpdatedModalities();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1935 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1936 #endif
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1937 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1938
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1939
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1940 void ServerContext::SignalUpdatedPeers()
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1941 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1942 #if ORTHANC_ENABLE_PLUGINS == 1
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1943 if (HasPlugins())
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1944 {
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1945 GetPlugins().SignalUpdatedPeers();
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1946 }
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1947 #endif
4767d36679ed refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2925
diff changeset
1948 }
3660
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1949
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1950
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1951 IStorageCommitmentFactory::ILookupHandler*
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1952 ServerContext::CreateStorageCommitment(const std::string& jobId,
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1953 const std::string& transactionUid,
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1954 const std::vector<std::string>& sopClassUids,
3662
d8371b4302ff OrthancPluginRegisterStorageCommitmentScpCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3660
diff changeset
1955 const std::vector<std::string>& sopInstanceUids,
d8371b4302ff OrthancPluginRegisterStorageCommitmentScpCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3660
diff changeset
1956 const std::string& remoteAet,
d8371b4302ff OrthancPluginRegisterStorageCommitmentScpCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3660
diff changeset
1957 const std::string& calledAet)
3660
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1958 {
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1959 #if ORTHANC_ENABLE_PLUGINS == 1
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1960 if (HasPlugins())
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1961 {
3662
d8371b4302ff OrthancPluginRegisterStorageCommitmentScpCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3660
diff changeset
1962 return GetPlugins().CreateStorageCommitment(
d8371b4302ff OrthancPluginRegisterStorageCommitmentScpCallback()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3660
diff changeset
1963 jobId, transactionUid, sopClassUids, sopInstanceUids, remoteAet, calledAet);
3660
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1964 }
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1965 #endif
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1966
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1967 return NULL;
f159b731c47d IStorageCommitmentFactory
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3640
diff changeset
1968 }
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
1969
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
1970
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1971
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1972
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1973
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
1974 ImageAccessor* ServerContext::DecodeDicomFrame(const std::string& publicId,
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
1975 unsigned int frameIndex)
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
1976 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1977 ServerContext::DicomCacheLocker locker(*this, publicId);
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1978 std::unique_ptr<ImageAccessor> decoded(DecodeDicomFrame(locker.GetDicom(), locker.GetBuffer().c_str(), locker.GetBuffer().size(), frameIndex));
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1979
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1980 if (decoded.get() == NULL)
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1981 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1982 OrthancConfiguration::ReaderLock configLock;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1983 if (configLock.GetConfiguration().IsWarningEnabled(Warnings_003_DecoderFailure))
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1984 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1985 LOG(WARNING) << "W003: Unable to decode frame " << frameIndex << " from instance " << publicId;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1986 }
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1987 return NULL;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1988 }
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1989
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1990 return decoded.release();
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1991 }
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1992
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1993
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1994 ImageAccessor* ServerContext::DecodeDicomFrame(const ParsedDicomFile& parsedDicom,
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1995 const void* buffer, // actually the buffer that is the source of the ParsedDicomFile
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1996 size_t size,
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1997 unsigned int frameIndex)
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1998 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
1999 std::unique_ptr<ImageAccessor> decoded;
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2000
3931
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2001 if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before)
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2002 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2003 // Use Orthanc's built-in decoder
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2004
4265
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2005 try
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2006 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2007 decoded.reset(parsedDicom.DecodeFrame(frameIndex));
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2008 if (decoded.get() != NULL)
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2009 {
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2010 return decoded.release();
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2011 }
4265
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2012 }
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2013 catch (OrthancException& e)
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2014 { // ignore, we'll try other alternatives
3931
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2015 }
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2016 }
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2017
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2018 #if ORTHANC_ENABLE_PLUGINS == 1
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2019 if (HasPlugins() &&
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2020 GetPlugins().HasCustomImageDecoder())
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2021 {
4265
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2022 try
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2023 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2024 decoded.reset(GetPlugins().Decode(buffer, size, frameIndex));
4265
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2025 }
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2026 catch (OrthancException& e)
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2027 {
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2028 }
f9eaf14d3d19 Fix decoding sequence if "BuiltinDecoderTranscoderOrder" is "Before"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4218
diff changeset
2029
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2030 if (decoded.get() != NULL)
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2031 {
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2032 return decoded.release();
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2033 }
3931
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2034 else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After)
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2035 {
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2036 LOG(INFO) << "The installed image decoding plugins cannot handle an image, "
3930
b99acc213937 transcoder plugins and GDCM transcoding are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3928
diff changeset
2037 << "fallback to the built-in DCMTK decoder";
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2038 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2039 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2040 #endif
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2041
3931
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2042 if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After)
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2043 {
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2044 try
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2045 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2046 decoded.reset(parsedDicom.DecodeFrame(frameIndex));
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2047 if (decoded.get() != NULL)
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2048 {
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2049 return decoded.release();
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2050 }
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2051 }
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2052 catch (OrthancException& e)
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2053 {
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2054 LOG(INFO) << e.GetDetails();
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2055 }
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2056 }
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2057
5767
b4fbd9d2c907 fix compilation if plugins are disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5743
diff changeset
2058 #if ORTHANC_ENABLE_PLUGINS == 1
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2059 if (HasPlugins() && GetPlugins().HasCustomTranscoder())
3931
e6606d3ec892 new configuration option: BuiltinDecoderTranscoderOrder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
2060 {
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2061 LOG(INFO) << "The plugins and built-in image decoders failed to decode a frame, "
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2062 << "trying to transcode the file to LittleEndianExplicit using the plugins.";
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2063 DicomImage explicitTemporaryImage;
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2064 DicomImage source;
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2065 std::set<DicomTransferSyntax> allowedSyntaxes;
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2066
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2067 source.SetExternalBuffer(buffer, size);
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2068 allowedSyntaxes.insert(DicomTransferSyntax_LittleEndianExplicit);
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2069
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2070 if (Transcode(explicitTemporaryImage, source, allowedSyntaxes, true))
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2071 {
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2072 std::unique_ptr<ParsedDicomFile> file(explicitTemporaryImage.ReleaseAsParsedDicomFile());
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2073 return file->DecodeFrame(frameIndex);
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2074 }
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2075 }
5767
b4fbd9d2c907 fix compilation if plugins are disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5743
diff changeset
2076 #endif
5742
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2077
078b724dcbf8 if frame decoding fails, transcode to LittleEndianExplicit using plugins and decode with built-in decoder
Alain Mazy <am@orthanc.team>
parents: 5683
diff changeset
2078 return NULL;
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2079 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2080
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2081
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2082 ImageAccessor* ServerContext::DecodeDicomFrame(const DicomInstanceToStore& dicom,
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2083 unsigned int frameIndex)
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2084 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2085 return DecodeDicomFrame(dicom.GetParsedDicomFile(),
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2086 dicom.GetBufferData(),
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2087 dicom.GetBufferSize(),
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2088 frameIndex);
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2089
3928
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2090 }
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2091
4cdc875510d1 ServerContext::DecodeDicomFrame()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3913
diff changeset
2092
3980
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2093 ImageAccessor* ServerContext::DecodeDicomFrame(const void* dicom,
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2094 size_t size,
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2095 unsigned int frameIndex)
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2096 {
5743
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2097 std::unique_ptr<ParsedDicomFile> instance(new ParsedDicomFile(dicom, size));
8bb3f2fca242 refactored ServerContext::DecodeDicomFrame to have a single implementation
Alain Mazy <am@orthanc.team>
parents: 5742
diff changeset
2098 return DecodeDicomFrame(*instance, dicom, size, frameIndex);
3980
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2099 }
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2100
e42f5445d20d Fix decoding of DICOM images for plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3951
diff changeset
2101
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2102 void ServerContext::StoreWithTranscoding(std::string& sopClassUid,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2103 std::string& sopInstanceUid,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2104 DicomStoreUserConnection& connection,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2105 const std::string& dicom,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2106 bool hasMoveOriginator,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2107 const std::string& moveOriginatorAet,
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2108 uint16_t moveOriginatorId)
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2109 {
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2110 const void* data = dicom.empty() ? NULL : dicom.c_str();
5438
7a20ee948676 Added a new 'Telemis' manufacturer for DicomModalities
Alain Mazy <am@osimis.io>
parents: 5436
diff changeset
2111 const RemoteModalityParameters& modality = connection.GetParameters().GetRemoteModality();
7a20ee948676 Added a new 'Telemis' manufacturer for DicomModalities
Alain Mazy <am@osimis.io>
parents: 5436
diff changeset
2112
3911
0ef7f4528be2 renamed option TranscodingEnabled to TranscodeDicomProtocol
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
2113 if (!transcodeDicomProtocol_ ||
5438
7a20ee948676 Added a new 'Telemis' manufacturer for DicomModalities
Alain Mazy <am@osimis.io>
parents: 5436
diff changeset
2114 !modality.IsTranscodingAllowed())
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2115 {
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2116 connection.Store(sopClassUid, sopInstanceUid, data, dicom.size(),
5442
ac68a4383e51 improved C-Store negotiation and logging
Alain Mazy <am@osimis.io>
parents: 5438
diff changeset
2117 hasMoveOriginator, moveOriginatorAet, moveOriginatorId);
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2118 }
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2119 else
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2120 {
4465
fe774d8e904b New configuration option: "DicomScuPreferredTransferSyntax" to control transcoding in C-STORE SCU
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4460
diff changeset
2121 connection.Transcode(sopClassUid, sopInstanceUid, *this, data, dicom.size(), preferredTransferSyntax_,
5442
ac68a4383e51 improved C-Store negotiation and logging
Alain Mazy <am@osimis.io>
parents: 5438
diff changeset
2122 hasMoveOriginator, moveOriginatorAet, moveOriginatorId);
3894
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2123 }
8f7ad4989fec transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3839
diff changeset
2124 }
3930
b99acc213937 transcoder plugins and GDCM transcoding are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3928
diff changeset
2125
b99acc213937 transcoder plugins and GDCM transcoding are working
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3928
diff changeset
2126
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2127 bool ServerContext::TranscodeWithCache(std::string& target,
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2128 const std::string& source,
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2129 const std::string& sourceInstanceId,
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2130 const std::string& attachmentId,
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2131 DicomTransferSyntax targetSyntax)
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2132 {
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2133 StorageCache::Accessor cacheAccessor(storageCache_);
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2134
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2135 if (!cacheAccessor.FetchTranscodedInstance(target, attachmentId, targetSyntax))
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2136 {
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2137 IDicomTranscoder::DicomImage sourceDicom;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2138 sourceDicom.SetExternalBuffer(source);
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2139
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2140 IDicomTranscoder::DicomImage targetDicom;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2141 std::set<DicomTransferSyntax> syntaxes;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2142 syntaxes.insert(targetSyntax);
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2143
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2144 if (Transcode(targetDicom, sourceDicom, syntaxes, true))
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2145 {
5427
111e21b4f8bc fix transcoded instance caching
Alain Mazy <am@osimis.io>
parents: 5426
diff changeset
2146 cacheAccessor.AddTranscodedInstance(attachmentId, targetSyntax, reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize());
5426
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2147 target = std::string(reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize());
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2148 return true;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2149 }
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2150
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2151 return false;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2152 }
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2153
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2154 return true;
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2155 }
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2156
c65e036d649b StorageCache is now storing transcoded instances + added ?transcode=... option to the /file route.
Alain Mazy <am@osimis.io>
parents: 5420
diff changeset
2157
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2158 bool ServerContext::Transcode(DicomImage& target,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2159 DicomImage& source /* in, "GetParsed()" possibly modified */,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2160 const std::set<DicomTransferSyntax>& allowedSyntaxes,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2161 bool allowNewSopInstanceUid)
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2162 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2163 if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before)
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2164 {
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3947
diff changeset
2165 if (dcmtkTranscoder_->Transcode(target, source, allowedSyntaxes, allowNewSopInstanceUid))
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2166 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2167 return true;
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2168 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2169 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2170
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2171 #if ORTHANC_ENABLE_PLUGINS == 1
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2172 if (HasPlugins() &&
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2173 GetPlugins().HasCustomTranscoder())
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2174 {
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3947
diff changeset
2175 if (GetPlugins().Transcode(target, source, allowedSyntaxes, allowNewSopInstanceUid))
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2176 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2177 return true;
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2178 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2179 else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After)
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2180 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2181 LOG(INFO) << "The installed transcoding plugins cannot handle an image, "
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2182 << "fallback to the built-in DCMTK transcoder";
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2183 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2184 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2185 #endif
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2186
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2187 if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After)
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2188 {
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3947
diff changeset
2189 return dcmtkTranscoder_->Transcode(target, source, allowedSyntaxes, allowNewSopInstanceUid);
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2190 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2191 else
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2192 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2193 return false;
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2194 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3941
diff changeset
2195 }
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2196
4376
b002f9abe802 review of changeset 4375:208029732d51
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4375
diff changeset
2197 const std::string& ServerContext::GetDeidentifiedContent(const DicomElement &element) const
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2198 {
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2199 static const std::string redactedContent = "*** POTENTIAL PHI ***";
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2200 static const std::string emptyContent = "";
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2201
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2202 const DicomTag& tag = element.GetTag();
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2203 if (element.GetValue().IsSequence())
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2204 {
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2205 return emptyContent;
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2206 }
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2207
4789
51ec061516c9 Fix handling of option "DeidentifyLogs", notably for tags (0010,0010) and (0010,0020)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4752
diff changeset
2208 if (deidentifyLogs_ &&
51ec061516c9 Fix handling of option "DeidentifyLogs", notably for tags (0010,0010) and (0010,0020)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4752
diff changeset
2209 !element.GetValue().GetContent().empty() &&
51ec061516c9 Fix handling of option "DeidentifyLogs", notably for tags (0010,0010) and (0010,0020)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4752
diff changeset
2210 logsDeidentifierRules_.IsAlteredTag(tag))
4375
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2211 {
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2212 return redactedContent;
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2213 }
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2214 else
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2215 {
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2216 return element.GetValue().GetContent();
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2217 }
208029732d51 New config option "DeidentifyDimseQueryLogs"
Mark Poscablo <Mark.Poscablo@varian.com>
parents: 4274
diff changeset
2218 }
4473
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2219
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2220
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2221 void ServerContext::GetAcceptedTransferSyntaxes(std::set<DicomTransferSyntax>& syntaxes)
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2222 {
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2223 boost::mutex::scoped_lock lock(dynamicOptionsMutex_);
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2224 syntaxes = acceptedTransferSyntaxes_;
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2225 }
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2226
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2227
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2228 void ServerContext::SetAcceptedTransferSyntaxes(const std::set<DicomTransferSyntax>& syntaxes)
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2229 {
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2230 boost::mutex::scoped_lock lock(dynamicOptionsMutex_);
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2231 acceptedTransferSyntaxes_ = syntaxes;
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2232 }
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2233
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2234
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2235 bool ServerContext::IsUnknownSopClassAccepted()
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2236 {
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2237 boost::mutex::scoped_lock lock(dynamicOptionsMutex_);
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2238 return isUnknownSopClassAccepted_;
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2239 }
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2240
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2241
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2242 void ServerContext::SetUnknownSopClassAccepted(bool accepted)
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2243 {
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2244 boost::mutex::scoped_lock lock(dynamicOptionsMutex_);
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2245 isUnknownSopClassAccepted_ = accepted;
68f52897c119 new URIs: /tools/accepted-transfer-syntaxes and /tools/unknown-sop-class-accepted to replace Lua callbacks for transfer syntaxes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4465
diff changeset
2246 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2247
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2248
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2249 static void SerializeExpandedResource(Json::Value& target,
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2250 const ExpandedResource& resource,
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
2251 DicomToJsonFormat format,
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2252 const std::set<DicomTag>& requestedTags,
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2253 ExpandResourceFlags expandFlags)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2254 {
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2255 target = Json::objectValue;
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2256
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2257 target["Type"] = GetResourceTypeText(resource.GetLevel(), false, true);
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2258 target["ID"] = resource.GetPublicId();
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2259
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2260 if (!resource.parentId_.empty())
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2261 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2262 switch (resource.GetLevel())
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2263 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2264 case ResourceType_Patient:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2265 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2266
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2267 case ResourceType_Study:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2268 target["ParentPatient"] = resource.parentId_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2269 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2270
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2271 case ResourceType_Series:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2272 target["ParentStudy"] = resource.parentId_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2273 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2274
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2275 case ResourceType_Instance:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2276 target["ParentSeries"] = resource.parentId_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2277 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2278
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2279 default:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2280 throw OrthancException(ErrorCode_InternalError);
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2281 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2282 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2283
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2284 if ((expandFlags & ExpandResourceFlags_IncludeChildren) != 0)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2285 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2286 switch (resource.GetLevel())
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2287 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2288 case ResourceType_Patient:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2289 case ResourceType_Study:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2290 case ResourceType_Series:
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2291 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2292 Json::Value c = Json::arrayValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2293
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2294 for (std::list<std::string>::const_iterator
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2295 it = resource.childrenIds_.begin(); it != resource.childrenIds_.end(); ++it)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2296 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2297 c.append(*it);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2298 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2299
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2300 if (resource.GetLevel() == ResourceType_Patient)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2301 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2302 target["Studies"] = c;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2303 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2304 else if (resource.GetLevel() == ResourceType_Study)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2305 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2306 target["Series"] = c;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2307 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2308 else
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2309 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2310 target["Instances"] = c;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2311 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2312 break;
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2313 }
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2314
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2315 case ResourceType_Instance:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2316 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2317
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2318 default:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2319 throw OrthancException(ErrorCode_InternalError);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2320 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2321 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2322
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2323 if ((expandFlags & ExpandResourceFlags_IncludeMetadata) != 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2324 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2325 switch (resource.GetLevel())
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2326 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2327 case ResourceType_Patient:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2328 case ResourceType_Study:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2329 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2330
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2331 case ResourceType_Series:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2332 if (resource.expectedNumberOfInstances_ < 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2333 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2334 target["ExpectedNumberOfInstances"] = Json::nullValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2335 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2336 else
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2337 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2338 target["ExpectedNumberOfInstances"] = resource.expectedNumberOfInstances_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2339 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2340 target["Status"] = resource.status_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2341 break;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2342
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2343 case ResourceType_Instance:
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2344 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2345 target["FileSize"] = static_cast<unsigned int>(resource.fileSize_);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2346 target["FileUuid"] = resource.fileUuid_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2347
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2348 if (resource.indexInSeries_ < 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2349 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2350 target["IndexInSeries"] = Json::nullValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2351 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2352 else
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2353 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2354 target["IndexInSeries"] = resource.indexInSeries_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2355 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2356
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2357 break;
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2358 }
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2359
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2360 default:
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2361 throw OrthancException(ErrorCode_InternalError);
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2362 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2363
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2364 if (!resource.anonymizedFrom_.empty())
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2365 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2366 target["AnonymizedFrom"] = resource.anonymizedFrom_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2367 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2368
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2369 if (!resource.modifiedFrom_.empty())
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2370 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2371 target["ModifiedFrom"] = resource.modifiedFrom_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2372 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2373 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2374
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2375 if (resource.GetLevel() == ResourceType_Patient ||
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2376 resource.GetLevel() == ResourceType_Study ||
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2377 resource.GetLevel() == ResourceType_Series)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2378 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2379 if ((expandFlags & ExpandResourceFlags_IncludeIsStable) != 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2380 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2381 target["IsStable"] = resource.isStable_;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2382 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2383
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2384 if (!resource.lastUpdate_.empty())
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2385 {
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2386 target["LastUpdate"] = resource.lastUpdate_;
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2387 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2388 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2389
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2390 if ((expandFlags & ExpandResourceFlags_IncludeMainDicomTags) != 0)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2391 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2392 // serialize tags
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2393
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2394 static const char* const MAIN_DICOM_TAGS = "MainDicomTags";
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2395 static const char* const PATIENT_MAIN_DICOM_TAGS = "PatientMainDicomTags";
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2396
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2397 DicomMap mainDicomTags;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2398 resource.GetMainDicomTags().ExtractResourceInformation(mainDicomTags, resource.GetLevel());
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2399
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2400 target[MAIN_DICOM_TAGS] = Json::objectValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2401 FromDcmtkBridge::ToJson(target[MAIN_DICOM_TAGS], mainDicomTags, format);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2402
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2403 if (resource.GetLevel() == ResourceType_Study)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2404 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2405 DicomMap patientMainDicomTags;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2406 resource.GetMainDicomTags().ExtractPatientInformation(patientMainDicomTags);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2407
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2408 target[PATIENT_MAIN_DICOM_TAGS] = Json::objectValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2409 FromDcmtkBridge::ToJson(target[PATIENT_MAIN_DICOM_TAGS], patientMainDicomTags, format);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2410 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2411
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2412 if (requestedTags.size() > 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2413 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2414 static const char* const REQUESTED_TAGS = "RequestedTags";
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2415
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2416 DicomMap tags;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2417 resource.GetMainDicomTags().ExtractTags(tags, requestedTags);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2418
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2419 target[REQUESTED_TAGS] = Json::objectValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2420 FromDcmtkBridge::ToJson(target[REQUESTED_TAGS], tags, format);
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2421
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2422 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2423 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2424
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2425 if ((expandFlags & ExpandResourceFlags_IncludeLabels) != 0)
5221
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2426 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2427 Json::Value labels = Json::arrayValue;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2428
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2429 for (std::set<std::string>::const_iterator it = resource.labels_.begin(); it != resource.labels_.end(); ++it)
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2430 {
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2431 labels.append(*it);
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2432 }
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2433
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2434 target["Labels"] = labels;
d0f7c742d397 started implementation of labels
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5220
diff changeset
2435 }
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2436
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2437 // new in Orthanc 1.12.4
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2438 if ((expandFlags & ExpandResourceFlags_IncludeAllMetadata) != 0)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2439 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2440 Json::Value metadata = Json::objectValue;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2441
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2442 for (std::map<MetadataType, std::string>::const_iterator it = resource.metadata_.begin(); it != resource.metadata_.end(); ++it)
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2443 {
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2444 metadata[EnumerationToString(it->first)] = it->second;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2445 }
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2446
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2447 target["Metadata"] = metadata;
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2448 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2449 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2450
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2451
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2452 static void ComputeInstanceTags(ExpandedResource& resource,
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2453 ServerContext& context,
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2454 const std::string& instancePublicId,
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2455 const std::set<DicomTag>& requestedTags)
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2456 {
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2457 if (requestedTags.count(DICOM_TAG_INSTANCE_AVAILABILITY) > 0)
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2458 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2459 resource.GetMainDicomTags().SetValue(DICOM_TAG_INSTANCE_AVAILABILITY, "ONLINE", false);
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2460 resource.missingRequestedTags_.erase(DICOM_TAG_INSTANCE_AVAILABILITY);
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2461 }
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2462 }
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2463
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2464
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2465 static void ComputeSeriesTags(ExpandedResource& resource,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2466 ServerContext& context,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2467 const std::string& seriesPublicId,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2468 const std::set<DicomTag>& requestedTags)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2469 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2470 if (requestedTags.count(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES) > 0)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2471 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2472 ServerIndex& index = context.GetIndex();
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2473 std::list<std::string> instances;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2474
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2475 index.GetChildren(instances, seriesPublicId);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2476
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2477 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2478 boost::lexical_cast<std::string>(instances.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2479 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2480 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2481 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2482
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2483 static void ComputeStudyTags(ExpandedResource& resource,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2484 ServerContext& context,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2485 const std::string& studyPublicId,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2486 const std::set<DicomTag>& requestedTags)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2487 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2488 ServerIndex& index = context.GetIndex();
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2489 std::list<std::string> series;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2490 std::list<std::string> instances;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2491
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2492 bool hasNbRelatedSeries = requestedTags.count(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2493 bool hasNbRelatedInstances = requestedTags.count(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2494 bool hasModalitiesInStudy = requestedTags.count(DICOM_TAG_MODALITIES_IN_STUDY) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2495 bool hasSopClassesInStudy = requestedTags.count(DICOM_TAG_SOP_CLASSES_IN_STUDY) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2496
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2497 index.GetChildren(series, studyPublicId);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2498
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2499 if (hasModalitiesInStudy)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2500 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2501 std::set<std::string> values;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2502
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2503 for (std::list<std::string>::const_iterator
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2504 it = series.begin(); it != series.end(); ++it)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2505 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2506 DicomMap tags;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2507 index.GetMainDicomTags(tags, *it, ResourceType_Series, ResourceType_Series);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2508
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2509 const DicomValue* value = tags.TestAndGetValue(DICOM_TAG_MODALITY);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2510
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2511 if (value != NULL &&
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2512 !value->IsNull() &&
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2513 !value->IsBinary())
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2514 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2515 values.insert(value->GetContent());
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2516 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2517 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2518
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2519 std::string modalities;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2520 Toolbox::JoinStrings(modalities, values, "\\");
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2521
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2522 resource.GetMainDicomTags().SetValue(DICOM_TAG_MODALITIES_IN_STUDY, modalities, false);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2523 resource.missingRequestedTags_.erase(DICOM_TAG_MODALITIES_IN_STUDY);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2524 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2525
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2526 if (hasNbRelatedSeries)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2527 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2528 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2529 boost::lexical_cast<std::string>(series.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2530 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2531 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2532
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2533 if (hasNbRelatedInstances || hasSopClassesInStudy)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2534 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2535 for (std::list<std::string>::const_iterator
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2536 it = series.begin(); it != series.end(); ++it)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2537 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2538 std::list<std::string> seriesInstancesIds;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2539 index.GetChildren(seriesInstancesIds, *it);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2540
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2541 instances.splice(instances.end(), seriesInstancesIds);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2542 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2543
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2544 if (hasNbRelatedInstances)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2545 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2546 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2547 boost::lexical_cast<std::string>(instances.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2548 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2549 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2550
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2551 if (hasSopClassesInStudy)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2552 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2553 std::set<std::string> values;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2554
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2555 for (std::list<std::string>::const_iterator
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2556 it = instances.begin(); it != instances.end(); ++it)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2557 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2558 std::string value;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2559
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2560 if (context.LookupOrReconstructMetadata(value, *it, ResourceType_Instance, MetadataType_Instance_SopClassUid))
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2561 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2562 values.insert(value);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2563 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2564 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2565
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2566 if (values.size() > 0)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2567 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2568 std::string sopClassUids;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2569 Toolbox::JoinStrings(sopClassUids, values, "\\");
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2570 resource.GetMainDicomTags().SetValue(DICOM_TAG_SOP_CLASSES_IN_STUDY, sopClassUids, false);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2571 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2572
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2573 resource.missingRequestedTags_.erase(DICOM_TAG_SOP_CLASSES_IN_STUDY);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2574 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2575 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2576 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2577
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2578 static void ComputePatientTags(ExpandedResource& resource,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2579 ServerContext& context,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2580 const std::string& patientPublicId,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2581 const std::set<DicomTag>& requestedTags)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2582 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2583 ServerIndex& index = context.GetIndex();
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2584
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2585 std::list<std::string> studies;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2586 std::list<std::string> series;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2587 std::list<std::string> instances;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2588
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2589 bool hasNbRelatedStudies = requestedTags.count(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2590 bool hasNbRelatedSeries = requestedTags.count(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2591 bool hasNbRelatedInstances = requestedTags.count(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES) > 0;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2592
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2593 index.GetChildren(studies, patientPublicId);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2594
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2595 if (hasNbRelatedStudies)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2596 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2597 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2598 boost::lexical_cast<std::string>(studies.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2599 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2600 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2601
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2602 if (hasNbRelatedSeries || hasNbRelatedInstances)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2603 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2604 for (std::list<std::string>::const_iterator
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2605 it = studies.begin(); it != studies.end(); ++it)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2606 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2607 std::list<std::string> thisSeriesIds;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2608 index.GetChildren(thisSeriesIds, *it);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2609 series.splice(series.end(), thisSeriesIds);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2610 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2611
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2612 if (hasNbRelatedSeries)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2613 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2614 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2615 boost::lexical_cast<std::string>(series.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2616 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2617 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2618 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2619
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2620 if (hasNbRelatedInstances)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2621 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2622 for (std::list<std::string>::const_iterator
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2623 it = series.begin(); it != series.end(); ++it)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2624 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2625 std::list<std::string> thisInstancesIds;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2626 index.GetChildren(thisInstancesIds, *it);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2627 instances.splice(instances.end(), thisInstancesIds);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2628 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2629
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2630 resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2631 boost::lexical_cast<std::string>(instances.size()), false);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2632 resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2633 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2634 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2635
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2636
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2637 static void ComputeTags(ExpandedResource& resource,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2638 ServerContext& context,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2639 const std::string& resourceId,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2640 ResourceType level,
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2641 const std::set<DicomTag>& requestedTags)
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2642 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2643 if (level == ResourceType_Patient
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2644 && DicomMap::HasComputedTags(resource.missingRequestedTags_, ResourceType_Patient))
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2645 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2646 ComputePatientTags(resource, context, resourceId, requestedTags);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2647 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2648
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2649 if (level == ResourceType_Study
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2650 && DicomMap::HasComputedTags(resource.missingRequestedTags_, ResourceType_Study))
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2651 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2652 ComputeStudyTags(resource, context, resourceId, requestedTags);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2653 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2654
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2655 if (level == ResourceType_Series
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2656 && DicomMap::HasComputedTags(resource.missingRequestedTags_, ResourceType_Series))
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2657 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2658 ComputeSeriesTags(resource, context, resourceId, requestedTags);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2659 }
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2660
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2661 if (level == ResourceType_Instance
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2662 && DicomMap::HasComputedTags(resource.missingRequestedTags_, ResourceType_Instance))
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2663 {
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2664 ComputeInstanceTags(resource, context, resourceId, requestedTags);
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2665 }
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2666 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2667
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2668 bool ServerContext::ExpandResource(Json::Value& target,
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2669 const std::string& publicId,
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2670 ResourceType level,
4936
8422e4f99a18 Handling RequestedTags in ExpandResource -> read parent main dicom tags if required. Not yet getting missing tags from file. Integration tests ok
Alain Mazy <am@osimis.io>
parents: 4935
diff changeset
2671 DicomToJsonFormat format,
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2672 const std::set<DicomTag>& requestedTags,
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2673 bool allowStorageAccess)
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2674 {
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2675 std::string unusedInstanceId;
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2676 Json::Value* unusedDicomAsJson = NULL;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2677 DicomMap unusedMainDicomTags;
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2678
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2679 return ExpandResource(target, publicId, unusedMainDicomTags, unusedInstanceId, unusedDicomAsJson, level, format, requestedTags, allowStorageAccess);
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2680 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2681
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2682 bool ServerContext::ExpandResource(Json::Value& target,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2683 const std::string& publicId,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2684 const DicomMap& mainDicomTags, // optional: the main dicom tags for the resource (if already available)
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2685 const std::string& instanceId, // optional: the id of an instance for the resource (if already available)
5060
e69a3ff39bc5 fix reuse of DicomAsJson between lookup and answers
Alain Mazy <am@osimis.io>
parents: 5058
diff changeset
2686 const Json::Value* dicomAsJson, // optional: the dicom-as-json for the resource (if already available)
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2687 ResourceType level,
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2688 DicomToJsonFormat format,
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2689 const std::set<DicomTag>& requestedTags,
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2690 bool allowStorageAccess)
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2691 {
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2692 ExpandedResource resource;
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2693
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2694 if (ExpandResource(resource, publicId, mainDicomTags, instanceId, dicomAsJson, level, requestedTags, ExpandResourceFlags_DefaultExtract, allowStorageAccess))
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2695 {
5568
b0b5546f1b9f find refactor: re-use existing code. /studies?expand is almost fully implemented with new code
Alain Mazy <am@orthanc.team>
parents: 5529
diff changeset
2696 SerializeExpandedResource(target, resource, format, requestedTags, ExpandResourceFlags_DefaultOutput);
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2697 return true;
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2698 }
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2699
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2700 return false;
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2701 }
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2702
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2703 bool ServerContext::ExpandResource(ExpandedResource& resource,
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2704 const std::string& publicId,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2705 const DicomMap& mainDicomTags, // optional: the main dicom tags for the resource (if already available)
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2706 const std::string& instanceId, // optional: the id of an instance for the resource (if already available)
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2707 const Json::Value* dicomAsJson, // optional: the dicom-as-json for the resource (if already available)
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2708 ResourceType level,
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2709 const std::set<DicomTag>& requestedTags,
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2710 ExpandResourceFlags expandFlags,
5058
d4e5ca0c9307 Fix the "Never" option of the "StorageAccessOnFind" that was sill accessing files (bug introduced in 1.11.0)
Alain Mazy <am@osimis.io>
parents: 5048
diff changeset
2711 bool allowStorageAccess)
4939
e8a2e145c80e cleanup
Alain Mazy <am@osimis.io>
parents: 4937
diff changeset
2712 {
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2713 // first try to get the tags from what is already available
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2714
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2715 if ((expandFlags & ExpandResourceFlags_IncludeMainDicomTags) &&
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2716 mainDicomTags.GetSize() > 0 &&
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2717 dicomAsJson != NULL)
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2718 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2719
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2720 resource.GetMainDicomTags().Merge(mainDicomTags);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2721
4984
c8cdf5163cd2 cppcheck
Alain Mazy <am@osimis.io>
parents: 4981
diff changeset
2722 if (dicomAsJson->isObject())
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2723 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2724 resource.GetMainDicomTags().FromDicomAsJson(*dicomAsJson);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2725 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2726
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2727 std::set<DicomTag> retrievedTags;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2728 std::set<DicomTag> missingTags;
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2729 resource.GetMainDicomTags().GetTags(retrievedTags);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2730
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2731 Toolbox::GetMissingsFromSet(missingTags, requestedTags, retrievedTags);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2732
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2733 // if all possible tags have been read, no need to get them from DB anymore
5669
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2734 if (missingTags.size() > 0 && DicomMap::HasOnlyComputedTags(missingTags))
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2735 {
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2736 resource.missingRequestedTags_ = missingTags;
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2737 ComputeTags(resource, *this, publicId, level, requestedTags);
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2738 return true;
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2739 }
f690568f0325 Fix C-Find queries not returning computed tags in very specific use-cases
Alain Mazy <am@orthanc.team>
parents: 5640
diff changeset
2740 else if (missingTags.size() == 0)
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2741 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2742 expandFlags = static_cast<ExpandResourceFlags>(expandFlags & ~ExpandResourceFlags_IncludeMainDicomTags);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2743 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2744
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2745 if (missingTags.size() == 0 && expandFlags == ExpandResourceFlags_None) // we have already retrieved anything we need
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2746 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2747 return true;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2748 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2749 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2750
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2751 if (expandFlags != ExpandResourceFlags_None &&
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2752 GetIndex().ExpandResource(resource, publicId, level, requestedTags,
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2753 static_cast<ExpandResourceFlags>(expandFlags | ExpandResourceFlags_IncludeMetadata))) // we always need the metadata to get the mainDicomTagsSignature
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2754 {
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2755 // check the main dicom tags list has not changed since the resource was stored
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2756 if (resource.mainDicomTagsSignature_ != DicomMap::GetMainDicomTagsSignature(resource.GetLevel()))
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2757 {
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2758 OrthancConfiguration::ReaderLock lock;
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2759 if (lock.GetConfiguration().IsWarningEnabled(Warnings_002_InconsistentDicomTagsInDb))
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2760 {
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2761 LOG(WARNING) << "W002: " << Orthanc::GetResourceTypeText(resource.GetLevel(), false , false)
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2762 << " has been stored with another version of Main Dicom Tags list, you should POST to /"
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2763 << Orthanc::GetResourceTypeText(resource.GetLevel(), true, false)
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2764 << "/" << resource.GetPublicId()
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2765 << "/reconstruct to update the list of tags saved in DB. Some MainDicomTags might be missing from this answer.";
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2766 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2767 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2768
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2769 // possibly merge missing requested tags from dicom-as-json
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2770 if (allowStorageAccess &&
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2771 !resource.missingRequestedTags_.empty() &&
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2772 !DicomMap::HasOnlyComputedTags(resource.missingRequestedTags_))
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2773 {
4941
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2774 OrthancConfiguration::ReaderLock lock;
4944
f377d5643538 new Warnings configuration + InstanceAvailability tag
Alain Mazy <am@osimis.io>
parents: 4941
diff changeset
2775 if (lock.GetConfiguration().IsWarningEnabled(Warnings_001_TagsBeingReadFromStorage))
4941
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2776 {
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2777 std::set<DicomTag> missingTags;
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2778 Toolbox::AppendSets(missingTags, resource.missingRequestedTags_);
4981
d0c34145320c cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4978
diff changeset
2779 for (std::set<DicomTag>::const_iterator it = resource.missingRequestedTags_.begin(); it != resource.missingRequestedTags_.end(); ++it)
4941
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2780 {
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2781 if (DicomMap::IsComputedTag(*it))
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2782 {
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2783 missingTags.erase(*it);
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2784 }
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2785 }
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2786
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2787 std::string missings;
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2788 FromDcmtkBridge::FormatListOfTags(missings, missingTags);
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2789
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2790 LOG(WARNING) << "W001: Accessing Dicom tags from storage when accessing "
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2791 << Orthanc::GetResourceTypeText(resource.GetLevel(), false, false)
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2792 << " : " << missings;
4941
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2793 }
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2794
96a3e81eba90 performance warning
Alain Mazy <am@osimis.io>
parents: 4940
diff changeset
2795
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2796 std::string instanceId_ = instanceId;
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2797 DicomMap tagsFromJson;
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2798
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2799 if (dicomAsJson == NULL)
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2800 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2801 if (instanceId_.empty())
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2802 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2803 if (level == ResourceType_Instance)
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2804 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2805 instanceId_ = publicId;
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2806 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2807 else
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2808 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2809 std::list<std::string> instancesIds;
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2810 GetIndex().GetChildInstances(instancesIds, publicId);
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2811 if (instancesIds.size() < 1)
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2812 {
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2813 throw OrthancException(ErrorCode_InternalError, "ExpandResource: no instances found");
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2814 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2815 instanceId_ = instancesIds.front();
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2816 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2817 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2818
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2819 Json::Value tmpDicomAsJson;
5036
877bc3b96476 Handle Dicom sequences in ExtraMainDicomTags and save them in the 'MainDicomSequences' metadata
Alain Mazy <am@osimis.io>
parents: 4994
diff changeset
2820 ReadDicomAsJson(tmpDicomAsJson, instanceId_, resource.missingRequestedTags_ /* ignoreTagLength */); // read all tags from DICOM and avoid cropping requested tags
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2821 tagsFromJson.FromDicomAsJson(tmpDicomAsJson, false /* append */, true /* parseSequences*/);
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2822 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2823 else
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2824 {
5044
6fed78e13233 Refactored DicomMap to handle sequences when needed
Alain Mazy <am@osimis.io>
parents: 5043
diff changeset
2825 tagsFromJson.FromDicomAsJson(*dicomAsJson, false /* append */, true /* parseSequences*/);
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2826 }
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2827
5222
3a61fd50f804 starting refactoring ExpandedResource
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5221
diff changeset
2828 resource.GetMainDicomTags().Merge(tagsFromJson);
4937
3f9b9865c8cc include requested tags from storage if needed
Alain Mazy <am@osimis.io>
parents: 4936
diff changeset
2829 }
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2830
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2831 // compute the requested tags
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2832 ComputeTags(resource, *this, publicId, level, requestedTags);
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2833 }
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2834 else
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2835 {
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2836 return false;
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2837 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2838
4940
304514ce84ee tools/find + C-Find + list-resources now all using the same code (ExpandResource) to build 'computed tags'
Alain Mazy <am@osimis.io>
parents: 4939
diff changeset
2839 return true;
4935
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2840 }
acd3f72e2a21 split ExpandResource in 2: read from DB and serialize to json. This will allow us to merge requested tags from both the DB and the file system
Alain Mazy <am@osimis.io>
parents: 4921
diff changeset
2841
5111
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2842 int64_t ServerContext::GetServerUpTime() const
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2843 {
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2844 boost::posix_time::ptime nowUtc = boost::posix_time::second_clock::universal_time();
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2845 boost::posix_time::time_duration elapsed = nowUtc - serverStartTimeUtc_;
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2846
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2847 return elapsed.total_seconds();
7547c7dfd017 /tools/metrics-prometheus: added orthanc_last_change and orthanc_up_time_s
Alain Mazy <am@osimis.io>
parents: 5060
diff changeset
2848 }
224
4eb0c7ce86c9 refactoring for store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2849 }