comparison OrthancFramework/Sources/JobsEngine/JobInfo.cpp @ 4044:d25f4c0fa160 framework

splitting code into OrthancFramework and OrthancServer
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 10 Jun 2020 20:30:34 +0200
parents Core/JobsEngine/JobInfo.cpp@94f4a18a79cc
children bf7b9edf6b81
comparison
equal deleted inserted replaced
4043:6c6239aec462 4044:d25f4c0fa160
1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium
6 *
7 * This program is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
11 *
12 * In addition, as a special exception, the copyright holders of this
13 * program give permission to link the code of its release with the
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
15 * that use the same license as the "OpenSSL" library), and distribute
16 * the linked executables. You must obey the GNU General Public License
17 * in all respects for all of the code used other than "OpenSSL". If you
18 * modify file(s) with this exception, you may extend this exception to
19 * your version of the file(s), but you are not obligated to do so. If
20 * you do not wish to do so, delete this exception statement from your
21 * version. If you delete this exception statement from all source files
22 * in the program, then also delete it here.
23 *
24 * This program is distributed in the hope that it will be useful, but
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 * General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31 **/
32
33
34 #include "../PrecompiledHeaders.h"
35
36 #ifdef __EMSCRIPTEN__
37 /*
38 Avoid this error:
39
40 .../boost/math/special_functions/round.hpp:118:12: warning: implicit conversion from 'std::__2::numeric_limits<long long>::type' (aka 'long long') to 'float' changes value from 9223372036854775807 to 9223372036854775808 [-Wimplicit-int-float-conversion]
41 .../boost/math/special_functions/round.hpp:125:11: note: in instantiation of function template specialization 'boost::math::llround<float, boost::math::policies::policy<boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy> >' requested here
42 .../orthanc/Core/JobsEngine/JobInfo.cpp:69:44: note: in instantiation of function template specialization 'boost::math::llround<float>' requested here
43
44 .../boost/math/special_functions/round.hpp:86:12: warning: implicit conversion from 'std::__2::numeric_limits<int>::type' (aka 'int') to 'float' changes value from 2147483647 to 2147483648 [-Wimplicit-int-float-conversion]
45 .../boost/math/special_functions/round.hpp:93:11: note: in instantiation of function template specialization 'boost::math::iround<float, boost::math::policies::policy<boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy> >' requested here
46 .../orthanc/Core/JobsEngine/JobInfo.cpp:133:39: note: in instantiation of function template specialization 'boost::math::iround<float>' requested here
47 */
48 #pragma GCC diagnostic ignored "-Wimplicit-int-float-conversion"
49 #endif
50
51 #include "JobInfo.h"
52
53 #include "../OrthancException.h"
54
55 // This "include" is mandatory for Release builds using Linux Standard Base
56 #include <boost/math/special_functions/round.hpp>
57
58 namespace Orthanc
59 {
60 JobInfo::JobInfo(const std::string& id,
61 int priority,
62 JobState state,
63 const JobStatus& status,
64 const boost::posix_time::ptime& creationTime,
65 const boost::posix_time::ptime& lastStateChangeTime,
66 const boost::posix_time::time_duration& runtime) :
67 id_(id),
68 priority_(priority),
69 state_(state),
70 timestamp_(boost::posix_time::microsec_clock::universal_time()),
71 creationTime_(creationTime),
72 lastStateChangeTime_(lastStateChangeTime),
73 runtime_(runtime),
74 hasEta_(false),
75 status_(status)
76 {
77 if (state_ == JobState_Running)
78 {
79 float ms = static_cast<float>(runtime_.total_milliseconds());
80
81 if (status_.GetProgress() > 0.01f &&
82 ms > 0.01f)
83 {
84 float ratio = static_cast<float>(1.0 - status_.GetProgress());
85 long long remaining = boost::math::llround(ratio * ms);
86 eta_ = timestamp_ + boost::posix_time::milliseconds(remaining);
87 hasEta_ = true;
88 }
89 }
90 }
91
92
93 JobInfo::JobInfo() :
94 priority_(0),
95 state_(JobState_Failure),
96 timestamp_(boost::posix_time::microsec_clock::universal_time()),
97 creationTime_(timestamp_),
98 lastStateChangeTime_(timestamp_),
99 runtime_(boost::posix_time::milliseconds(0)),
100 hasEta_(false)
101 {
102 }
103
104
105 bool JobInfo::HasCompletionTime() const
106 {
107 return (state_ == JobState_Success ||
108 state_ == JobState_Failure);
109 }
110
111
112 const boost::posix_time::ptime& JobInfo::GetEstimatedTimeOfArrival() const
113 {
114 if (hasEta_)
115 {
116 return eta_;
117 }
118 else
119 {
120 throw OrthancException(ErrorCode_BadSequenceOfCalls);
121 }
122 }
123
124
125 const boost::posix_time::ptime& JobInfo::GetCompletionTime() const
126 {
127 if (HasCompletionTime())
128 {
129 return lastStateChangeTime_;
130 }
131 else
132 {
133 throw OrthancException(ErrorCode_BadSequenceOfCalls);
134 }
135 }
136
137
138 void JobInfo::Format(Json::Value& target) const
139 {
140 target = Json::objectValue;
141 target["ID"] = id_;
142 target["Priority"] = priority_;
143 target["ErrorCode"] = static_cast<int>(status_.GetErrorCode());
144 target["ErrorDescription"] = EnumerationToString(status_.GetErrorCode());
145 target["State"] = EnumerationToString(state_);
146 target["Timestamp"] = boost::posix_time::to_iso_string(timestamp_);
147 target["CreationTime"] = boost::posix_time::to_iso_string(creationTime_);
148 target["EffectiveRuntime"] = static_cast<double>(runtime_.total_milliseconds()) / 1000.0;
149 target["Progress"] = boost::math::iround(status_.GetProgress() * 100.0f);
150
151 target["Type"] = status_.GetJobType();
152 target["Content"] = status_.GetPublicContent();
153
154 if (HasEstimatedTimeOfArrival())
155 {
156 target["EstimatedTimeOfArrival"] = boost::posix_time::to_iso_string(GetEstimatedTimeOfArrival());
157 }
158
159 if (HasCompletionTime())
160 {
161 target["CompletionTime"] = boost::posix_time::to_iso_string(GetCompletionTime());
162 }
163 }
164 }