Mercurial > hg > orthanc
annotate OrthancFramework/Sources/Toolbox.cpp @ 4960:c68265bf1f94 more-tags
fix
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 23 Mar 2022 11:52:19 +0100 |
parents | f630796a59b1 |
children | 859f3668c181 |
rev | line source |
---|---|
0 | 1 /** |
59 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1145
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
4870
43e613a7756b
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4831
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
43e613a7756b
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4831
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
11 * the License, or (at your option) any later version. |
136 | 12 * |
0 | 13 * This program is distributed in the hope that it will be useful, but |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
16 * Lesser General Public License for more details. |
0 | 17 * |
4119
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
19 * License along with this program. If not, see |
bf7b9edf6b81
re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4055
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
0 | 21 **/ |
22 | |
23 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
809
diff
changeset
|
24 #include "PrecompiledHeaders.h" |
0 | 25 #include "Toolbox.h" |
26 | |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
27 #include "Compatibility.h" |
59 | 28 #include "OrthancException.h" |
1486
f967bdf8534e
refactoring to Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1480
diff
changeset
|
29 #include "Logging.h" |
0 | 30 |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
31 #include <json/reader.h> |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
32 #include <json/version.h> |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
33 #include <json/writer.h> |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
34 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
35 #if !defined(JSONCPP_VERSION_MAJOR) || !defined(JSONCPP_VERSION_MINOR) |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
36 # error Cannot access the version of JsonCpp |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
37 #endif |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
38 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
39 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
40 /** |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
41 * We use deprecated "Json::Reader", "Json::StyledWriter" and |
4396 | 42 * "Json::FastWriter" if JsonCpp < 1.7.0. This choice is rather |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
43 * arbitrary, but if Json >= 1.9.0, gcc generates explicit deprecation |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
44 * warnings (clang was warning in earlier versions). For reference, |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
45 * these classes seem to have been deprecated since JsonCpp 1.4.0 (on |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
46 * February 2015) by the following changeset: |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
47 * https://github.com/open-source-parsers/jsoncpp/commit/8df98f6112890d6272734975dd6d70cf8999bb22 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
48 **/ |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
49 #if (JSONCPP_VERSION_MAJOR >= 2 || \ |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
50 (JSONCPP_VERSION_MAJOR == 1 && JSONCPP_VERSION_MINOR >= 8)) |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
51 # define JSONCPP_USE_DEPRECATED 0 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
52 #else |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
53 # define JSONCPP_USE_DEPRECATED 1 |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
54 #endif |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
55 |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
56 |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
57 #include <boost/algorithm/string/case_conv.hpp> |
2143
fd5875662670
creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2141
diff
changeset
|
58 #include <boost/algorithm/string/replace.hpp> |
4938
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
59 #include <boost/algorithm/string/join.hpp> |
2143
fd5875662670
creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2141
diff
changeset
|
60 #include <boost/lexical_cast.hpp> |
2931 | 61 #include <boost/regex.hpp> |
62 | |
63 #if BOOST_VERSION >= 106600 | |
64 # include <boost/uuid/detail/sha1.hpp> | |
65 #else | |
66 # include <boost/uuid/sha1.hpp> | |
67 #endif | |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
68 |
1397 | 69 #include <string> |
453 | 70 #include <stdint.h> |
0 | 71 #include <string.h> |
72 #include <algorithm> | |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
73 #include <ctype.h> |
1397 | 74 |
915
703bef350e89
Orthanc now relies entirely on boost::locale
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
890
diff
changeset
|
75 |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
76 #if ORTHANC_ENABLE_MD5 == 1 |
2931 | 77 // TODO - Could be replaced by <boost/uuid/detail/md5.hpp> starting |
78 // with Boost >= 1.66.0 | |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
79 # include "../Resources/ThirdParty/md5/md5.h" |
1479
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
80 #endif |
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
81 |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
82 #if ORTHANC_ENABLE_BASE64 == 1 |
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
83 # include "../Resources/ThirdParty/base64/base64.h" |
1479
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
84 #endif |
0 | 85 |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
86 #if ORTHANC_ENABLE_LOCALE == 1 |
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
87 # include <boost/locale.hpp> |
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
88 #endif |
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
89 |
2677
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
90 #if ORTHANC_ENABLE_SSL == 1 |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
91 // For OpenSSL initialization and finalization |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
92 # include <openssl/conf.h> |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
93 # include <openssl/engine.h> |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
94 # include <openssl/err.h> |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
95 # include <openssl/evp.h> |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
96 # include <openssl/ssl.h> |
4741
a6b7c29f5118
compiler warning about openssl license
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4706
diff
changeset
|
97 |
a6b7c29f5118
compiler warning about openssl license
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4706
diff
changeset
|
98 # if OPENSSL_VERSION_NUMBER < 0x30000000L |
4892
6eff25f70121
integration mainline->openssl-3.x
Sebastien Jodogne <s.jodogne@gmail.com>
diff
changeset
|
99 # warning You are linking Orthanc against OpenSSL 1.x, whose license is incompatible with the GPLv3+ used by Orthanc >= 1.10.0. Please update to OpenSSL 3.x, that uses the Apache 2 license. |
4741
a6b7c29f5118
compiler warning about openssl license
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4706
diff
changeset
|
100 # endif |
a6b7c29f5118
compiler warning about openssl license
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4706
diff
changeset
|
101 |
2677
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
102 #endif |
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
103 |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
104 |
1111
929bf8c2123d
Fixes for Visual Studio 2013 64bit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1103
diff
changeset
|
105 #if defined(_MSC_VER) && (_MSC_VER < 1800) |
929bf8c2123d
Fixes for Visual Studio 2013 64bit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1103
diff
changeset
|
106 // Patch for the missing "_strtoll" symbol when compiling with Visual Studio < 2013 |
570 | 107 extern "C" |
108 { | |
915
703bef350e89
Orthanc now relies entirely on boost::locale
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
890
diff
changeset
|
109 int64_t _strtoi64(const char *nptr, char **endptr, int base); |
703bef350e89
Orthanc now relies entirely on boost::locale
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
890
diff
changeset
|
110 int64_t strtoll(const char *nptr, char **endptr, int base) |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
111 { |
915
703bef350e89
Orthanc now relies entirely on boost::locale
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
890
diff
changeset
|
112 return _strtoi64(nptr, endptr, base); |
703bef350e89
Orthanc now relies entirely on boost::locale
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
890
diff
changeset
|
113 } |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
114 } |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
115 #endif |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
116 |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
117 |
2173 | 118 #if defined(_WIN32) |
119 # include <windows.h> // For ::Sleep | |
120 #endif | |
121 | |
2141 | 122 |
2136
dd609a99d39a
uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2129
diff
changeset
|
123 #if ORTHANC_ENABLE_PUGIXML == 1 |
2143
fd5875662670
creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2141
diff
changeset
|
124 # include "ChunkedBuffer.h" |
1045
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
125 #endif |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
126 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
127 |
2512
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
128 // Inclusions for UUID |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
129 // http://stackoverflow.com/a/1626302 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
130 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
131 extern "C" |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
132 { |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
133 #if defined(_WIN32) |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
134 # include <rpc.h> |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
135 #else |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
136 # include <uuid/uuid.h> |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
137 #endif |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
138 } |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
139 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
140 |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
141 #if defined(ORTHANC_STATIC_ICU) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
142 # if (ORTHANC_STATIC_ICU == 1 && ORTHANC_ENABLE_LOCALE == 1) |
4032
058b5ade8acd
renaming embedded resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4030
diff
changeset
|
143 # include <OrthancFrameworkResources.h> |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
144 # include <unicode/udata.h> |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
145 # include <unicode/uloc.h> |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
146 # include "Compression/GzipCompressor.h" |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
147 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
148 static std::string globalIcuData_; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
149 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
150 extern "C" |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
151 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
152 // This is dummy content for the "icudt58_dat" (resp. "icudt63_dat") |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
153 // global variable from the autogenerated "icudt58l_dat.c" |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
154 // (resp. "icudt63l_dat.c") file that contains a huge C array. In |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
155 // Orthanc, this array is compressed using gzip and attached as a |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
156 // resource, then uncompressed during the launch of Orthanc by |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
157 // static function "InitializeIcu()". |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
158 struct |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
159 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
160 double bogus; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
161 uint8_t *bytes; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
162 } U_ICUDATA_ENTRY_POINT = { 0.0, NULL }; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
163 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
164 |
3462
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
165 # if defined(__LSB_VERSION__) |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
166 extern "C" |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
167 { |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
168 /** |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
169 * The "tzname" global variable is declared as "extern" but is not |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
170 * defined in any compilation module, if using Linux Standard Base, |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
171 * as soon as OpenSSL or cURL is in use on Ubuntu >= 18.04 (glibc >= |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
172 * 2.27). The variable "__tzname" is always properly declared *and* |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
173 * defined. The reason is unclear, and is maybe a bug in the gcc 4.8 |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
174 * linker that is used by LSB if facing a weak symbol (as "tzname"). |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
175 * This makes Orthanc crash if the timezone is set to UTC. |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
176 * https://groups.google.com/d/msg/orthanc-users/0m8sxxwSm1E/2p8du_89CAAJ |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
177 **/ |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
178 char *tzname[2] = { (char *) "GMT", (char *) "GMT" }; |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
179 } |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
180 # endif |
7d72e43f4a2d
attempt to fix LSB on Ubuntu 18.04
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3459
diff
changeset
|
181 |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
182 # endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
183 #endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
184 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
185 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
186 |
3459
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
187 #if defined(__unix__) && ORTHANC_SANDBOXED != 1 |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
188 # include "SystemToolbox.h" // Check out "InitializeGlobalLocale()" |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
189 #endif |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
190 |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
191 |
2512
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
192 |
59 | 193 namespace Orthanc |
0 | 194 { |
2513
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
195 void Toolbox::LinesIterator::FindEndOfLine() |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
196 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
197 lineEnd_ = lineStart_; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
198 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
199 while (lineEnd_ < content_.size() && |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
200 content_[lineEnd_] != '\n' && |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
201 content_[lineEnd_] != '\r') |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
202 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
203 lineEnd_ += 1; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
204 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
205 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
206 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
207 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
208 Toolbox::LinesIterator::LinesIterator(const std::string& content) : |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
209 content_(content), |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
210 lineStart_(0) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
211 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
212 FindEndOfLine(); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
213 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
214 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
215 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
216 bool Toolbox::LinesIterator::GetLine(std::string& target) const |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
217 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
218 assert(lineStart_ <= content_.size() && |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
219 lineEnd_ <= content_.size() && |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
220 lineStart_ <= lineEnd_); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
221 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
222 if (lineStart_ == content_.size()) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
223 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
224 return false; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
225 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
226 else |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
227 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
228 target = content_.substr(lineStart_, lineEnd_ - lineStart_); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
229 return true; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
230 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
231 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
232 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
233 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
234 void Toolbox::LinesIterator::Next() |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
235 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
236 lineStart_ = lineEnd_; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
237 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
238 if (lineStart_ != content_.size()) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
239 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
240 assert(content_[lineStart_] == '\r' || |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
241 content_[lineStart_] == '\n'); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
242 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
243 char second; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
244 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
245 if (content_[lineStart_] == '\r') |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
246 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
247 second = '\n'; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
248 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
249 else |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
250 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
251 second = '\r'; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
252 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
253 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
254 lineStart_ += 1; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
255 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
256 if (lineStart_ < content_.size() && |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
257 content_[lineStart_] == second) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
258 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
259 lineStart_ += 1; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
260 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
261 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
262 FindEndOfLine(); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
263 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
264 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
265 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
266 |
0 | 267 void Toolbox::ToUpperCase(std::string& s) |
268 { | |
269 std::transform(s.begin(), s.end(), s.begin(), toupper); | |
270 } | |
271 | |
272 | |
273 void Toolbox::ToLowerCase(std::string& s) | |
274 { | |
275 std::transform(s.begin(), s.end(), s.begin(), tolower); | |
276 } | |
277 | |
278 | |
690
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
279 void Toolbox::ToUpperCase(std::string& result, |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
280 const std::string& source) |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
281 { |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
282 result = source; |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
283 ToUpperCase(result); |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
284 } |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
285 |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
286 void Toolbox::ToLowerCase(std::string& result, |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
287 const std::string& source) |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
288 { |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
289 result = source; |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
290 ToLowerCase(result); |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
291 } |
2e67366aab83
case-insensitive matching of Application Entity Titles
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
292 |
0 | 293 |
294 void Toolbox::SplitUriComponents(UriComponents& components, | |
295 const std::string& uri) | |
296 { | |
297 static const char URI_SEPARATOR = '/'; | |
298 | |
299 components.clear(); | |
300 | |
301 if (uri.size() == 0 || | |
302 uri[0] != URI_SEPARATOR) | |
303 { | |
59 | 304 throw OrthancException(ErrorCode_UriSyntax); |
0 | 305 } |
306 | |
307 // Count the number of slashes in the URI to make an assumption | |
308 // about the number of components in the URI | |
309 unsigned int estimatedSize = 0; | |
310 for (unsigned int i = 0; i < uri.size(); i++) | |
311 { | |
312 if (uri[i] == URI_SEPARATOR) | |
313 estimatedSize++; | |
314 } | |
315 | |
316 components.reserve(estimatedSize - 1); | |
317 | |
318 unsigned int start = 1; | |
319 unsigned int end = 1; | |
320 while (end < uri.size()) | |
321 { | |
322 // This is the loop invariant | |
323 assert(uri[start - 1] == '/' && (end >= start)); | |
324 | |
325 if (uri[end] == '/') | |
326 { | |
327 components.push_back(std::string(&uri[start], end - start)); | |
328 end++; | |
329 start = end; | |
330 } | |
331 else | |
332 { | |
333 end++; | |
334 } | |
335 } | |
336 | |
337 if (start < uri.size()) | |
338 { | |
339 components.push_back(std::string(&uri[start], end - start)); | |
340 } | |
207 | 341 |
342 for (size_t i = 0; i < components.size(); i++) | |
343 { | |
344 if (components[i].size() == 0) | |
345 { | |
346 // Empty component, as in: "/coucou//e" | |
347 throw OrthancException(ErrorCode_UriSyntax); | |
348 } | |
349 } | |
0 | 350 } |
351 | |
352 | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
353 void Toolbox::TruncateUri(UriComponents& target, |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
354 const UriComponents& source, |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
355 size_t fromLevel) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
356 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
357 target.clear(); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
358 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
359 if (source.size() > fromLevel) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
360 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
361 target.resize(source.size() - fromLevel); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
362 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
363 size_t j = 0; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
364 for (size_t i = fromLevel; i < source.size(); i++, j++) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
365 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
366 target[j] = source[i]; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
367 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
368 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
369 assert(j == target.size()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
370 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
371 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
372 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
373 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
957
diff
changeset
|
374 |
0 | 375 bool Toolbox::IsChildUri(const UriComponents& baseUri, |
376 const UriComponents& testedUri) | |
377 { | |
378 if (testedUri.size() < baseUri.size()) | |
379 { | |
380 return false; | |
381 } | |
382 | |
383 for (size_t i = 0; i < baseUri.size(); i++) | |
384 { | |
385 if (baseUri[i] != testedUri[i]) | |
386 return false; | |
387 } | |
388 | |
389 return true; | |
390 } | |
391 | |
392 | |
393 std::string Toolbox::FlattenUri(const UriComponents& components, | |
394 size_t fromLevel) | |
395 { | |
396 if (components.size() <= fromLevel) | |
397 { | |
398 return "/"; | |
399 } | |
400 else | |
401 { | |
402 std::string r; | |
403 | |
404 for (size_t i = fromLevel; i < components.size(); i++) | |
405 { | |
406 r += "/" + components[i]; | |
407 } | |
408 | |
409 return r; | |
410 } | |
411 } | |
412 | |
413 | |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
414 #if ORTHANC_ENABLE_MD5 == 1 |
22 | 415 static char GetHexadecimalCharacter(uint8_t value) |
416 { | |
417 assert(value < 16); | |
418 | |
419 if (value < 10) | |
1654
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
420 { |
22 | 421 return value + '0'; |
1654
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
422 } |
22 | 423 else |
1654
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
424 { |
22 | 425 return (value - 10) + 'a'; |
1654
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
426 } |
22 | 427 } |
428 | |
23 | 429 |
22 | 430 void Toolbox::ComputeMD5(std::string& result, |
431 const std::string& data) | |
432 { | |
693
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
433 if (data.size() > 0) |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
434 { |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
435 ComputeMD5(result, &data[0], data.size()); |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
436 } |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
437 else |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
438 { |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
439 ComputeMD5(result, NULL, 0); |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
440 } |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
441 } |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
442 |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
443 |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
444 void Toolbox::ComputeMD5(std::string& result, |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
445 const void* data, |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
446 size_t size) |
693
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
447 { |
22 | 448 md5_state_s state; |
449 md5_init(&state); | |
450 | |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
451 if (size > 0) |
22 | 452 { |
693
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
453 md5_append(&state, |
01d8611c4a60
md5 for attached files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
690
diff
changeset
|
454 reinterpret_cast<const md5_byte_t*>(data), |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
455 static_cast<int>(size)); |
22 | 456 } |
457 | |
458 md5_byte_t actualHash[16]; | |
459 md5_finish(&state, actualHash); | |
460 | |
461 result.resize(32); | |
462 for (unsigned int i = 0; i < 16; i++) | |
463 { | |
1654
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
464 result[2 * i] = GetHexadecimalCharacter(static_cast<uint8_t>(actualHash[i] / 16)); |
3727a09e7b53
fix some icc warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1648
diff
changeset
|
465 result[2 * i + 1] = GetHexadecimalCharacter(static_cast<uint8_t>(actualHash[i] % 16)); |
22 | 466 } |
467 } | |
1479
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
468 #endif |
24 | 469 |
470 | |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
471 #if ORTHANC_ENABLE_BASE64 == 1 |
809
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
803
diff
changeset
|
472 void Toolbox::EncodeBase64(std::string& result, |
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
803
diff
changeset
|
473 const std::string& data) |
24 | 474 { |
3326
b21d4cc8e5d1
speed up base64 decoding + added tests
Alain Mazy <alain@mazy.be>
parents:
3325
diff
changeset
|
475 result.clear(); |
3325
2e7c5c15ba25
reserve size for base64 decoding + avoid copy. In a test in WASM, encoding 3MB took 110ms instead of 1400ms previously
Alain Mazy <alain@mazy.be>
parents:
3322
diff
changeset
|
476 base64_encode(result, data); |
24 | 477 } |
478 | |
809
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
803
diff
changeset
|
479 void Toolbox::DecodeBase64(std::string& result, |
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
803
diff
changeset
|
480 const std::string& data) |
365 | 481 { |
1988
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
482 for (size_t i = 0; i < data.length(); i++) |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
483 { |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
484 if (!isalnum(data[i]) && |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
485 data[i] != '+' && |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
486 data[i] != '/' && |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
487 data[i] != '=') |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
488 { |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
489 // This is not a valid character for a Base64 string |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
490 throw OrthancException(ErrorCode_BadFileFormat); |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
491 } |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
492 } |
e29aea2349b9
test validity of base64 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1981
diff
changeset
|
493 |
3326
b21d4cc8e5d1
speed up base64 decoding + added tests
Alain Mazy <alain@mazy.be>
parents:
3325
diff
changeset
|
494 result.clear(); |
3325
2e7c5c15ba25
reserve size for base64 decoding + avoid copy. In a test in WASM, encoding 3MB took 110ms instead of 1400ms previously
Alain Mazy <alain@mazy.be>
parents:
3322
diff
changeset
|
495 base64_decode(result, data); |
365 | 496 } |
1648 | 497 |
498 | |
1981
4b545a8b1f95
return code in Toolbox::DecodeDataUriScheme
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1976
diff
changeset
|
499 bool Toolbox::DecodeDataUriScheme(std::string& mime, |
1648 | 500 std::string& content, |
501 const std::string& source) | |
502 { | |
503 boost::regex pattern("data:([^;]+);base64,([a-zA-Z0-9=+/]*)", | |
504 boost::regex::icase /* case insensitive search */); | |
505 | |
506 boost::cmatch what; | |
507 if (regex_match(source.c_str(), what, pattern)) | |
508 { | |
509 mime = what[1]; | |
510 DecodeBase64(content, what[2]); | |
1981
4b545a8b1f95
return code in Toolbox::DecodeDataUriScheme
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1976
diff
changeset
|
511 return true; |
1648 | 512 } |
513 else | |
514 { | |
1981
4b545a8b1f95
return code in Toolbox::DecodeDataUriScheme
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1976
diff
changeset
|
515 return false; |
1648 | 516 } |
517 } | |
518 | |
1818
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
519 |
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
520 void Toolbox::EncodeDataUriScheme(std::string& result, |
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
521 const std::string& mime, |
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
522 const std::string& content) |
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
523 { |
3325
2e7c5c15ba25
reserve size for base64 decoding + avoid copy. In a test in WASM, encoding 3MB took 110ms instead of 1400ms previously
Alain Mazy <alain@mazy.be>
parents:
3322
diff
changeset
|
524 result = "data:" + mime + ";base64,"; |
2e7c5c15ba25
reserve size for base64 decoding + avoid copy. In a test in WASM, encoding 3MB took 110ms instead of 1400ms previously
Alain Mazy <alain@mazy.be>
parents:
3322
diff
changeset
|
525 base64_encode(result, content); |
1818
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
526 } |
1065401501fb
ParsedDicomFile::CreateFromJson
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1767
diff
changeset
|
527 |
1479
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
528 #endif |
8f28a1cd2354
possibility to disable md5 and base64 support in the toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
529 |
365 | 530 |
2412
cad393b41bc3
handy shortcuts in DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2373
diff
changeset
|
531 #if ORTHANC_ENABLE_LOCALE == 1 |
1557 | 532 static const char* GetBoostLocaleEncoding(const Encoding sourceEncoding) |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
533 { |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
534 switch (sourceEncoding) |
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
535 { |
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
536 case Encoding_Utf8: |
1557 | 537 return "UTF-8"; |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
538 |
956
2fd5a163776d
primitives for proper encoding handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
950
diff
changeset
|
539 case Encoding_Ascii: |
1557 | 540 return "ASCII"; |
956
2fd5a163776d
primitives for proper encoding handling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
950
diff
changeset
|
541 |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
542 case Encoding_Latin1: |
1557 | 543 return "ISO-8859-1"; |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
544 |
1087 | 545 case Encoding_Latin2: |
1557 | 546 return "ISO-8859-2"; |
1087 | 547 |
548 case Encoding_Latin3: | |
1557 | 549 return "ISO-8859-3"; |
1087 | 550 |
551 case Encoding_Latin4: | |
1557 | 552 return "ISO-8859-4"; |
1087 | 553 |
554 case Encoding_Latin5: | |
1557 | 555 return "ISO-8859-9"; |
1087 | 556 |
557 case Encoding_Cyrillic: | |
1557 | 558 return "ISO-8859-5"; |
1087 | 559 |
1347 | 560 case Encoding_Windows1251: |
1557 | 561 return "WINDOWS-1251"; |
1347 | 562 |
1087 | 563 case Encoding_Arabic: |
1557 | 564 return "ISO-8859-6"; |
1087 | 565 |
566 case Encoding_Greek: | |
1557 | 567 return "ISO-8859-7"; |
1087 | 568 |
569 case Encoding_Hebrew: | |
1557 | 570 return "ISO-8859-8"; |
1090
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
571 |
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
572 case Encoding_Japanese: |
1557 | 573 return "SHIFT-JIS"; |
1090
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
574 |
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
575 case Encoding_Chinese: |
1557 | 576 return "GB18030"; |
1090
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
577 |
e494ceb8d763
support more encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1087
diff
changeset
|
578 case Encoding_Thai: |
3230
4b042ec734c1
dynamic linking against libicu
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3226
diff
changeset
|
579 #if BOOST_LOCALE_WITH_ICU == 1 |
4b042ec734c1
dynamic linking against libicu
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3226
diff
changeset
|
580 return "tis620.2533"; |
4b042ec734c1
dynamic linking against libicu
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3226
diff
changeset
|
581 #else |
1557 | 582 return "TIS620.2533-0"; |
3230
4b042ec734c1
dynamic linking against libicu
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3226
diff
changeset
|
583 #endif |
1087 | 584 |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
585 case Encoding_Korean: |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
586 return "ISO-IR-149"; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
587 |
3218 | 588 case Encoding_JapaneseKanji: |
589 return "JIS"; | |
590 | |
3226
45e1631febbb
support of simplified chinese
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3221
diff
changeset
|
591 case Encoding_SimplifiedChinese: |
45e1631febbb
support of simplified chinese
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3221
diff
changeset
|
592 return "GB2312"; |
45e1631febbb
support of simplified chinese
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3221
diff
changeset
|
593 |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
594 default: |
957
63973b76a51f
detection of encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
595 throw OrthancException(ErrorCode_NotImplemented); |
949
766a57997121
enumeration for encodings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
942
diff
changeset
|
596 } |
1557 | 597 } |
2412
cad393b41bc3
handy shortcuts in DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2373
diff
changeset
|
598 #endif |
1557 | 599 |
600 | |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
601 #if ORTHANC_ENABLE_LOCALE == 1 |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
602 // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.12.html#sect_C.12.1.1.2 |
1557 | 603 std::string Toolbox::ConvertToUtf8(const std::string& source, |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
604 Encoding sourceEncoding, |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
605 bool hasCodeExtensions) |
1557 | 606 { |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
607 #if ORTHANC_STATIC_ICU == 1 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
608 if (globalIcuData_.empty()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
609 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
610 throw OrthancException(ErrorCode_BadSequenceOfCalls, |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
611 "Call Toolbox::InitializeGlobalLocale()"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
612 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
613 #endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
614 |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
615 // The "::skip" flag makes boost skip invalid UTF-8 |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
616 // characters. This can occur in badly-encoded DICOM files. |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
617 |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
618 try |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
619 { |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
620 if (sourceEncoding == Encoding_Ascii) |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
621 { |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
622 return ConvertToAscii(source); |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
623 } |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
624 else |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
625 { |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
626 std::string s; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
627 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
628 if (sourceEncoding == Encoding_Utf8) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
629 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
630 // Already in UTF-8: No conversion is required, but we ensure |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
631 // the output is correctly encoded |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
632 s = boost::locale::conv::utf_to_utf<char>(source, boost::locale::conv::skip); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
633 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
634 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
635 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
636 const char* encoding = GetBoostLocaleEncoding(sourceEncoding); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
637 s = boost::locale::conv::to_utf<char>(source, encoding, boost::locale::conv::skip); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
638 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
639 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
640 if (hasCodeExtensions) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
641 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
642 std::string t; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
643 RemoveIso2022EscapeSequences(t, s); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
644 return t; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
645 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
646 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
647 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
648 return s; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
649 } |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
650 } |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
651 } |
3218 | 652 catch (std::runtime_error& e) |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
653 { |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
654 // Bad input string or bad encoding |
3218 | 655 LOG(INFO) << e.what(); |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
656 return ConvertToAscii(source); |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
657 } |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
658 } |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
659 #endif |
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
660 |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
661 |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
662 #if ORTHANC_ENABLE_LOCALE == 1 |
1557 | 663 std::string Toolbox::ConvertFromUtf8(const std::string& source, |
664 Encoding targetEncoding) | |
665 { | |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
666 #if ORTHANC_STATIC_ICU == 1 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
667 if (globalIcuData_.empty()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
668 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
669 throw OrthancException(ErrorCode_BadSequenceOfCalls, |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
670 "Call Toolbox::InitializeGlobalLocale()"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
671 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
672 #endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
673 |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
674 // The "::skip" flag makes boost skip invalid UTF-8 |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
675 // characters. This can occur in badly-encoded DICOM files. |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
676 |
1557 | 677 try |
678 { | |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
679 if (targetEncoding == Encoding_Utf8) |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
680 { |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
681 // Already in UTF-8: No conversion is required. |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
682 return boost::locale::conv::utf_to_utf<char>(source, boost::locale::conv::skip); |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
683 } |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
684 else if (targetEncoding == Encoding_Ascii) |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
685 { |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
686 return ConvertToAscii(source); |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
687 } |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
688 else |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
689 { |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
690 const char* encoding = GetBoostLocaleEncoding(targetEncoding); |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
691 return boost::locale::conv::from_utf<char>(source, encoding, boost::locale::conv::skip); |
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
692 } |
1557 | 693 } |
694 catch (std::runtime_error&) | |
695 { | |
696 // Bad input string or bad encoding | |
697 return ConvertToAscii(source); | |
698 } | |
699 } | |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
700 #endif |
1557 | 701 |
702 | |
2900 | 703 static bool IsAsciiCharacter(uint8_t c) |
704 { | |
705 return (c != 0 && | |
706 c <= 127 && | |
707 (c == '\n' || !iscntrl(c))); | |
708 } | |
709 | |
710 | |
2129
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
711 bool Toolbox::IsAsciiString(const void* data, |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
712 size_t size) |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
713 { |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
714 const uint8_t* p = reinterpret_cast<const uint8_t*>(data); |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
715 |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
716 for (size_t i = 0; i < size; i++, p++) |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
717 { |
2900 | 718 if (!IsAsciiCharacter(*p)) |
2129
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
719 { |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
720 return false; |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
721 } |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
722 } |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
723 |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
724 return true; |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
725 } |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
726 |
0c09d1af22f3
"/tools/invalidate-tags" to invalidate the JSON summary of all the DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2087
diff
changeset
|
727 |
2442
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
728 bool Toolbox::IsAsciiString(const std::string& s) |
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
729 { |
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
730 return IsAsciiString(s.c_str(), s.size()); |
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
731 } |
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
732 |
330349d712f9
fix Toolbox::IsAsciiString
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2412
diff
changeset
|
733 |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
734 std::string Toolbox::ConvertToAscii(const std::string& source) |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
735 { |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
736 std::string result; |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
737 |
942
b3f6fb1130cd
fixes thanks to cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
930
diff
changeset
|
738 result.reserve(source.size() + 1); |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
739 for (size_t i = 0; i < source.size(); i++) |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
740 { |
2900 | 741 if (IsAsciiCharacter(source[i])) |
107
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
742 { |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
743 result.push_back(source[i]); |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
744 } |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
745 } |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
746 |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
747 return result; |
3b45473c0a73
replace boost::locale with iconv for debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
87
diff
changeset
|
748 } |
177 | 749 |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
750 |
177 | 751 void Toolbox::ComputeSHA1(std::string& result, |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
752 const void* data, |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
753 size_t size) |
177 | 754 { |
560
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
755 boost::uuids::detail::sha1 sha1; |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
756 |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
757 if (size > 0) |
177 | 758 { |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
759 sha1.process_bytes(data, size); |
177 | 760 } |
761 | |
560
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
762 unsigned int digest[5]; |
177 | 763 |
764 // Sanity check for the memory layout: A SHA-1 digest is 160 bits wide | |
560
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
765 assert(sizeof(unsigned int) == 4 && sizeof(digest) == (160 / 8)); |
177 | 766 |
560
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
767 sha1.get_digest(digest); |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
768 |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
769 result.resize(8 * 5 + 4); |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
770 sprintf(&result[0], "%08x-%08x-%08x-%08x-%08x", |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
771 digest[0], |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
772 digest[1], |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
773 digest[2], |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
774 digest[3], |
69c024f9c06b
fix of Debian bug #724947
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
483
diff
changeset
|
775 digest[4]); |
177 | 776 } |
777 | |
1833
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
778 void Toolbox::ComputeSHA1(std::string& result, |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
779 const std::string& data) |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
780 { |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
781 if (data.size() > 0) |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
782 { |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
783 ComputeSHA1(result, data.c_str(), data.size()); |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
784 } |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
785 else |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
786 { |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
787 ComputeSHA1(result, NULL, 0); |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
788 } |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
789 } |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
790 |
47d032c48818
"OrthancPluginComputeMd5()" and "OrthancPluginComputeSha1()" to compute MD5/SHA-1 hash
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1818
diff
changeset
|
791 |
3401 | 792 bool Toolbox::IsSHA1(const void* str, |
1446
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
793 size_t size) |
402 | 794 { |
1446
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
795 if (size == 0) |
1428 | 796 { |
797 return false; | |
798 } | |
799 | |
3401 | 800 const char* start = reinterpret_cast<const char*>(str); |
801 const char* end = start + size; | |
1428 | 802 |
803 // Trim the beginning of the string | |
804 while (start < end) | |
805 { | |
806 if (*start == '\0' || | |
807 isspace(*start)) | |
808 { | |
809 start++; | |
810 } | |
811 else | |
812 { | |
813 break; | |
814 } | |
815 } | |
816 | |
817 // Trim the trailing of the string | |
818 while (start < end) | |
819 { | |
820 if (*(end - 1) == '\0' || | |
821 isspace(*(end - 1))) | |
822 { | |
823 end--; | |
824 } | |
825 else | |
826 { | |
827 break; | |
828 } | |
829 } | |
830 | |
831 if (end - start != 44) | |
402 | 832 { |
833 return false; | |
834 } | |
835 | |
836 for (unsigned int i = 0; i < 44; i++) | |
837 { | |
838 if (i == 8 || | |
839 i == 17 || | |
840 i == 26 || | |
841 i == 35) | |
842 { | |
1428 | 843 if (start[i] != '-') |
402 | 844 return false; |
845 } | |
846 else | |
847 { | |
1428 | 848 if (!isalnum(start[i])) |
402 | 849 return false; |
850 } | |
851 } | |
852 | |
853 return true; | |
854 } | |
855 | |
1397 | 856 |
1446
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
857 bool Toolbox::IsSHA1(const std::string& s) |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
858 { |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
859 if (s.size() == 0) |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
860 { |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
861 return false; |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
862 } |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
863 else |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
864 { |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
865 return IsSHA1(s.c_str(), s.size()); |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
866 } |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
867 } |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
868 |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1430
diff
changeset
|
869 |
247
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
870 std::string Toolbox::StripSpaces(const std::string& source) |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
871 { |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
872 size_t first = 0; |
177 | 873 |
247
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
874 while (first < source.length() && |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
875 isspace(source[first])) |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
876 { |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
877 first++; |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
878 } |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
879 |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
880 if (first == source.length()) |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
881 { |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
882 // String containing only spaces |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
883 return ""; |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
884 } |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
885 |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
886 size_t last = source.length(); |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
887 while (last > first && |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
888 isspace(source[last - 1])) |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
889 { |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
890 last--; |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
891 } |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
892 |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
893 assert(first <= last); |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
894 return source.substr(first, last - first); |
c9b3ba0fd140
path management in zip files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
207
diff
changeset
|
895 } |
336 | 896 |
897 | |
337 | 898 static char Hex2Dec(char c) |
336 | 899 { |
900 return ((c >= '0' && c <= '9') ? c - '0' : | |
901 ((c >= 'a' && c <= 'f') ? c - 'a' + 10 : c - 'A' + 10)); | |
902 } | |
903 | |
904 void Toolbox::UrlDecode(std::string& s) | |
905 { | |
906 // http://en.wikipedia.org/wiki/Percent-encoding | |
907 // http://www.w3schools.com/tags/ref_urlencode.asp | |
908 // http://stackoverflow.com/questions/154536/encode-decode-urls-in-c | |
909 | |
910 if (s.size() == 0) | |
911 { | |
912 return; | |
913 } | |
914 | |
915 size_t source = 0; | |
916 size_t target = 0; | |
917 | |
918 while (source < s.size()) | |
919 { | |
920 if (s[source] == '%' && | |
921 source + 2 < s.size() && | |
922 isalnum(s[source + 1]) && | |
923 isalnum(s[source + 2])) | |
924 { | |
925 s[target] = (Hex2Dec(s[source + 1]) << 4) | Hex2Dec(s[source + 2]); | |
926 source += 3; | |
927 target += 1; | |
928 } | |
929 else | |
930 { | |
931 if (s[source] == '+') | |
932 s[target] = ' '; | |
933 else | |
934 s[target] = s[source]; | |
935 | |
936 source++; | |
937 target++; | |
938 } | |
939 } | |
940 | |
941 s.resize(target); | |
942 } | |
453 | 943 |
944 | |
945 Endianness Toolbox::DetectEndianness() | |
946 { | |
947 // http://sourceforge.net/p/predef/wiki/Endianness/ | |
948 | |
4203
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
949 uint32_t bufferView = 0; |
3489
e7723a39adf8
Fixed alignment issue in Toolbox::DetectEndianness() + made the internal logger
Benjamin Golinvaux <bgo@osimis.io>
parents:
3462
diff
changeset
|
950 |
e7723a39adf8
Fixed alignment issue in Toolbox::DetectEndianness() + made the internal logger
Benjamin Golinvaux <bgo@osimis.io>
parents:
3462
diff
changeset
|
951 uint8_t* buffer = reinterpret_cast<uint8_t*>(&bufferView); |
453 | 952 |
953 buffer[0] = 0x00; | |
954 buffer[1] = 0x01; | |
955 buffer[2] = 0x02; | |
956 buffer[3] = 0x03; | |
957 | |
3489
e7723a39adf8
Fixed alignment issue in Toolbox::DetectEndianness() + made the internal logger
Benjamin Golinvaux <bgo@osimis.io>
parents:
3462
diff
changeset
|
958 switch (bufferView) |
453 | 959 { |
960 case 0x00010203: | |
961 return Endianness_Big; | |
962 | |
963 case 0x03020100: | |
964 return Endianness_Little; | |
965 | |
966 default: | |
967 throw OrthancException(ErrorCode_NotImplemented); | |
968 } | |
969 } | |
608 | 970 |
971 std::string Toolbox::WildcardToRegularExpression(const std::string& source) | |
972 { | |
973 // TODO - Speed up this with a regular expression | |
974 | |
975 std::string result = source; | |
976 | |
977 // Escape all special characters | |
978 boost::replace_all(result, "\\", "\\\\"); | |
979 boost::replace_all(result, "^", "\\^"); | |
980 boost::replace_all(result, ".", "\\."); | |
981 boost::replace_all(result, "$", "\\$"); | |
982 boost::replace_all(result, "|", "\\|"); | |
983 boost::replace_all(result, "(", "\\("); | |
984 boost::replace_all(result, ")", "\\)"); | |
985 boost::replace_all(result, "[", "\\["); | |
986 boost::replace_all(result, "]", "\\]"); | |
987 boost::replace_all(result, "+", "\\+"); | |
988 boost::replace_all(result, "/", "\\/"); | |
989 boost::replace_all(result, "{", "\\{"); | |
990 boost::replace_all(result, "}", "\\}"); | |
991 | |
992 // Convert wildcards '*' and '?' to their regex equivalents | |
993 boost::replace_all(result, "?", "."); | |
994 boost::replace_all(result, "*", ".*"); | |
995 | |
996 return result; | |
997 } | |
998 | |
999 | |
1000 void Toolbox::TokenizeString(std::vector<std::string>& result, | |
1001 const std::string& value, | |
1002 char separator) | |
1003 { | |
3382
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1004 size_t countSeparators = 0; |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1005 |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1006 for (size_t i = 0; i < value.size(); i++) |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1007 { |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1008 if (value[i] == separator) |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1009 { |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1010 countSeparators++; |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1011 } |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1012 } |
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1013 |
608 | 1014 result.clear(); |
3382
a2862d4484f5
optimization of Toolbox::TokenizeString()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3333
diff
changeset
|
1015 result.reserve(countSeparators + 1); |
608 | 1016 |
1017 std::string currentItem; | |
1018 | |
1019 for (size_t i = 0; i < value.size(); i++) | |
1020 { | |
1021 if (value[i] == separator) | |
1022 { | |
1023 result.push_back(currentItem); | |
1024 currentItem.clear(); | |
1025 } | |
1026 else | |
1027 { | |
1028 currentItem.push_back(value[i]); | |
1029 } | |
1030 } | |
1031 | |
1032 result.push_back(currentItem); | |
1033 } | |
800
ecedd89055db
generation of DICOM images from PNG files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
1034 |
ecedd89055db
generation of DICOM images from PNG files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
1035 |
4938
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1036 void Toolbox::JoinStrings(std::string& result, |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1037 std::set<std::string>& source, |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1038 const char* separator) |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1039 { |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1040 result = boost::algorithm::join(source, separator); |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1041 } |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1042 |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1043 void JoinStrings(std::string& result, |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1044 std::vector<std::string>& source, |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1045 const char* separator) |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1046 { |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1047 result = boost::algorithm::join(source, separator); |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1048 } |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1049 |
f630796a59b1
ExpandResource now able to return computed tags (like ModalitiesInStudies)
Alain Mazy <am@osimis.io>
parents:
4892
diff
changeset
|
1050 |
2136
dd609a99d39a
uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2129
diff
changeset
|
1051 #if ORTHANC_ENABLE_PUGIXML == 1 |
1045
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1052 class ChunkedBufferWriter : public pugi::xml_writer |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1053 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1054 private: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1055 ChunkedBuffer buffer_; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1056 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1057 public: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1058 virtual void write(const void *data, size_t size) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1059 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1060 if (size > 0) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1061 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1062 buffer_.AddChunk(reinterpret_cast<const char*>(data), size); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1063 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1064 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1065 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1066 void Flatten(std::string& s) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1067 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1068 buffer_.Flatten(s); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1069 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1070 }; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1071 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1072 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1073 static void JsonToXmlInternal(pugi::xml_node& target, |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1074 const Json::Value& source, |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1075 const std::string& arrayElement) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1076 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1077 // http://jsoncpp.sourceforge.net/value_8h_source.html#l00030 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1078 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1079 switch (source.type()) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1080 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1081 case Json::nullValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1082 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1083 target.append_child(pugi::node_pcdata).set_value("null"); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1084 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1085 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1086 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1087 case Json::intValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1088 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1089 std::string s = boost::lexical_cast<std::string>(source.asInt()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1090 target.append_child(pugi::node_pcdata).set_value(s.c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1091 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1092 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1093 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1094 case Json::uintValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1095 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1096 std::string s = boost::lexical_cast<std::string>(source.asUInt()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1097 target.append_child(pugi::node_pcdata).set_value(s.c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1098 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1099 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1100 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1101 case Json::realValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1102 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1103 std::string s = boost::lexical_cast<std::string>(source.asFloat()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1104 target.append_child(pugi::node_pcdata).set_value(s.c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1105 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1106 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1107 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1108 case Json::stringValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1109 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1110 target.append_child(pugi::node_pcdata).set_value(source.asString().c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1111 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1112 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1113 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1114 case Json::booleanValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1115 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1116 target.append_child(pugi::node_pcdata).set_value(source.asBool() ? "true" : "false"); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1117 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1118 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1119 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1120 case Json::arrayValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1121 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1122 for (Json::Value::ArrayIndex i = 0; i < source.size(); i++) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1123 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1124 pugi::xml_node node = target.append_child(); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1125 node.set_name(arrayElement.c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1126 JsonToXmlInternal(node, source[i], arrayElement); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1127 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1128 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1129 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1130 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1131 case Json::objectValue: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1132 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1133 Json::Value::Members members = source.getMemberNames(); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1134 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1135 for (size_t i = 0; i < members.size(); i++) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1136 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1137 pugi::xml_node node = target.append_child(); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1138 node.set_name(members[i].c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1139 JsonToXmlInternal(node, source[members[i]], arrayElement); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1140 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1141 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1142 break; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1143 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1144 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1145 default: |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1146 throw OrthancException(ErrorCode_NotImplemented); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1147 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1148 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1149 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1150 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1151 void Toolbox::JsonToXml(std::string& target, |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1152 const Json::Value& source, |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1153 const std::string& rootElement, |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1154 const std::string& arrayElement) |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1155 { |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1156 pugi::xml_document doc; |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1157 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1158 pugi::xml_node n = doc.append_child(rootElement.c_str()); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1159 JsonToXmlInternal(n, source, arrayElement); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1160 |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1161 pugi::xml_node decl = doc.prepend_child(pugi::node_declaration); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1162 decl.append_attribute("version").set_value("1.0"); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1163 decl.append_attribute("encoding").set_value("utf-8"); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1164 |
3203
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1165 XmlToString(target, doc); |
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1166 } |
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1167 |
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1168 void Toolbox::XmlToString(std::string& target, |
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1169 const pugi::xml_document& source) |
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1170 { |
1045
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1171 ChunkedBufferWriter writer; |
3203
810772486249
URI "/instances/.../file" can return DICOMweb JSON or XML, depending on Accept header
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1172 source.save(writer, " ", pugi::format_default, pugi::encoding_utf8); |
1045
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1173 writer.Flatten(target); |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1174 } |
0bfeeb6d340f
json to xml conversion with pugixml
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
971
diff
changeset
|
1175 #endif |
1050
64f1842aae2e
Toolbox::ExecuteSystemCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1045
diff
changeset
|
1176 |
64f1842aae2e
Toolbox::ExecuteSystemCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1045
diff
changeset
|
1177 |
1102
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1178 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1179 bool Toolbox::IsInteger(const std::string& str) |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1180 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1181 std::string s = StripSpaces(str); |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1182 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1183 if (s.size() == 0) |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1184 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1185 return false; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1186 } |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1187 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1188 size_t pos = 0; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1189 if (s[0] == '-') |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1190 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1191 if (s.size() == 1) |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1192 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1193 return false; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1194 } |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1195 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1196 pos = 1; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1197 } |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1198 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1199 while (pos < s.size()) |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1200 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1201 if (!isdigit(s[pos])) |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1202 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1203 return false; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1204 } |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1205 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1206 pos++; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1207 } |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1208 |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1209 return true; |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1101
diff
changeset
|
1210 } |
1424
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1211 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1212 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1213 void Toolbox::CopyJsonWithoutComments(Json::Value& target, |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1214 const Json::Value& source) |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1215 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1216 switch (source.type()) |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1217 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1218 case Json::nullValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1219 target = Json::nullValue; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1220 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1221 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1222 case Json::intValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1223 target = source.asInt64(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1224 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1225 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1226 case Json::uintValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1227 target = source.asUInt64(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1228 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1229 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1230 case Json::realValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1231 target = source.asDouble(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1232 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1233 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1234 case Json::stringValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1235 target = source.asString(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1236 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1237 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1238 case Json::booleanValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1239 target = source.asBool(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1240 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1241 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1242 case Json::arrayValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1243 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1244 target = Json::arrayValue; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1245 for (Json::Value::ArrayIndex i = 0; i < source.size(); i++) |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1246 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1247 Json::Value& item = target.append(Json::nullValue); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1248 CopyJsonWithoutComments(item, source[i]); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1249 } |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1250 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1251 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1252 } |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1253 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1254 case Json::objectValue: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1255 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1256 target = Json::objectValue; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1257 Json::Value::Members members = source.getMemberNames(); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1258 for (Json::Value::ArrayIndex i = 0; i < members.size(); i++) |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1259 { |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1260 const std::string item = members[i]; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1261 CopyJsonWithoutComments(target[item], source[item]); |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1262 } |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1263 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1264 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1265 } |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1266 |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1267 default: |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1268 break; |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1269 } |
fe384a9d3b51
OrthancPluginGetConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1397
diff
changeset
|
1270 } |
1430
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1271 |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1272 |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1273 bool Toolbox::StartsWith(const std::string& str, |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1274 const std::string& prefix) |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1275 { |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1276 if (str.size() < prefix.size()) |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1277 { |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1278 return false; |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1279 } |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1280 else |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1281 { |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1282 return str.compare(0, prefix.size(), prefix) == 0; |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1283 } |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1428
diff
changeset
|
1284 } |
2043
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1285 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1286 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1287 static bool IsUnreservedCharacter(char c) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1288 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1289 // This function checks whether "c" is an unserved character |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1290 // wrt. an URI percent-encoding |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1291 // https://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding%5Fin%5Fa%5FURI |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1292 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1293 return ((c >= 'A' && c <= 'Z') || |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1294 (c >= 'a' && c <= 'z') || |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1295 (c >= '0' && c <= '9') || |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1296 c == '-' || |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1297 c == '_' || |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1298 c == '.' || |
4234
a38376b80cd1
WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4203
diff
changeset
|
1299 c == '~' || |
a38376b80cd1
WebDAV: by-studies and by-patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4203
diff
changeset
|
1300 c == '/'); |
2043
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1301 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1302 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1303 void Toolbox::UriEncode(std::string& target, |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1304 const std::string& source) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1305 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1306 // Estimate the length of the percent-encoded URI |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1307 size_t length = 0; |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1308 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1309 for (size_t i = 0; i < source.size(); i++) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1310 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1311 if (IsUnreservedCharacter(source[i])) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1312 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1313 length += 1; |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1314 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1315 else |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1316 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1317 // This character must be percent-encoded |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1318 length += 3; |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1319 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1320 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1321 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1322 target.clear(); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1323 target.reserve(length); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1324 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1325 for (size_t i = 0; i < source.size(); i++) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1326 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1327 if (IsUnreservedCharacter(source[i])) |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1328 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1329 target.push_back(source[i]); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1330 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1331 else |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1332 { |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1333 // This character must be percent-encoded |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1334 uint8_t byte = static_cast<uint8_t>(source[i]); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1335 uint8_t a = byte >> 4; |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1336 uint8_t b = byte & 0x0f; |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1337 |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1338 target.push_back('%'); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1339 target.push_back(a < 10 ? a + '0' : a - 10 + 'A'); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1340 target.push_back(b < 10 ? b + '0' : b - 10 + 'A'); |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1341 } |
35ccba7adae9
Toolbox::UriEncode
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2017
diff
changeset
|
1342 } |
2071 | 1343 } |
1344 | |
1345 | |
1346 static bool HasField(const Json::Value& json, | |
1347 const std::string& key, | |
1348 Json::ValueType expectedType) | |
1349 { | |
1350 if (json.type() != Json::objectValue || | |
1351 !json.isMember(key)) | |
1352 { | |
1353 return false; | |
1354 } | |
1355 else if (json[key].type() == expectedType) | |
1356 { | |
1357 return true; | |
1358 } | |
1359 else | |
1360 { | |
1361 throw OrthancException(ErrorCode_BadParameterType); | |
1362 } | |
1363 } | |
1364 | |
1365 | |
1366 std::string Toolbox::GetJsonStringField(const Json::Value& json, | |
1367 const std::string& key, | |
1368 const std::string& defaultValue) | |
1369 { | |
1370 if (HasField(json, key, Json::stringValue)) | |
1371 { | |
1372 return json[key].asString(); | |
1373 } | |
1374 else | |
1375 { | |
1376 return defaultValue; | |
1377 } | |
1378 } | |
1379 | |
1380 | |
1381 bool Toolbox::GetJsonBooleanField(const ::Json::Value& json, | |
1382 const std::string& key, | |
1383 bool defaultValue) | |
1384 { | |
1385 if (HasField(json, key, Json::booleanValue)) | |
1386 { | |
1387 return json[key].asBool(); | |
1388 } | |
1389 else | |
1390 { | |
1391 return defaultValue; | |
1392 } | |
1393 } | |
1394 | |
1395 | |
1396 int Toolbox::GetJsonIntegerField(const ::Json::Value& json, | |
1397 const std::string& key, | |
1398 int defaultValue) | |
1399 { | |
1400 if (HasField(json, key, Json::intValue)) | |
1401 { | |
1402 return json[key].asInt(); | |
1403 } | |
1404 else | |
1405 { | |
1406 return defaultValue; | |
1407 } | |
1408 } | |
1409 | |
1410 | |
1411 unsigned int Toolbox::GetJsonUnsignedIntegerField(const ::Json::Value& json, | |
1412 const std::string& key, | |
1413 unsigned int defaultValue) | |
1414 { | |
1415 int v = GetJsonIntegerField(json, key, defaultValue); | |
1416 | |
1417 if (v < 0) | |
1418 { | |
1419 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1420 } | |
1421 else | |
1422 { | |
1423 return static_cast<unsigned int>(v); | |
1424 } | |
1425 } | |
2140 | 1426 |
1427 | |
2141 | 1428 bool Toolbox::IsUuid(const std::string& str) |
1429 { | |
1430 if (str.size() != 36) | |
1431 { | |
1432 return false; | |
1433 } | |
1434 | |
1435 for (size_t i = 0; i < str.length(); i++) | |
1436 { | |
1437 if (i == 8 || i == 13 || i == 18 || i == 23) | |
1438 { | |
1439 if (str[i] != '-') | |
1440 return false; | |
1441 } | |
1442 else | |
1443 { | |
1444 if (!isalnum(str[i])) | |
1445 return false; | |
1446 } | |
1447 } | |
1448 | |
1449 return true; | |
1450 } | |
1451 | |
1452 | |
1453 bool Toolbox::StartsWithUuid(const std::string& str) | |
1454 { | |
1455 if (str.size() < 36) | |
1456 { | |
1457 return false; | |
1458 } | |
1459 | |
1460 if (str.size() == 36) | |
1461 { | |
1462 return IsUuid(str); | |
1463 } | |
1464 | |
1465 assert(str.size() > 36); | |
1466 if (!isspace(str[36])) | |
1467 { | |
1468 return false; | |
1469 } | |
1470 | |
1471 return IsUuid(str.substr(0, 36)); | |
1472 } | |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1473 |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1474 |
2367
2aff870c2c58
refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2351
diff
changeset
|
1475 #if ORTHANC_ENABLE_LOCALE == 1 |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
1476 static std::unique_ptr<std::locale> globalLocale_; |
2334 | 1477 |
1478 static bool SetGlobalLocale(const char* locale) | |
1479 { | |
1480 try | |
1481 { | |
1482 if (locale == NULL) | |
1483 { | |
1484 LOG(WARNING) << "Falling back to system-wide default locale"; | |
1485 globalLocale_.reset(new std::locale()); | |
1486 } | |
1487 else | |
1488 { | |
2351 | 1489 LOG(INFO) << "Using locale: \"" << locale << "\" for case-insensitive comparison of strings"; |
2334 | 1490 globalLocale_.reset(new std::locale(locale)); |
1491 } | |
1492 } | |
3459
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1493 catch (std::runtime_error& e) |
2334 | 1494 { |
3459
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1495 LOG(ERROR) << "Cannot set globale locale to " |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1496 << (locale ? std::string(locale) : "(null)") |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1497 << ": " << e.what(); |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1498 globalLocale_.reset(NULL); |
2334 | 1499 } |
1500 | |
1501 return (globalLocale_.get() != NULL); | |
1502 } | |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1503 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1504 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1505 static void InitializeIcu() |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1506 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1507 #if ORTHANC_STATIC_ICU == 1 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1508 if (globalIcuData_.empty()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1509 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1510 LOG(INFO) << "Setting up the ICU common data"; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1511 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1512 GzipCompressor compressor; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1513 compressor.Uncompress(globalIcuData_, |
4032
058b5ade8acd
renaming embedded resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4030
diff
changeset
|
1514 FrameworkResources::GetFileResourceBuffer(FrameworkResources::LIBICU_DATA), |
058b5ade8acd
renaming embedded resources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4030
diff
changeset
|
1515 FrameworkResources::GetFileResourceSize(FrameworkResources::LIBICU_DATA)); |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1516 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1517 std::string md5; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1518 Toolbox::ComputeMD5(md5, globalIcuData_); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1519 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1520 if (md5 != ORTHANC_ICU_DATA_MD5 || |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1521 globalIcuData_.empty()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1522 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1523 throw OrthancException(ErrorCode_InternalError, |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1524 "Cannot decode the ICU common data"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1525 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1526 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1527 // "ICU data is designed to be 16-aligned" |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1528 // http://userguide.icu-project.org/icudata#TOC-Alignment |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1529 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1530 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1531 static const size_t ALIGN = 16; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1532 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1533 UErrorCode status = U_ZERO_ERROR; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1534 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1535 if (reinterpret_cast<intptr_t>(globalIcuData_.c_str()) % ALIGN == 0) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1536 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1537 // Data is already properly aligned |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1538 udata_setCommonData(globalIcuData_.c_str(), &status); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1539 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1540 else |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1541 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1542 std::string aligned; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1543 aligned.resize(globalIcuData_.size() + ALIGN - 1); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1544 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1545 intptr_t offset = reinterpret_cast<intptr_t>(aligned.c_str()) % ALIGN; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1546 if (offset != 0) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1547 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1548 offset = ALIGN - offset; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1549 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1550 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1551 if (offset + globalIcuData_.size() > aligned.size()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1552 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1553 throw OrthancException(ErrorCode_InternalError, "Cannot align on 16-bytes boundary"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1554 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1555 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1556 // We don't use "memcpy()", as it expects its data to be aligned |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1557 const uint8_t* p = reinterpret_cast<uint8_t*>(&globalIcuData_[0]); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1558 uint8_t* q = reinterpret_cast<uint8_t*>(&aligned[0]) + offset; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1559 for (size_t i = 0; i < globalIcuData_.size(); i++, p++, q++) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1560 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1561 *q = *p; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1562 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1563 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1564 globalIcuData_.swap(aligned); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1565 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1566 const uint8_t* data = reinterpret_cast<const uint8_t*>(globalIcuData_.c_str()) + offset; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1567 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1568 if (reinterpret_cast<intptr_t>(data) % ALIGN != 0) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1569 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1570 throw OrthancException(ErrorCode_InternalError, "Cannot align on 16-bytes boundary"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1571 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1572 else |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1573 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1574 udata_setCommonData(data, &status); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1575 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1576 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1577 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1578 if (status != U_ZERO_ERROR) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1579 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1580 throw OrthancException(ErrorCode_InternalError, "Cannot initialize ICU"); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1581 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1582 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1583 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1584 if (Toolbox::DetectEndianness() != Endianness_Little) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1585 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1586 // TODO - The data table must be swapped (uint16_t) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1587 throw OrthancException(ErrorCode_NotImplemented); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1588 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1589 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1590 // "First-use of ICU from a single thread before the |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1591 // multi-threaded use of ICU begins", to make sure everything is |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1592 // properly initialized (should not be mandatory in our |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1593 // case). We let boost handle calls to "u_init()" and "u_cleanup()". |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1594 // http://userguide.icu-project.org/design#TOC-ICU-Initialization-and-Termination |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1595 uloc_getDefault(); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1596 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1597 #endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1598 } |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1599 |
2330
9c7a80c87ae9
"Locale" configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2326
diff
changeset
|
1600 void Toolbox::InitializeGlobalLocale(const char* locale) |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1601 { |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1602 InitializeIcu(); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1603 |
3459
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1604 #if defined(__unix__) && ORTHANC_SANDBOXED != 1 |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1605 static const char* LOCALTIME = "/etc/localtime"; |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1606 |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1607 if (!SystemToolbox::IsExistingFile(LOCALTIME)) |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1608 { |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1609 // Check out file |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1610 // "boost_1_69_0/libs/locale/src/icu/time_zone.cpp": Direct |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1611 // access is made to this file if ICU is not used. Crash arises |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1612 // in Boost if the file is a symbolic link to a non-existing |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1613 // file (such as in Ubuntu 16.04 base Docker image). |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1614 throw OrthancException( |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1615 ErrorCode_InternalError, |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1616 "On UNIX-like systems, the file " + std::string(LOCALTIME) + |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1617 " must be present on the filesystem (install \"tzdata\" package on Debian)"); |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1618 } |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1619 #endif |
cbbe0bb80bd4
explicit error message if missing /etc/localtime
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
1620 |
2334 | 1621 bool ok; |
1622 | |
1623 if (locale == NULL) | |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1624 { |
4203
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1625 // Make Orthanc use English, United States locale |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1626 // Linux: use "en_US.UTF-8" |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1627 // Windows: use "" |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1628 // Wine: use NULL |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1629 |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1630 #if defined(__MINGW32__) |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1631 // Visibly, there is no support of locales in MinGW yet |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1632 // http://mingw.5.n7.nabble.com/How-to-use-std-locale-global-with-MinGW-correct-td33048.html |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1633 static const char* DEFAULT_LOCALE = NULL; |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1634 #elif defined(_WIN32) |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1635 // For Windows: use default locale (using "en_US" does not work) |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1636 static const char* DEFAULT_LOCALE = ""; |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1637 #else |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1638 // For Linux & cie |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1639 static const char* DEFAULT_LOCALE = "en_US.UTF-8"; |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1640 #endif |
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1641 |
2334 | 1642 ok = SetGlobalLocale(DEFAULT_LOCALE); |
1643 | |
1644 #if defined(__MINGW32__) | |
1645 LOG(WARNING) << "This is a MinGW build, case-insensitive comparison of " | |
1646 << "strings with accents will not work outside of Wine"; | |
1647 #endif | |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1648 } |
2334 | 1649 else |
1650 { | |
1651 ok = SetGlobalLocale(locale); | |
1652 } | |
1653 | |
1654 if (!ok && | |
1655 !SetGlobalLocale(NULL)) | |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1656 { |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2931
diff
changeset
|
1657 throw OrthancException(ErrorCode_InternalError, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2931
diff
changeset
|
1658 "Cannot initialize global locale"); |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1659 } |
2334 | 1660 |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1661 } |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1662 |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1663 |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1664 void Toolbox::FinalizeGlobalLocale() |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1665 { |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1666 globalLocale_.reset(); |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1667 } |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1668 |
2677
0196d07a900f
migrate OpenSSL initialization to Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2513
diff
changeset
|
1669 |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1670 std::string Toolbox::ToUpperCaseWithAccents(const std::string& source) |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1671 { |
3333
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1672 bool error = (globalLocale_.get() == NULL); |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1673 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1674 #if ORTHANC_STATIC_ICU == 1 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1675 if (globalIcuData_.empty()) |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1676 { |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1677 error = true; |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1678 } |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1679 #endif |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1680 |
2a38e00a0638
Size of the Orthanc static binaries are reduced by compressing ICU data
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3328
diff
changeset
|
1681 if (error) |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1682 { |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2931
diff
changeset
|
1683 throw OrthancException(ErrorCode_BadSequenceOfCalls, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2931
diff
changeset
|
1684 "No global locale was set, call Toolbox::InitializeGlobalLocale()"); |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1685 } |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1686 |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1687 /** |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1688 * A few notes about locales: |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1689 * |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1690 * (1) We don't use "case folding": |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1691 * http://www.boost.org/doc/libs/1_64_0/libs/locale/doc/html/conversions.html |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1692 * |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1693 * Characters are made uppercase one by one. This is because, in |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1694 * static builds, we are using iconv, which is visibly not |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1695 * supported correctly (TODO: Understand why). Case folding seems |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1696 * to be working correctly if using the default backend under |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1697 * Linux (ICU or POSIX?). If one wishes to use case folding, one |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1698 * would use: |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1699 * |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1700 * boost::locale::generator gen; |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1701 * std::locale::global(gen(DEFAULT_LOCALE)); |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1702 * return boost::locale::to_upper(source); |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1703 * |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1704 * (2) The function "boost::algorithm::to_upper_copy" does not |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1705 * make use of the "std::locale::global()". We therefore create a |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1706 * global variable "globalLocale_". |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1707 * |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1708 * (3) The variant of "boost::algorithm::to_upper_copy()" that |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1709 * uses std::string does not work properly. We need to apply it |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1710 * one wide strings (std::wstring). This explains the two calls to |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1711 * "utf_to_utf" in order to convert to/from std::wstring. |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1712 **/ |
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1713 |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
1714 std::wstring w = boost::locale::conv::utf_to_utf<wchar_t>(source, boost::locale::conv::skip); |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1715 w = boost::algorithm::to_upper_copy<std::wstring>(w, *globalLocale_); |
2907
0204af4ece6a
Remove invalid characters from badly-encoded UTF-8 strings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2906
diff
changeset
|
1716 return boost::locale::conv::utf_to_utf<char>(w, boost::locale::conv::skip); |
2326
423d3b692bb9
Upgrade to Boost 1.64.0, and Toolbox::ToUpperCaseWithAccents
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
1717 } |
2373 | 1718 #endif |
2512
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1719 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1720 |
3802
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1721 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1722 #if ORTHANC_ENABLE_SSL == 0 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1723 /** |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1724 * OpenSSL is disabled |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1725 **/ |
2678 | 1726 void Toolbox::InitializeOpenSsl() |
1727 { | |
4706
dbee8bd8ee1f
display OpenSSL version in the logs
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4622
diff
changeset
|
1728 LOG(INFO) << "OpenSSL is disabled"; |
3802
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1729 } |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1730 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1731 void Toolbox::FinalizeOpenSsl() |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1732 { |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1733 } |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1734 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1735 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1736 #elif (ORTHANC_ENABLE_SSL == 1 && \ |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1737 OPENSSL_VERSION_NUMBER < 0x10100000L) |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1738 /** |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1739 * OpenSSL < 1.1.0 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1740 **/ |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1741 void Toolbox::InitializeOpenSsl() |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1742 { |
4706
dbee8bd8ee1f
display OpenSSL version in the logs
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4622
diff
changeset
|
1743 LOG(INFO) << "OpenSSL version: " << OPENSSL_VERSION_TEXT; |
dbee8bd8ee1f
display OpenSSL version in the logs
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4622
diff
changeset
|
1744 |
2678 | 1745 // https://wiki.openssl.org/index.php/Library_Initialization |
1746 SSL_library_init(); | |
1747 SSL_load_error_strings(); | |
1748 OpenSSL_add_all_algorithms(); | |
1749 ERR_load_crypto_strings(); | |
1750 } | |
1751 | |
1752 void Toolbox::FinalizeOpenSsl() | |
1753 { | |
1754 // Finalize OpenSSL | |
1755 // https://wiki.openssl.org/index.php/Library_Initialization#Cleanup | |
1756 #ifdef FIPS_mode_set | |
1757 FIPS_mode_set(0); | |
1758 #endif | |
3720
faa695f433d5
upgraded OpenSSL to 1.1.1d
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1759 |
faa695f433d5
upgraded OpenSSL to 1.1.1d
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1760 #if !defined(OPENSSL_NO_ENGINE) |
2678 | 1761 ENGINE_cleanup(); |
3720
faa695f433d5
upgraded OpenSSL to 1.1.1d
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1762 #endif |
faa695f433d5
upgraded OpenSSL to 1.1.1d
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1763 |
2678 | 1764 CONF_modules_unload(1); |
1765 EVP_cleanup(); | |
1766 CRYPTO_cleanup_all_ex_data(); | |
1767 ERR_remove_state(0); | |
1768 ERR_free_strings(); | |
3802
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1769 } |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1770 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1771 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1772 #elif (ORTHANC_ENABLE_SSL == 1 && \ |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1773 OPENSSL_VERSION_NUMBER >= 0x10100000L) |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1774 /** |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1775 * OpenSSL >= 1.1.0. In this case, the initialization is |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1776 * automatically done by the functions of OpenSSL. |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1777 * https://wiki.openssl.org/index.php/Library_Initialization |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1778 **/ |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1779 void Toolbox::InitializeOpenSsl() |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1780 { |
4706
dbee8bd8ee1f
display OpenSSL version in the logs
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4622
diff
changeset
|
1781 LOG(INFO) << "OpenSSL version: " << OPENSSL_VERSION_TEXT; |
3802
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1782 } |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1783 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1784 void Toolbox::FinalizeOpenSsl() |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1785 { |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1786 } |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1787 |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1788 #else |
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1789 # error "Support your platform here" |
2678 | 1790 #endif |
3802
6462ecaa045b
fix unit test, reorganization of OpenSSL initialization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3731
diff
changeset
|
1791 |
2678 | 1792 |
1793 | |
2512
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1794 std::string Toolbox::GenerateUuid() |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1795 { |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1796 #ifdef WIN32 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1797 UUID uuid; |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1798 UuidCreate ( &uuid ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1799 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1800 unsigned char * str; |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1801 UuidToStringA ( &uuid, &str ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1802 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1803 std::string s( ( char* ) str ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1804 |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1805 RpcStringFreeA ( &str ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1806 #else |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1807 uuid_t uuid; |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1808 uuid_generate_random ( uuid ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1809 char s[37]; |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1810 uuid_unparse ( uuid, s ); |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1811 #endif |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1812 return s; |
4dcafa8d6633
SystemToolbox::GenerateUuid moved to Toolbox::GenerateUuid
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1813 } |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1814 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1815 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1816 namespace |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1817 { |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1818 // Anonymous namespace to avoid clashes between compilation modules |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1819 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1820 class VariableFormatter |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1821 { |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1822 public: |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1823 typedef std::map<std::string, std::string> Dictionary; |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1824 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1825 private: |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1826 const Dictionary& dictionary_; |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1827 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1828 public: |
4203
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
1829 explicit VariableFormatter(const Dictionary& dictionary) : |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1830 dictionary_(dictionary) |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1831 { |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1832 } |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1833 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1834 template<typename Out> |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1835 Out operator()(const boost::smatch& what, |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1836 Out out) const |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1837 { |
2921
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1838 if (!what[1].str().empty()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1839 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1840 // Variable without a default value |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1841 Dictionary::const_iterator found = dictionary_.find(what[1]); |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1842 |
2921
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1843 if (found != dictionary_.end()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1844 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1845 const std::string& value = found->second; |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1846 out = std::copy(value.begin(), value.end(), out); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1847 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1848 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1849 else |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1850 { |
2921
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1851 // Variable with a default value |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1852 std::string key; |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1853 std::string defaultValue; |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1854 |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1855 if (!what[2].str().empty()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1856 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1857 key = what[2].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1858 defaultValue = what[3].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1859 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1860 else if (!what[4].str().empty()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1861 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1862 key = what[4].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1863 defaultValue = what[5].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1864 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1865 else if (!what[6].str().empty()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1866 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1867 key = what[6].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1868 defaultValue = what[7].str(); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1869 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1870 else |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1871 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1872 throw OrthancException(ErrorCode_InternalError); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1873 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1874 |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1875 Dictionary::const_iterator found = dictionary_.find(key); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1876 |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1877 if (found == dictionary_.end()) |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1878 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1879 out = std::copy(defaultValue.begin(), defaultValue.end(), out); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1880 } |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1881 else |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1882 { |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1883 const std::string& value = found->second; |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1884 out = std::copy(value.begin(), value.end(), out); |
0a4428aad512
variable substitution with default value
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2920
diff
changeset
|
1885 } |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1886 } |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1887 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1888 return out; |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1889 } |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1890 }; |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1891 } |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1892 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1893 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1894 std::string Toolbox::SubstituteVariables(const std::string& source, |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1895 const std::map<std::string, std::string>& dictionary) |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1896 { |
2926
0bcf46cea4e4
fix for older versions of boost::regex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2921
diff
changeset
|
1897 const boost::regex pattern("\\$\\{([^:]*?)\\}|" // ${what[1]} |
0bcf46cea4e4
fix for older versions of boost::regex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2921
diff
changeset
|
1898 "\\$\\{([^:]*?):-([^'\"]*?)\\}|" // ${what[2]:-what[3]} |
0bcf46cea4e4
fix for older versions of boost::regex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2921
diff
changeset
|
1899 "\\$\\{([^:]*?):-\"([^\"]*?)\"\\}|" // ${what[4]:-"what[5]"} |
0bcf46cea4e4
fix for older versions of boost::regex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2921
diff
changeset
|
1900 "\\$\\{([^:]*?):-'([^']*?)'\\}"); // ${what[6]:-'what[7]'} |
2920
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1901 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1902 VariableFormatter formatter(dictionary); |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1903 |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1904 return boost::regex_replace(source, pattern, formatter); |
ad0e7def3338
Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2907
diff
changeset
|
1905 } |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1906 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1907 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1908 namespace Iso2022 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1909 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1910 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1911 Returns whether the string s contains a single-byte control message |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1912 at index i |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1913 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1914 static inline bool IsControlMessage1(const std::string& s, size_t i) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1915 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1916 if (i < s.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1917 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1918 char c = s[i]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1919 return |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1920 (c == '\x0f') || // Locking shift zero |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1921 (c == '\x0e'); // Locking shift one |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1922 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1923 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1924 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1925 return false; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1926 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1927 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1928 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1929 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1930 Returns whether the string s contains a double-byte control message |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1931 at index i |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1932 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1933 static inline size_t IsControlMessage2(const std::string& s, size_t i) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1934 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1935 if (i + 1 < s.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1936 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1937 char c1 = s[i]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1938 char c2 = s[i + 1]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1939 return (c1 == 0x1b) && ( |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1940 (c2 == '\x6e') || // Locking shift two |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1941 (c2 == '\x6f') || // Locking shift three |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1942 (c2 == '\x4e') || // Single shift two (alt) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1943 (c2 == '\x4f') || // Single shift three (alt) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1944 (c2 == '\x7c') || // Locking shift three right |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1945 (c2 == '\x7d') || // Locking shift two right |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1946 (c2 == '\x7e') // Locking shift one right |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1947 ); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1948 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1949 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1950 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1951 return false; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1952 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1953 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1954 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1955 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1956 Returns whether the string s contains a triple-byte control message |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1957 at index i |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1958 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1959 static inline size_t IsControlMessage3(const std::string& s, size_t i) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1960 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1961 if (i + 2 < s.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1962 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1963 char c1 = s[i]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1964 char c2 = s[i + 1]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1965 char c3 = s[i + 2]; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1966 return ((c1 == '\x8e' && c2 == 0x1b && c3 == '\x4e') || |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1967 (c1 == '\x8f' && c2 == 0x1b && c3 == '\x4f')); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1968 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1969 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1970 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1971 return false; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1972 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1973 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1974 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1975 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1976 This function returns true if the index i in the supplied string s: |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1977 - is valid |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1978 - contains the c character |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1979 This function returns false otherwise. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1980 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1981 static inline bool TestCharValue( |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1982 const std::string& s, size_t i, char c) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1983 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1984 if (i < s.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1985 return s[i] == c; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1986 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1987 return false; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1988 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1989 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1990 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1991 This function returns true if the index i in the supplied string s: |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1992 - is valid |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1993 - has a c character that is >= cMin and <= cMax (included) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1994 This function returns false otherwise. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1995 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1996 static inline bool TestCharRange( |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1997 const std::string& s, size_t i, char cMin, char cMax) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1998 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
1999 if (i < s.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2000 return (s[i] >= cMin) && (s[i] <= cMax); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2001 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2002 return false; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2003 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2004 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2005 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2006 This function returns the total length in bytes of the escape sequence |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2007 located in string s at index i, if there is one, or 0 otherwise. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2008 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2009 static inline size_t GetEscapeSequenceLength(const std::string& s, size_t i) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2010 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2011 if (TestCharValue(s, i, 0x1b)) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2012 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2013 size_t j = i+1; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2014 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2015 // advance reading cursor while we are in a sequence |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2016 while (TestCharRange(s, j, '\x20', '\x2f')) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2017 ++j; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2018 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2019 // check there is a valid termination byte AND we're long enough (there |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2020 // must be at least one byte between 0x20 and 0x2f |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2021 if (TestCharRange(s, j, '\x30', '\x7f') && (j - i) >= 2) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2022 return j - i + 1; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2023 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2024 return 0; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2025 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2026 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2027 return 0; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2028 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2029 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2030 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2031 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2032 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2033 /** |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2034 This function will strip all ISO/IEC 2022 control codes and escape |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2035 sequences. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2036 Please see https://en.wikipedia.org/wiki/ISO/IEC_2022 (as of 2019-02) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2037 for a list of those. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2038 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2039 Please note that this operation is potentially destructive, because |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2040 it removes the character set information from the byte stream. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2041 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2042 However, in the case where the encoding is unique, then suppressing |
3973
d86bddb50972
fix spelling errors according to debian
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3802
diff
changeset
|
2043 the escape sequences allows one to provide us with a clean string after |
3217
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2044 conversion to utf-8 with boost. |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2045 **/ |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2046 void Toolbox::RemoveIso2022EscapeSequences(std::string& dest, const std::string& src) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2047 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2048 // we need AT MOST the same size as the source string in the output |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2049 dest.clear(); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2050 if (dest.capacity() < src.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2051 dest.reserve(src.size()); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2052 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2053 size_t i = 0; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2054 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2055 // uint8_t view to the string |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2056 while (i < src.size()) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2057 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2058 size_t j = i; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2059 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2060 // The i index will only be incremented if a message is detected |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2061 // in that case, the message is skipped and the index is set to the |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2062 // next position to read |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2063 if (Iso2022::IsControlMessage1(src, i)) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2064 i += 1; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2065 else if (Iso2022::IsControlMessage2(src, i)) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2066 i += 2; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2067 else if (Iso2022::IsControlMessage3(src, i)) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2068 i += 3; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2069 else |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2070 i += Iso2022::GetEscapeSequenceLength(src, i); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2071 |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2072 // if the index was NOT incremented, this means there was no message at |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2073 // this location: we then may copy the character at this index and |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2074 // increment the index to point to the next read position |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2075 if (j == i) |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2076 { |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2077 dest.push_back(src[i]); |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2078 i++; |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2079 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2080 } |
cf8cbeb35f33
preliminary support of Korean character set
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3203
diff
changeset
|
2081 } |
3322
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2082 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2083 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2084 void Toolbox::Utf8ToUnicodeCharacter(uint32_t& unicode, |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2085 size_t& length, |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2086 const std::string& utf8, |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2087 size_t position) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2088 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2089 // https://en.wikipedia.org/wiki/UTF-8 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2090 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2091 static const uint8_t MASK_IS_1_BYTE = 0x80; // printf '0x%x\n' "$((2#10000000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2092 static const uint8_t TEST_IS_1_BYTE = 0x00; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2093 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2094 static const uint8_t MASK_IS_2_BYTES = 0xe0; // printf '0x%x\n' "$((2#11100000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2095 static const uint8_t TEST_IS_2_BYTES = 0xc0; // printf '0x%x\n' "$((2#11000000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2096 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2097 static const uint8_t MASK_IS_3_BYTES = 0xf0; // printf '0x%x\n' "$((2#11110000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2098 static const uint8_t TEST_IS_3_BYTES = 0xe0; // printf '0x%x\n' "$((2#11100000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2099 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2100 static const uint8_t MASK_IS_4_BYTES = 0xf8; // printf '0x%x\n' "$((2#11111000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2101 static const uint8_t TEST_IS_4_BYTES = 0xf0; // printf '0x%x\n' "$((2#11110000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2102 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2103 static const uint8_t MASK_CONTINUATION = 0xc0; // printf '0x%x\n' "$((2#11000000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2104 static const uint8_t TEST_CONTINUATION = 0x80; // printf '0x%x\n' "$((2#10000000))" |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2105 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2106 if (position >= utf8.size()) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2107 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2108 throw OrthancException(ErrorCode_ParameterOutOfRange); |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2109 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2110 |
3324 | 2111 assert(sizeof(uint8_t) == sizeof(char)); |
2112 const uint8_t* buffer = reinterpret_cast<const uint8_t*>(utf8.c_str()) + position; | |
3322
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2113 |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2114 if ((buffer[0] & MASK_IS_1_BYTE) == TEST_IS_1_BYTE) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2115 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2116 length = 1; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2117 unicode = buffer[0] & ~MASK_IS_1_BYTE; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2118 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2119 else if ((buffer[0] & MASK_IS_2_BYTES) == TEST_IS_2_BYTES && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2120 position + 1 < utf8.size() && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2121 (buffer[1] & MASK_CONTINUATION) == TEST_CONTINUATION) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2122 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2123 length = 2; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2124 uint32_t a = buffer[0] & ~MASK_IS_2_BYTES; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2125 uint32_t b = buffer[1] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2126 unicode = (a << 6) | b; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2127 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2128 else if ((buffer[0] & MASK_IS_3_BYTES) == TEST_IS_3_BYTES && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2129 position + 2 < utf8.size() && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2130 (buffer[1] & MASK_CONTINUATION) == TEST_CONTINUATION && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2131 (buffer[2] & MASK_CONTINUATION) == TEST_CONTINUATION) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2132 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2133 length = 3; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2134 uint32_t a = buffer[0] & ~MASK_IS_3_BYTES; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2135 uint32_t b = buffer[1] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2136 uint32_t c = buffer[2] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2137 unicode = (a << 12) | (b << 6) | c; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2138 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2139 else if ((buffer[0] & MASK_IS_4_BYTES) == TEST_IS_4_BYTES && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2140 position + 3 < utf8.size() && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2141 (buffer[1] & MASK_CONTINUATION) == TEST_CONTINUATION && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2142 (buffer[2] & MASK_CONTINUATION) == TEST_CONTINUATION && |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2143 (buffer[3] & MASK_CONTINUATION) == TEST_CONTINUATION) |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2144 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2145 length = 4; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2146 uint32_t a = buffer[0] & ~MASK_IS_4_BYTES; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2147 uint32_t b = buffer[1] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2148 uint32_t c = buffer[2] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2149 uint32_t d = buffer[3] & ~MASK_CONTINUATION; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2150 unicode = (a << 18) | (b << 12) | (c << 6) | d; |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2151 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2152 else |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2153 { |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2154 // This is not a valid UTF-8 encoding |
3324 | 2155 throw OrthancException(ErrorCode_BadFileFormat, "Invalid UTF-8 string"); |
3322
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2156 } |
b32b7c44a223
Toolbox::Utf8ToUnicodeCharacter()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3230
diff
changeset
|
2157 } |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2158 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2159 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2160 std::string Toolbox::LargeHexadecimalToDecimal(const std::string& hex) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2161 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2162 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2163 * NB: Focus of the code below is *not* efficiency, but |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2164 * readability! |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2165 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2166 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2167 for (size_t i = 0; i < hex.size(); i++) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2168 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2169 const char c = hex[i]; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2170 if (!((c >= 'A' && c <= 'F') || |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2171 (c >= 'a' && c <= 'f') || |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2172 (c >= '0' && c <= '9'))) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2173 { |
4297 | 2174 throw OrthancException(ErrorCode_ParameterOutOfRange, |
2175 "Not an hexadecimal number"); | |
3608
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2176 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2177 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2178 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2179 std::vector<uint8_t> decimal; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2180 decimal.push_back(0); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2181 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2182 for (size_t i = 0; i < hex.size(); i++) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2183 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2184 uint8_t hexDigit = static_cast<uint8_t>(Hex2Dec(hex[i])); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2185 assert(hexDigit <= 15); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2186 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2187 for (size_t j = 0; j < decimal.size(); j++) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2188 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2189 uint8_t val = static_cast<uint8_t>(decimal[j]) * 16 + hexDigit; // Maximum: 9 * 16 + 15 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2190 assert(val <= 159 /* == 9 * 16 + 15 */); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2191 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2192 decimal[j] = val % 10; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2193 hexDigit = val / 10; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2194 assert(hexDigit <= 15 /* == 159 / 10 */); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2195 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2196 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2197 while (hexDigit > 0) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2198 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2199 decimal.push_back(hexDigit % 10); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2200 hexDigit /= 10; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2201 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2202 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2203 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2204 size_t start = 0; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2205 while (start < decimal.size() && |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2206 decimal[start] == '0') |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2207 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2208 start++; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2209 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2210 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2211 std::string s; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2212 s.reserve(decimal.size() - start); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2213 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2214 for (size_t i = decimal.size(); i > start; i--) |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2215 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2216 s.push_back(decimal[i - 1] + '0'); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2217 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2218 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2219 return s; |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2220 } |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2221 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2222 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2223 std::string Toolbox::GenerateDicomPrivateUniqueIdentifier() |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2224 { |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2225 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2226 * REFERENCE: "Creating a Privately Defined Unique Identifier |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2227 * (Informative)" / "UUID Derived UID" |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2228 * http://dicom.nema.org/medical/dicom/2019a/output/chtml/part05/sect_B.2.html |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2229 * https://stackoverflow.com/a/46316162/881731 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2230 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2231 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2232 std::string uuid = GenerateUuid(); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2233 assert(IsUuid(uuid) && uuid.size() == 36); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2234 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2235 /** |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2236 * After removing the four dashes ("-") out of the 36-character |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2237 * UUID, we get a large hexadecimal number with 32 characters, |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2238 * each of those characters lying in the range [0,16[. The large |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2239 * number is thus in the [0,16^32[ = [0,256^16[ range. This number |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2240 * has a maximum of 39 decimal digits, as can be seen in Python: |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2241 * |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2242 * # python -c 'import math; print(math.log(16**32))/math.log(10))' |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2243 * 38.531839445 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2244 * |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2245 * We now to convert the large hexadecimal number to a decimal |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2246 * number with up to 39 digits, remove the leading zeros, then |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2247 * prefix it with "2.25." |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2248 **/ |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2249 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2250 // Remove the dashes |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2251 std::string hex = (uuid.substr(0, 8) + |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2252 uuid.substr(9, 4) + |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2253 uuid.substr(14, 4) + |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2254 uuid.substr(19, 4) + |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2255 uuid.substr(24, 12)); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2256 assert(hex.size() == 32); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2257 |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2258 return "2.25." + LargeHexadecimalToDecimal(hex); |
7ae553d9c366
created DicomUserConnection::RequestStorageCommitment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3489
diff
changeset
|
2259 } |
4055
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2260 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2261 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2262 void Toolbox::SimplifyDicomAsJson(Json::Value& target, |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2263 const Json::Value& source, |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2264 DicomToJsonFormat format) |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2265 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2266 if (!source.isObject()) |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2267 { |
4297 | 2268 throw OrthancException(ErrorCode_BadFileFormat); |
4055
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2269 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2270 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2271 target = Json::objectValue; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2272 Json::Value::Members members = source.getMemberNames(); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2273 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2274 for (size_t i = 0; i < members.size(); i++) |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2275 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2276 const Json::Value& v = source[members[i]]; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2277 const std::string& type = v["Type"].asString(); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2278 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2279 std::string name; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2280 switch (format) |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2281 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2282 case DicomToJsonFormat_Human: |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2283 name = v["Name"].asString(); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2284 break; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2285 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2286 case DicomToJsonFormat_Short: |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2287 name = members[i]; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2288 break; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2289 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2290 default: |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2291 throw OrthancException(ErrorCode_ParameterOutOfRange); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2292 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2293 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2294 if (type == "String") |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2295 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2296 target[name] = v["Value"].asString(); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2297 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2298 else if (type == "TooLong" || |
4527
31f940334496
Handle public tags with "UN" value representation and containing a string (cf. DICOM CP 246)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
2299 type == "Null" || |
31f940334496
Handle public tags with "UN" value representation and containing a string (cf. DICOM CP 246)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
2300 type == "Binary") |
4055
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2301 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2302 target[name] = Json::nullValue; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2303 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2304 else if (type == "Sequence") |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2305 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2306 const Json::Value& array = v["Value"]; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2307 assert(array.isArray()); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2308 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2309 Json::Value children = Json::arrayValue; |
4203
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
2310 for (Json::Value::ArrayIndex j = 0; j < array.size(); j++) |
4055
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2311 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2312 Json::Value c; |
4203
4d42408da117
improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
2313 SimplifyDicomAsJson(c, array[j], format); |
4055
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2314 children.append(c); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2315 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2316 |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2317 target[name] = children; |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2318 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2319 else |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2320 { |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2321 assert(0); |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2322 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2323 } |
9214e3a7b0a2
moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4044
diff
changeset
|
2324 } |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2325 |
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2326 |
4397
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2327 static bool ReadJsonInternal(Json::Value& target, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2328 const void* buffer, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2329 size_t size, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2330 bool collectComments) |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2331 { |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2332 #if JSONCPP_USE_DEPRECATED == 1 |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2333 Json::Reader reader; |
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2334 return reader.parse(reinterpret_cast<const char*>(buffer), |
4397
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2335 reinterpret_cast<const char*>(buffer) + size, target, collectComments); |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2336 #else |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2337 Json::CharReaderBuilder builder; |
4397
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2338 builder.settings_["collectComments"] = collectComments; |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2339 |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2340 const std::unique_ptr<Json::CharReader> reader(builder.newCharReader()); |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2341 assert(reader.get() != NULL); |
4397
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2342 |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2343 JSONCPP_STRING err; |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2344 if (reader->parse(reinterpret_cast<const char*>(buffer), |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2345 reinterpret_cast<const char*>(buffer) + size, &target, &err)) |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2346 { |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2347 return true; |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2348 } |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2349 else |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2350 { |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2351 LOG(ERROR) << "Cannot parse JSON: " << err; |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2352 return false; |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2353 } |
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2354 #endif |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2355 } |
4397
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2356 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2357 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2358 bool Toolbox::ReadJson(Json::Value& target, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2359 const std::string& source) |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2360 { |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2361 return ReadJson(target, source.empty() ? NULL : source.c_str(), source.size()); |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2362 } |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2363 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2364 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2365 bool Toolbox::ReadJson(Json::Value& target, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2366 const void* buffer, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2367 size_t size) |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2368 { |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2369 return ReadJsonInternal(target, buffer, size, true); |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2370 } |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2371 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2372 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2373 bool Toolbox::ReadJsonWithoutComments(Json::Value& target, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2374 const std::string& source) |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2375 { |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2376 return ReadJsonWithoutComments(target, source.empty() ? NULL : source.c_str(), source.size()); |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2377 } |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2378 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2379 |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2380 bool Toolbox::ReadJsonWithoutComments(Json::Value& target, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2381 const void* buffer, |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2382 size_t size) |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2383 { |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2384 return ReadJsonInternal(target, buffer, size, false); |
3aeb5171fbd4
new function Toolbox::ReadJsonWithoutComments()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4396
diff
changeset
|
2385 } |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2386 |
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2387 |
4394
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2388 void Toolbox::WriteFastJson(std::string& target, |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2389 const Json::Value& source) |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2390 { |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2391 #if JSONCPP_USE_DEPRECATED == 1 |
4394
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2392 Json::FastWriter writer; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2393 target = writer.write(source); |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2394 #else |
4394
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2395 Json::StreamWriterBuilder builder; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2396 builder.settings_["indentation"] = ""; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2397 target = Json::writeString(builder, source); |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2398 #endif |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2399 } |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2400 |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2401 |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2402 void Toolbox::WriteStyledJson(std::string& target, |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2403 const Json::Value& source) |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2404 { |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2405 #if JSONCPP_USE_DEPRECATED == 1 |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2406 Json::StyledWriter writer; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2407 target = writer.write(source); |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2408 #else |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2409 Json::StreamWriterBuilder builder; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2410 builder.settings_["indentation"] = " "; |
f7104e9d044c
functions to read/write JSON in OrthancPluginCppWrapper.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4393
diff
changeset
|
2411 target = Json::writeString(builder, source); |
4393
e8e95b80194f
removing usage of deprecated JsonCpp classes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4392
diff
changeset
|
2412 #endif |
4392
3af1d763763a
confining Json::Reader and Json::*Writer into Toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4297
diff
changeset
|
2413 } |
4622
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2414 |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2415 |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2416 void Toolbox::RemoveSurroundingQuotes(std::string& value) |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2417 { |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2418 if (!value.empty() && |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2419 value[0] == '\"' && |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2420 value[value.size() - 1] == '\"') |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2421 { |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2422 value = value.substr(1, value.size() - 2); |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2423 } |
9086aeb9d9d2
RestApiCallDocumentation::SetAnswerHeader() and Toolbox::RemoveSurroundingQuotes()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4527
diff
changeset
|
2424 } |
0 | 2425 } |
2513
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2426 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2427 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2428 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2429 OrthancLinesIterator* OrthancLinesIterator_Create(const std::string& content) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2430 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2431 return reinterpret_cast<OrthancLinesIterator*>(new Orthanc::Toolbox::LinesIterator(content)); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2432 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2433 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2434 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2435 bool OrthancLinesIterator_GetLine(std::string& target, |
4026
05a363186da6
ORTHANC_BUILDING_FRAMEWORK_LIBRARY, Orthanc::InitializeFramework()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3973
diff
changeset
|
2436 const OrthancLinesIterator* iterator) |
2513
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2437 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2438 if (iterator != NULL) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2439 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2440 return reinterpret_cast<const Orthanc::Toolbox::LinesIterator*>(iterator)->GetLine(target); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2441 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2442 else |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2443 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2444 return false; |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2445 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2446 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2447 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2448 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2449 void OrthancLinesIterator_Next(OrthancLinesIterator* iterator) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2450 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2451 if (iterator != NULL) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2452 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2453 reinterpret_cast<Orthanc::Toolbox::LinesIterator*>(iterator)->Next(); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2454 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2455 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2456 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2457 |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2458 void OrthancLinesIterator_Free(OrthancLinesIterator* iterator) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2459 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2460 if (iterator != NULL) |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2461 { |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2462 delete reinterpret_cast<const Orthanc::Toolbox::LinesIterator*>(iterator); |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2463 } |
97a74f0eac7a
loading DICOM dictionaries in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2512
diff
changeset
|
2464 } |