annotate OrthancFramework/Sources/SystemToolbox.cpp @ 5406:aaf7c49a9ddc am-http-compression

tentative to implement smart HTTP compression with detection of transfer syntax
author Alain Mazy <am@osimis.io>
date Sat, 04 Nov 2023 13:42:30 +0100
parents 303e930fff0f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
5185
0ea402b4d901 upgrade to year 2023
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4943
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
0ea402b4d901 upgrade to year 2023
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4943
diff changeset
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 *
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
9 * modify it under the terms of the GNU Lesser General Public License
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
10 * as published by the Free Software Foundation, either version 3 of
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
11 * the License, or (at your option) any later version.
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
16 * Lesser General Public License for more details.
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 *
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
19 * License along with this program. If not, see
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
20 * <http://www.gnu.org/licenses/>.
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "PrecompiledHeaders.h"
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 #include "SystemToolbox.h"
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #if defined(_WIN32)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
29 # include <winsock2.h> // For GetMacAddresses(), must be included before "windows.h"
2173
1c42860097fc fix windows build
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2172
diff changeset
30 # include <windows.h>
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
31
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
32 # include <iphlpapi.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
33 # include <process.h> // For "_spawnvp()" and "_getpid()"
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
34 # include <stdlib.h> // For "environ"
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #else
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
36 # include <net/if.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
37 # include <netinet/in.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
38 # include <sys/ioctl.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
39 # include <sys/wait.h> // For "waitpid()"
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
40 # include <unistd.h> // For "execvp()"
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42
2173
1c42860097fc fix windows build
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2172
diff changeset
43
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 #if defined(__APPLE__) && defined(__MACH__)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
45 # include <limits.h> // PATH_MAX
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
46 # include <mach-o/dyld.h> // _NSGetExecutablePath
4552
beb8ba8a0b12 fix build on freebsd
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4538
diff changeset
47 #endif
beb8ba8a0b12 fix build on freebsd
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4538
diff changeset
48
beb8ba8a0b12 fix build on freebsd
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4538
diff changeset
49
beb8ba8a0b12 fix build on freebsd
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4538
diff changeset
50 #if (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
51 # include <net/if_dl.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
52 # include <net/if_types.h> // For GetMacAddresses()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
53 # include <sys/sysctl.h> // For GetMacAddresses()
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55
2173
1c42860097fc fix windows build
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2172
diff changeset
56
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 #if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
58 # include <limits.h> // PATH_MAX
2173
1c42860097fc fix windows build
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2172
diff changeset
59 # include <signal.h>
1c42860097fc fix windows build
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2172
diff changeset
60 # include <unistd.h>
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63
2365
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
64 #if defined(__OpenBSD__)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
65 # include <sys/sysctl.h> // For "sysctl", "CTL_KERN" and "KERN_PROC_ARGS"
2365
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
66 #endif
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
67
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
68
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 #include "Logging.h"
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 #include "OrthancException.h"
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 #include "Toolbox.h"
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
73 #include <boost/iostreams/device/file_descriptor.hpp>
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
74 #include <boost/iostreams/stream.hpp>
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 #include <boost/filesystem.hpp>
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 #include <boost/filesystem/fstream.hpp>
2367
2aff870c2c58 refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2365
diff changeset
77 #include <boost/date_time/posix_time/posix_time.hpp>
2794
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
78 #include <boost/thread.hpp>
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
80 #include <cassert>
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
81 #include <string.h>
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
82
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
83
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
2920
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
85 /*=========================================================================
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
86 The section below comes from the Boost 1.68.0 project:
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
87 https://github.com/boostorg/program_options/blob/boost-1.68.0/src/parsers.cpp
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
88
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
89 Copyright Vladimir Prus 2002-2004.
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
90 Distributed under the Boost Software License, Version 1.0.
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
91 (See accompanying file LICENSE_1_0.txt
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
92 or copy at http://www.boost.org/LICENSE_1_0.txt)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
93 =========================================================================*/
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
94
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
95 // The 'environ' should be declared in some cases. E.g. Linux man page says:
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
96 // (This variable must be declared in the user program, but is declared in
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
97 // the header file unistd.h in case the header files came from libc4 or libc5,
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
98 // and in case they came from glibc and _GNU_SOURCE was defined.)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
99 // To be safe, declare it here.
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
100
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
101 // It appears that on Mac OS X the 'environ' variable is not
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
102 // available to dynamically linked libraries.
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
103 // See: http://article.gmane.org/gmane.comp.lib.boost.devel/103843
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
104 // See: http://lists.gnu.org/archive/html/bug-guile/2004-01/msg00013.html
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
105 #if defined(__APPLE__) && defined(__DYNAMIC__)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
106 // The proper include for this is crt_externs.h, however it's not
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
107 // available on iOS. The right replacement is not known. See
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
108 // https://svn.boost.org/trac/boost/ticket/5053
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
109 extern "C"
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
110 {
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
111 extern char ***_NSGetEnviron(void);
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
112 }
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
113 # define environ (*_NSGetEnviron())
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
114 #else
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
115 # if defined(__MWERKS__)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
116 # include <crtl.h>
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
117 # else
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
118 # if !defined(_WIN32) || defined(__COMO_VERSION__)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
119 extern char** environ;
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
120 # endif
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
121 # endif
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
122 #endif
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
123
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
124
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
125 /*=========================================================================
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
126 End of section from the Boost 1.68.0 project
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
127 =========================================================================*/
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
128
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
129
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 namespace Orthanc
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 static bool finish_;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 static ServerBarrierEvent barrierEvent_;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 static BOOL WINAPI ConsoleControlHandler(DWORD dwCtrlType)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 // http://msdn.microsoft.com/en-us/library/ms683242(v=vs.85).aspx
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 finish_ = true;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 return true;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 static void SignalHandler(int signal)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 if (signal == SIGHUP)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 barrierEvent_ = ServerBarrierEvent_Reload;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 finish_ = true;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 static ServerBarrierEvent ServerBarrierInternal(const bool* stopFlag)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 SetConsoleCtrlHandler(ConsoleControlHandler, true);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 signal(SIGINT, SignalHandler);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 signal(SIGQUIT, SignalHandler);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 signal(SIGTERM, SignalHandler);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 signal(SIGHUP, SignalHandler);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 // Active loop that awakens every 100ms
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 finish_ = false;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 barrierEvent_ = ServerBarrierEvent_Stop;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 while (!(*stopFlag || finish_))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 {
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
171 SystemToolbox::USleep(100 * 1000);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 SetConsoleCtrlHandler(ConsoleControlHandler, false);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 signal(SIGINT, NULL);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 signal(SIGQUIT, NULL);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 signal(SIGTERM, NULL);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 signal(SIGHUP, NULL);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 return barrierEvent_;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 ServerBarrierEvent SystemToolbox::ServerBarrier(const bool& stopFlag)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 return ServerBarrierInternal(&stopFlag);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 ServerBarrierEvent SystemToolbox::ServerBarrier()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 const bool stopFlag = false;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 return ServerBarrierInternal(&stopFlag);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
200 void SystemToolbox::USleep(uint64_t microSeconds)
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
201 {
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
202 #if defined(_WIN32)
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
203 ::Sleep(static_cast<DWORD>(microSeconds / static_cast<uint64_t>(1000)));
2364
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
204 #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__native_client__)
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
205 usleep(microSeconds);
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
206 #else
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
207 #error Support your platform here
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
208 #endif
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
209 }
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
210
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2173
diff changeset
211
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 static std::streamsize GetStreamSize(std::istream& f)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 // http://www.cplusplus.com/reference/iostream/istream/tellg/
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 f.seekg(0, std::ios::end);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 std::streamsize size = f.tellg();
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 f.seekg(0, std::ios::beg);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 return size;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 void SystemToolbox::ReadFile(std::string& content,
3521
793c141be598 added an option not to log ReadFile errors
Alain Mazy <alain@mazy.be>
parents: 3435
diff changeset
224 const std::string& path,
793c141be598 added an option not to log ReadFile errors
Alain Mazy <alain@mazy.be>
parents: 3435
diff changeset
225 bool log)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 if (!IsRegularFile(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 {
2954
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
229 throw OrthancException(ErrorCode_RegularFileExpected,
3521
793c141be598 added an option not to log ReadFile errors
Alain Mazy <alain@mazy.be>
parents: 3435
diff changeset
230 "The path does not point to a regular file: " + path,
793c141be598 added an option not to log ReadFile errors
Alain Mazy <alain@mazy.be>
parents: 3435
diff changeset
231 log);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
234 try
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
236 boost::filesystem::ifstream f;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
237 f.open(path, std::ifstream::in | std::ifstream::binary);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
238 if (!f.good())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
239 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
240 throw OrthancException(ErrorCode_InexistentFile,
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
241 "File not found: " + path,
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
242 log);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
243 }
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
245 std::streamsize size = GetStreamSize(f);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
246 content.resize(static_cast<size_t>(size));
4342
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
247
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
248 if (static_cast<std::streamsize>(content.size()) != size)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
249 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
250 throw OrthancException(ErrorCode_InternalError,
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
251 "Reading a file that is too large for a 32bit architecture");
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
252 }
4342
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
253
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
254 if (size != 0)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
255 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
256 f.read(&content[0], size);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
257 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
258
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
259 f.close();
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
260 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
261 catch (boost::filesystem::filesystem_error&)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
263 throw OrthancException(ErrorCode_InexistentFile);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 }
4402
b651989194d3 fix for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4399
diff changeset
265 catch (...) // To catch "std::system_error&" in C++11
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
266 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
267 throw OrthancException(ErrorCode_InexistentFile);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
268 }
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271
4297
785a2713323e abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4279
diff changeset
272 void SystemToolbox::ReadFile(std::string &content, const std::string &path)
4279
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
273 {
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
274 ReadFile(content, path, true /* log */);
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
275 }
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
276
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
277
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278 bool SystemToolbox::ReadHeader(std::string& header,
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279 const std::string& path,
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 size_t headerSize)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282 if (!IsRegularFile(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283 {
2954
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
284 throw OrthancException(ErrorCode_RegularFileExpected,
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
285 "The path does not point to a regular file: " + path);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
288 try
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
289 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
290 boost::filesystem::ifstream f;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
291 f.open(path, std::ifstream::in | std::ifstream::binary);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
292 if (!f.good())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
293 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
294 throw OrthancException(ErrorCode_InexistentFile);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
295 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
296
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
297 bool full = true;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
298
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
299 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
300 std::streamsize size = GetStreamSize(f);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
301 if (size <= 0)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
302 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
303 headerSize = 0;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
304 full = false;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
305 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
306 else if (static_cast<size_t>(size) < headerSize)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
307 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
308 headerSize = static_cast<size_t>(size); // Truncate to the size of the file
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
309 full = false;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
310 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
311 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
312
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
313 header.resize(headerSize);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
314 if (headerSize != 0)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
315 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
316 f.read(&header[0], headerSize);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
317 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
318
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
319 f.close();
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
320
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
321 return full;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
322 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
323 catch (boost::filesystem::filesystem_error&)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
325 throw OrthancException(ErrorCode_InexistentFile);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326 }
4402
b651989194d3 fix for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4399
diff changeset
327 catch (...) // To catch "std::system_error&" in C++11
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
329 throw OrthancException(ErrorCode_InexistentFile);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334 void SystemToolbox::WriteFile(const void* content,
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 size_t size,
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
336 const std::string& path,
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
337 bool callFsync)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
339 try
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
340 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
341 //boost::filesystem::ofstream f;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
342 boost::iostreams::stream<boost::iostreams::file_descriptor_sink> f;
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
343
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
344 f.open(path, std::ofstream::out | std::ofstream::binary);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
345 if (!f.good())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
346 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
347 throw OrthancException(ErrorCode_CannotWriteFile);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
348 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
349
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
350 if (size != 0)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
351 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
352 f.write(reinterpret_cast<const char*>(content), size);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
353
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
354 if (!f.good())
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
355 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
356 f.close();
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
357 throw OrthancException(ErrorCode_CannotWriteFile);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
358 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
359 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
360
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
361 if (callFsync)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
362 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
363 // https://stackoverflow.com/a/23826489/881731
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
364 f.flush();
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
365
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
366 bool success;
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
367
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
368 /**
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
369 * "f->handle()" corresponds to "FILE*" (aka "HANDLE") on
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
370 * Microsoft Windows, and to "int" (file descriptor) on other
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
371 * systems:
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
372 * https://github.com/boostorg/iostreams/blob/develop/include/boost/iostreams/detail/file_handle.hpp
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
373 **/
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
374
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
375 #if defined(_WIN32)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
376 // https://docs.microsoft.com/fr-fr/windows/win32/api/fileapi/nf-fileapi-flushfilebuffers
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
377 success = (::FlushFileBuffers(f->handle()) != 0);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
378 #elif (_POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
379 success = (::fdatasync(f->handle()) == 0);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
380 #else
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
381 success = (::fsync(f->handle()) == 0);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
382 #endif
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
383
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
384 if (!success)
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
385 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
386 throw OrthancException(ErrorCode_CannotWriteFile, "Cannot force flush to disk");
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
387 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
388 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
389
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
390 f.close();
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
391 }
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
392 catch (boost::filesystem::filesystem_error&)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
393 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394 throw OrthancException(ErrorCode_CannotWriteFile);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 }
4402
b651989194d3 fix for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4399
diff changeset
396 catch (...) // To catch "std::system_error&" in C++11
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
397 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
398 throw OrthancException(ErrorCode_CannotWriteFile);
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
399 }
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402
4279
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
403 void SystemToolbox::WriteFile(const void *content, size_t size, const std::string &path)
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
404 {
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
405 WriteFile(content, size, path, false /* don't automatically call fsync */);
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
406 }
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
407
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
408
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
409 void SystemToolbox::WriteFile(const std::string& content,
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
410 const std::string& path,
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
411 bool callFsync)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413 WriteFile(content.size() > 0 ? content.c_str() : NULL,
4185
b289a1234822 giving a try to cross-platform compilation of SyncStorageArea
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
414 content.size(), path, callFsync);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
415 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
416
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417
4279
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
418 void SystemToolbox::WriteFile(const std::string &content, const std::string &path)
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
419 {
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
420 WriteFile(content, path, false /* don't automatically call fsync */);
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
421 }
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
422
ab4d015af660 moving inline methods to source files for ABI compatibility
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4239
diff changeset
423
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 void SystemToolbox::RemoveFile(const std::string& path)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
426 if (boost::filesystem::exists(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 if (IsRegularFile(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 boost::filesystem::remove(path);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432 else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 throw OrthancException(ErrorCode_RegularFileExpected);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
439
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
440 uint64_t SystemToolbox::GetFileSize(const std::string& path)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
441 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442 try
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
443 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 return static_cast<uint64_t>(boost::filesystem::file_size(path));
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446 catch (boost::filesystem::filesystem_error&)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 throw OrthancException(ErrorCode_InexistentFile);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 }
4402
b651989194d3 fix for older compilers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4399
diff changeset
450 catch (...) // To catch "std::system_error&" in C++11
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
451 {
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
452 throw OrthancException(ErrorCode_InexistentFile);
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
453 }
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
455
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
456
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
457 void SystemToolbox::MakeDirectory(const std::string& path)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
458 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
459 if (boost::filesystem::exists(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
460 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
461 if (!boost::filesystem::is_directory(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
462 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
463 throw OrthancException(ErrorCode_DirectoryOverFile);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
464 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
465 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
466 else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
467 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
468 if (!boost::filesystem::create_directories(path))
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
469 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
470 throw OrthancException(ErrorCode_MakeDirectory);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
471 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
472 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
473 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
474
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
475
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
476 bool SystemToolbox::IsExistingFile(const std::string& path)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
477 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
478 return boost::filesystem::exists(path);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
479 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
480
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
483 static std::string GetPathToExecutableInternal()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
484 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
485 // Yes, this is ugly, but there is no simple way to get the
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486 // required buffer size, so we use a big constant
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487 std::vector<char> buffer(32768);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 /*int bytes =*/ GetModuleFileNameA(NULL, &buffer[0], static_cast<DWORD>(buffer.size() - 1));
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489 return std::string(&buffer[0]);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
491
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
492 #elif defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 static std::string GetPathToExecutableInternal()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 {
2365
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
495 // NOTE: For FreeBSD, using KERN_PROC_PATHNAME might be a better alternative
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
496
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497 std::vector<char> buffer(PATH_MAX + 1);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 ssize_t bytes = readlink("/proc/self/exe", &buffer[0], buffer.size() - 1);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 if (bytes == 0)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 throw OrthancException(ErrorCode_PathToExecutable);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 return std::string(&buffer[0]);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 #elif defined(__APPLE__) && defined(__MACH__)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 static std::string GetPathToExecutableInternal()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
510 char pathbuf[PATH_MAX + 1];
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
511 unsigned int bufsize = static_cast<int>(sizeof(pathbuf));
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 _NSGetExecutablePath( pathbuf, &bufsize);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 return std::string(pathbuf);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517
2364
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
518 #elif defined(__OpenBSD__)
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
519 static std::string GetPathToExecutableInternal()
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
520 {
2365
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
521 // This is an adapted version of the patch proposed in issue #64
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
522 // without an explicit call to "malloc()" to prevent memory leak
4476
c1f36fd13730 migrate remaining links to issues in bitbucket to mercurial server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
523 // https://bugs.orthanc-server.com/show_bug.cgi?id=64
2365
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
524 // https://stackoverflow.com/q/31494901/881731
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
525
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
526 const int mib[4] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV };
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
527
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
528 size_t len;
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
529 if (sysctl(mib, 4, NULL, &len, NULL, 0) == -1)
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
530 {
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
531 throw OrthancException(ErrorCode_PathToExecutable);
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
532 }
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
533
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
534 std::string tmp;
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
535 tmp.resize(len);
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
536
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
537 char** buffer = reinterpret_cast<char**>(&tmp[0]);
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
538
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
539 if (sysctl(mib, 4, buffer, &len, NULL, 0) == -1)
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
540 {
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
541 throw OrthancException(ErrorCode_PathToExecutable);
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
542 }
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
543 else
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
544 {
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
545 return std::string(buffer[0]);
9e0eae8a5ea4 SystemToolbox::GetPathToExecutable() for OpenBSD
jodogne
parents: 2364
diff changeset
546 }
2364
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
547 }
ae50eccd41b7 compilation succeeds on OpenBSD
jodogne
parents: 2332
diff changeset
548
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550 #error Support your platform here
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 std::string SystemToolbox::GetPathToExecutable()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 boost::filesystem::path p(GetPathToExecutableInternal());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 return boost::filesystem::absolute(p).string();
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
560
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
561 std::string SystemToolbox::GetDirectoryOfExecutable()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
562 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
563 boost::filesystem::path p(GetPathToExecutableInternal());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 return boost::filesystem::absolute(p.parent_path()).string();
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568 void SystemToolbox::ExecuteSystemCommand(const std::string& command,
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569 const std::vector<std::string>& arguments)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571 // Convert the arguments as a C array
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 std::vector<char*> args(arguments.size() + 2);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574 args.front() = const_cast<char*>(command.c_str());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576 for (size_t i = 0; i < arguments.size(); i++)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
577 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
578 args[i + 1] = const_cast<char*>(arguments[i].c_str());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581 args.back() = NULL;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583 int status;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586 // http://msdn.microsoft.com/en-us/library/275khfab.aspx
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 status = static_cast<int>(_spawnvp(_P_OVERLAY, command.c_str(), &args[0]));
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
588
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
589 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 int pid = fork();
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
591
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
592 if (pid == -1)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 // Error in fork()
2954
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
595 throw OrthancException(ErrorCode_SystemCommand, "Cannot fork a child process");
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
596 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
597 else if (pid == 0)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
598 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
599 // Execute the system command in the child process
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
600 execvp(command.c_str(), &args[0]);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
601
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
602 // We should never get here
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
603 _exit(1);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
604 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
605 else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 // Wait for the system command to exit
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
608 waitpid(pid, &status, 0);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
609 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
610 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
611
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 if (status != 0)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
613 {
2954
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
614 throw OrthancException(ErrorCode_SystemCommand,
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
615 "System command failed with status code " +
d924f9bb61cc taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2933
diff changeset
616 boost::lexical_cast<std::string>(status));
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
617 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
618 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
619
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
621 int SystemToolbox::GetProcessId()
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
622 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
624 return static_cast<int>(_getpid());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
625 #else
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 return static_cast<int>(getpid());
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
628 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
629
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 bool SystemToolbox::IsRegularFile(const std::string& path)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
633 try
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
635 if (boost::filesystem::exists(path))
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 {
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
637 boost::filesystem::file_status status = boost::filesystem::status(path);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 return (status.type() == boost::filesystem::regular_file ||
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
639 status.type() == boost::filesystem::reparse_file); // Fix BitBucket issue #11
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641 }
4399
80fd140b12ba New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4342
diff changeset
642 catch (boost::filesystem::filesystem_error&)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
643 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
644 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
645
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
646 return false;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
647 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
649
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
650 FILE* SystemToolbox::OpenFile(const std::string& path,
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651 FileMode mode)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
652 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
653 #if defined(_WIN32)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
654 // TODO Deal with special characters by converting to the current locale
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 #endif
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
656
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 const char* m;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
658 switch (mode)
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
659 {
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660 case FileMode_ReadBinary:
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
661 m = "rb";
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
662 break;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
663
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
664 case FileMode_WriteBinary:
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
665 m = "wb";
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
666 break;
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
667
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
668 default:
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
669 throw OrthancException(ErrorCode_ParameterOutOfRange);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
670 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
671
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
672 return fopen(path.c_str(), m);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
673 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
674
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
675
2475
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
676 static boost::posix_time::ptime GetNow(bool utc)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
677 {
2475
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
678 if (utc)
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
679 {
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
680 return boost::posix_time::second_clock::universal_time();
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
681 }
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
682 else
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
683 {
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
684 return boost::posix_time::second_clock::local_time();
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
685 }
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
686 }
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
687
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
688
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
689 std::string SystemToolbox::GetNowIsoString(bool utc)
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
690 {
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
691 return boost::posix_time::to_iso_string(GetNow(utc));
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
692 }
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
693
2367
2aff870c2c58 refactoring of BoostConfiguration.cmake
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2365
diff changeset
694
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
695 void SystemToolbox::GetNowDicom(std::string& date,
2475
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
696 std::string& time,
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
697 bool utc)
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
698 {
2475
8cc3ca64a534 Orthanc now uses UTC (universal time) instead of local time in its database
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
699 boost::posix_time::ptime now = GetNow(utc);
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
700 tm tm = boost::posix_time::to_tm(now);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
701
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
702 char s[32];
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
703 sprintf(s, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
704 date.assign(s);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
705
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
706 // TODO milliseconds
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
707 sprintf(s, "%02d%02d%02d.%06d", tm.tm_hour, tm.tm_min, tm.tm_sec, 0);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
708 time.assign(s);
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
709 }
2794
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
710
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
711
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
712 unsigned int SystemToolbox::GetHardwareConcurrency()
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
713 {
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
714 // Get the number of available hardware threads (e.g. number of
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
715 // CPUs or cores or hyperthreading units)
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
716 unsigned int threads = boost::thread::hardware_concurrency();
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
717
4203
4d42408da117 improving const-correctness in ParsedDicomFile
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4188
diff changeset
718 if (threads == 0)
2794
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
719 {
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
720 return 1;
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
721 }
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
722 else
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
723 {
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
724 return threads;
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
725 }
f790999a250a Semaphore removed from graveyard, SystemToolbox::GetHardwareConcurrency()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2512
diff changeset
726 }
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
727
5406
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
728 ContentCompression SystemToolbox::GuessContentCompression(MimeType mime)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
729 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
730 switch (mime)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
731 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
732 case MimeType_Css:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
733 case MimeType_Html:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
734 case MimeType_JavaScript:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
735 case MimeType_Json:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
736 case MimeType_Pam:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
737 case MimeType_Pdf:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
738 case MimeType_PlainText:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
739 case MimeType_WebAssembly:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
740 case MimeType_Xml:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
741 case MimeType_PrometheusText:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
742 case MimeType_DicomWebJson:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
743 case MimeType_DicomWebXml:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
744 return ContentCompression_NotCompressed;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
745 case MimeType_Gif:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
746 case MimeType_Jpeg:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
747 case MimeType_Jpeg2000:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
748 case MimeType_Png:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
749 case MimeType_Svg:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
750 case MimeType_Woff:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
751 case MimeType_Woff2:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
752 case MimeType_Zip:
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
753 return ContentCompression_AlreadyCompressed;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
754 default: // for all other (DICOM, binary, ...) we actually don't know
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
755 return ContentCompression_Unknown;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
756 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
757 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
758
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
759 ContentCompression SystemToolbox::GuessContentCompression(const std::string& contentType)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
760 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
761 if (contentType.empty())
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
762 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
763 return ContentCompression_Unknown;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
764 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
765
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
766 if (contentType.find(MIME_JSON) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
767 contentType.find(MIME_XML) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
768 contentType.find(MIME_DICOM_WEB_JSON) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
769 contentType.find(MIME_DICOM_WEB_XML) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
770 contentType.find(MIME_PDF) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
771 contentType.find(MIME_CSS) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
772 contentType.find(MIME_HTML) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
773 contentType.find(MIME_JAVASCRIPT) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
774 contentType.find(MIME_PLAIN_TEXT) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
775 contentType.find(MIME_WEB_ASSEMBLY) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
776 contentType.find(MIME_XML_2) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
777 contentType.find(MIME_ICO) != std::string::npos)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
778 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
779 return ContentCompression_NotCompressed;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
780 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
781 else if (contentType.find(MIME_DICOM) != std::string::npos || // this must happen after the test for MIME_DICOM_WEB_JSON since application/dicom is inside application/dicom+json
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
782 contentType.find(MIME_BINARY) != std::string::npos)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
783 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
784 // For DICOM, it is impossible to know the transfer syntax at this point so we don't know if the data is compressed or not
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
785 return ContentCompression_Unknown;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
786 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
787 else if (contentType.find(MIME_JPEG) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
788 contentType.find(MIME_PNG) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
789 contentType.find(MIME_GIF) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
790 contentType.find(MIME_JPEG2000) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
791 contentType.find(MIME_GZIP) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
792 contentType.find(MIME_ZIP) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
793 contentType.find(MIME_SVG) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
794 contentType.find(MIME_WOFF) != std::string::npos ||
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
795 contentType.find(MIME_WOFF2) != std::string::npos)
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
796 {
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
797 return ContentCompression_AlreadyCompressed;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
798 }
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
799
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
800 return ContentCompression_Unknown;
aaf7c49a9ddc tentative to implement smart HTTP compression with detection of transfer syntax
Alain Mazy <am@osimis.io>
parents: 5348
diff changeset
801 }
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
802
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
803 MimeType SystemToolbox::AutodetectMimeType(const std::string& path)
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
804 {
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
805 std::string extension = boost::filesystem::extension(path);
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
806 Toolbox::ToLowerCase(extension);
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
807
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
808 // http://en.wikipedia.org/wiki/Mime_types
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
809 // Text types
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
810 if (extension == ".txt")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
811 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
812 return MimeType_PlainText;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
813 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
814 else if (extension == ".html")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
815 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
816 return MimeType_Html;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
817 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
818 else if (extension == ".xml")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
819 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
820 return MimeType_Xml;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
821 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
822 else if (extension == ".css")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
823 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
824 return MimeType_Css;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
825 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
826
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
827 // Application types
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
828 else if (extension == ".js")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
829 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
830 return MimeType_JavaScript;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
831 }
2984
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
832 else if (extension == ".json" ||
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
833 extension == ".nmf" /* manifest */)
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
834 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
835 return MimeType_Json;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
836 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
837 else if (extension == ".pdf")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
838 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
839 return MimeType_Pdf;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
840 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
841 else if (extension == ".wasm")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
842 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
843 return MimeType_WebAssembly;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
844 }
2984
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
845 else if (extension == ".nexe")
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
846 {
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
847 return MimeType_NaCl;
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
848 }
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
849 else if (extension == ".pexe")
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
850 {
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
851 return MimeType_PNaCl;
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
852 }
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
853
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
854 // Images types
4239
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4223
diff changeset
855 else if (extension == ".dcm")
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4223
diff changeset
856 {
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4223
diff changeset
857 return MimeType_Dicom;
c8754c4c1862 upload DICOM using WebDAV
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4223
diff changeset
858 }
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
859 else if (extension == ".jpg" ||
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
860 extension == ".jpeg")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
861 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
862 return MimeType_Jpeg;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
863 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
864 else if (extension == ".gif")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
865 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
866 return MimeType_Gif;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
867 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
868 else if (extension == ".png")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
869 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
870 return MimeType_Png;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
871 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
872 else if (extension == ".pam")
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
873 {
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
874 return MimeType_Pam;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
875 }
2984
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
876 else if (extension == ".svg")
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
877 {
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
878 return MimeType_Svg;
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
879 }
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
880
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
881 // Various types
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
882 else if (extension == ".woff")
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
883 {
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
884 return MimeType_Woff;
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
885 }
3435
c08bb6ac3b7f new mime type: font/woff2
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3402
diff changeset
886 else if (extension == ".woff2")
c08bb6ac3b7f new mime type: font/woff2
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3402
diff changeset
887 {
c08bb6ac3b7f new mime type: font/woff2
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3402
diff changeset
888 return MimeType_Woff2;
c08bb6ac3b7f new mime type: font/woff2
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3402
diff changeset
889 }
4887
a29a6bdba9dd mime type for .ico
Alain Mazy <am@osimis.io>
parents: 4870
diff changeset
890 else if (extension == ".ico")
a29a6bdba9dd mime type for .ico
Alain Mazy <am@osimis.io>
parents: 4870
diff changeset
891 {
a29a6bdba9dd mime type for .ico
Alain Mazy <am@osimis.io>
parents: 4870
diff changeset
892 return MimeType_Ico;
a29a6bdba9dd mime type for .ico
Alain Mazy <am@osimis.io>
parents: 4870
diff changeset
893 }
4943
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
894 else if (extension == ".gz")
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
895 {
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
896 return MimeType_Gzip;
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
897 }
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
898 else if (extension == ".zip")
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
899 {
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
900 return MimeType_Zip;
47d734fa30f6 adding function OrthancPluginRegisterWebDavCollection() to the plugin SDK
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4887
diff changeset
901 }
5348
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
902 else if (extension == ".mtl")
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
903 {
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
904 return MimeType_Mtl;
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
905 }
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
906 else if (extension == ".obj")
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
907 {
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
908 return MimeType_Obj;
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
909 }
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
910 else if (extension == ".stl")
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
911 {
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
912 return MimeType_Stl;
303e930fff0f "/tools/create-dicom" can now be used to create Encapsulated 3D Manufacturing Model IODs (MTL, OBJ, or STL)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 5185
diff changeset
913 }
2984
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
914
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
915 // Default type
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
916 else
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
917 {
2984
db8f360fcb41 OrthancPluginAutodetectMimeType()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2954
diff changeset
918 LOG(INFO) << "Unknown MIME type for extension \"" << extension << "\"";
2908
9d277f8ad698 new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2906
diff changeset
919 return MimeType_Binary;
2906
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
920 }
2a504fef4ed7 AutodetectMimeType() now using boost::filesystem
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2794
diff changeset
921 }
2920
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
922
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
923
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
924 void SystemToolbox::GetEnvironmentVariables(std::map<std::string, std::string>& env)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
925 {
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
926 env.clear();
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
927
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
928 for (char **p = environ; *p != NULL; p++)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
929 {
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
930 std::string v(*p);
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
931 size_t pos = v.find('=');
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
932
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
933 if (pos != std::string::npos)
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
934 {
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
935 std::string key = v.substr(0, pos);
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
936 std::string value = v.substr(pos + 1);
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
937 env[key] = value;
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
938 }
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
939 }
ad0e7def3338 Toolbox::SubstituteVariables and SystemToolbox::GetEnvironmentVariables
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2908
diff changeset
940 }
2933
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
941
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
942
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
943 std::string SystemToolbox::InterpretRelativePath(const std::string& baseDirectory,
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
944 const std::string& relativePath)
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
945 {
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
946 boost::filesystem::path base(baseDirectory);
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
947 boost::filesystem::path relative(relativePath);
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
948
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
949 /**
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
950 The following lines should be equivalent to this one:
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
951
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
952 return (base / relative).string();
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
953
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
954 However, for some unknown reason, some versions of Boost do not
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
955 make the proper path resolution when "baseDirectory" is an
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
956 absolute path. So, a hack is used below.
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
957 **/
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
958
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
959 if (relative.is_absolute())
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
960 {
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
961 return relative.string();
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
962 }
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
963 else
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
964 {
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
965 return (base / relative).string();
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
966 }
4a38d7d4f0e0 new class: OrthancConfiguration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2920
diff changeset
967 }
4342
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
968
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
969
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
970 void SystemToolbox::ReadFileRange(std::string& content,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
971 const std::string& path,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
972 uint64_t start, // Inclusive
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
973 uint64_t end, // Exclusive
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
974 bool throwIfOverflow)
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
975 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
976 if (start > end)
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
977 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
978 throw OrthancException(ErrorCode_ParameterOutOfRange);
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
979 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
980
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
981 if (!IsRegularFile(path))
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
982 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
983 throw OrthancException(ErrorCode_RegularFileExpected,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
984 "The path does not point to a regular file: " + path);
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
985 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
986
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
987 boost::filesystem::ifstream f;
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
988 f.open(path, std::ifstream::in | std::ifstream::binary);
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
989 if (!f.good())
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
990 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
991 throw OrthancException(ErrorCode_InexistentFile,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
992 "File not found: " + path);
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
993 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
994
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
995 uint64_t fileSize = static_cast<uint64_t>(GetStreamSize(f));
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
996 if (end > fileSize)
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
997 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
998 if (throwIfOverflow)
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
999 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1000 throw OrthancException(ErrorCode_ParameterOutOfRange,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1001 "Reading beyond the end of a file");
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1002 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1003 else
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1004 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1005 end = fileSize;
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1006 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1007 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1008
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1009 if (start <= end)
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1010 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1011 content.resize(static_cast<size_t>(end - start));
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1012
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1013 if (static_cast<uint64_t>(content.size()) != (end - start))
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1014 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1015 throw OrthancException(ErrorCode_InternalError,
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1016 "Reading a file that is too large for a 32bit architecture");
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1017 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1018
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1019 if (!content.empty())
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1020 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1021 f.seekg(start, std::ios::beg);
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1022 f.read(&content[0], static_cast<std::streamsize>(content.size()));
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1023 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1024 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1025 else
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1026 {
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1027 content.clear();
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1028 }
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1029
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1030 f.close();
52166629239f SystemToolbox::ReadFileRange()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4297
diff changeset
1031 }
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1032
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1033
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1034 #if defined(_WIN32)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1035 void SystemToolbox::GetMacAddresses(std::set<std::string>& target)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1036 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1037 target.clear();
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1038
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1039 // 15Ko is the recommanded size to start with
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1040 std::vector<char> buffer(15 * 1024);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1041
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1042 for (unsigned int iteration = 0; iteration < 3; iteration++)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1043 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1044 ULONG outBufLen = static_cast<ULONG>(buffer.size());
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1045 DWORD result = GetAdaptersAddresses
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1046 (AF_UNSPEC, 0, NULL,
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1047 reinterpret_cast<IP_ADAPTER_ADDRESSES*>(&buffer[0]), &outBufLen);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1048
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1049 if (result == NO_ERROR)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1050 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1051 IP_ADAPTER_ADDRESSES* current =
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1052 reinterpret_cast<IP_ADAPTER_ADDRESSES*>(&buffer[0]);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1053
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1054 while (current != NULL)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1055 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1056 if (current->PhysicalAddressLength == 6 &&
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1057 (current->PhysicalAddress[0] != 0 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1058 current->PhysicalAddress[1] != 0 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1059 current->PhysicalAddress[2] != 0 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1060 current->PhysicalAddress[3] != 0 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1061 current->PhysicalAddress[4] != 0 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1062 current->PhysicalAddress[5] != 0))
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1063 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1064 char tmp[32];
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1065 sprintf(tmp, "%02x:%02x:%02x:%02x:%02x:%02x",
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1066 (unsigned char) current->PhysicalAddress[0],
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1067 (unsigned char) current->PhysicalAddress[1],
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1068 (unsigned char) current->PhysicalAddress[2],
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1069 (unsigned char) current->PhysicalAddress[3],
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1070 (unsigned char) current->PhysicalAddress[4],
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1071 (unsigned char) current->PhysicalAddress[5]);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1072 target.insert(tmp);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1073 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1074
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1075 current = current->Next;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1076 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1077
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1078 return;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1079 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1080 else if (result != ERROR_BUFFER_OVERFLOW ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1081 iteration >= 3 ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1082 outBufLen == 0)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1083 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1084 return;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1085 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1086 else
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1087 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1088 buffer.resize(outBufLen);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1089 iteration++;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1090 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1091 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1092 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1093
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1094 #else
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1095 namespace
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1096 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1097 class SocketRaii : public boost::noncopyable
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1098 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1099 private:
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1100 int socket_;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1101
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1102 public:
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1103 SocketRaii()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1104 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1105 socket_ = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1106 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1107
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1108 ~SocketRaii()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1109 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1110 if (socket_ != -1)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1111 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1112 close(socket_);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1113 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1114 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1115
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1116 int GetDescriptor() const
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1117 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1118 return socket_;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1119 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1120 };
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1121
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1122
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1123 class NetworkInterfaces : public boost::noncopyable
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1124 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1125 private:
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1126 struct if_nameindex* list_;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1127 struct if_nameindex* current_;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1128
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1129 public:
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1130 NetworkInterfaces()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1131 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1132 list_ = if_nameindex();
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1133 current_ = list_;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1134 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1135
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1136 ~NetworkInterfaces()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1137 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1138 if (list_ != NULL)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1139 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1140 if_freenameindex(list_);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1141 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1142 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1143
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1144 bool IsDone() const
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1145 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1146 return (current_ == NULL ||
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1147 (current_->if_index == 0 &&
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1148 current_->if_name == NULL));
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1149 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1150
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1151 const char* GetCurrentName() const
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1152 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1153 assert(!IsDone());
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1154 return current_->if_name;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1155 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1156
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1157 unsigned int GetCurrentIndex() const
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1158 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1159 assert(!IsDone());
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1160 return current_->if_index;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1161 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1162
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1163 void Next()
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1164 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1165 assert(!IsDone());
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1166 current_++;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1167 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1168 };
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1169 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1170
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1171
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1172 void SystemToolbox::GetMacAddresses(std::set<std::string>& target)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1173 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1174 target.clear();
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1175
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1176 SocketRaii socket;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1177
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1178 if (socket.GetDescriptor() != 1)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1179 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1180 NetworkInterfaces interfaces;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1181
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1182 while (!interfaces.IsDone())
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1183 {
4552
beb8ba8a0b12 fix build on freebsd
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4538
diff changeset
1184 #if (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD_kernel__) || defined(__FreeBSD__)
4538
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1185 int mib[6];
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1186 mib[0] = CTL_NET;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1187 mib[1] = AF_ROUTE;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1188 mib[2] = 0;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1189 mib[3] = AF_LINK;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1190 mib[4] = NET_RT_IFLIST;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1191 mib[5] = interfaces.GetCurrentIndex();
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1192
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1193 size_t len;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1194 if (sysctl(mib, 6, NULL, &len, NULL, 0) == 0 &&
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1195 len > 0)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1196 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1197 std::string tmp;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1198 tmp.resize(len);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1199 if (sysctl(mib, 6, &tmp[0], &len, NULL, 0) == 0)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1200 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1201 struct if_msghdr* ifm = reinterpret_cast<struct if_msghdr*>(&tmp[0]);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1202 struct sockaddr_dl* sdl = reinterpret_cast<struct sockaddr_dl*>(ifm + 1);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1203
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1204 if (sdl->sdl_type == IFT_ETHER) // Only consider Ethernet interfaces
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1205 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1206 const unsigned char* mac = reinterpret_cast<const unsigned char*>(LLADDR(sdl));
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1207 char tmp[32];
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1208 sprintf(tmp, "%02x:%02x:%02x:%02x:%02x:%02x",
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1209 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1210 target.insert(tmp);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1211 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1212 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1213 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1214
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1215 #else
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1216 struct ifreq ifr;
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1217 strcpy(ifr.ifr_name, interfaces.GetCurrentName());
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1218
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1219 if (ioctl(socket.GetDescriptor(), SIOCGIFFLAGS, &ifr) == 0 &&
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1220 !(ifr.ifr_flags & IFF_LOOPBACK) && // ignore loopback interface
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1221 ioctl(socket.GetDescriptor(), SIOCGIFHWADDR, &ifr) == 0)
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1222 {
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1223 const unsigned char* mac = reinterpret_cast<const unsigned char*>(ifr.ifr_hwaddr.sa_data);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1224
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1225 char tmp[32];
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1226 sprintf(tmp, "%02x:%02x:%02x:%02x:%02x:%02x",
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1227 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1228 target.insert(tmp);
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1229 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1230 #endif
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1231
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1232 interfaces.Next();
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1233 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1234 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1235 }
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1236
8a7523da6a9b added SystemToolbox::GetMacAddresses()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4476
diff changeset
1237 #endif
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1238 }