comparison Plugins/Engine/PluginsErrorDictionary.cpp @ 1644:939b921b2c81

plugin error dictionary
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 23 Sep 2015 22:05:27 +0200
parents
children 1558b3226b18
comparison
equal deleted inserted replaced
1643:87c77b9b3679 1644:939b921b2c81
1 /**
2 * Orthanc - A Lightweight, RESTful DICOM Store
3 * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics
4 * Department, University Hospital of Liege, Belgium
5 *
6 * This program is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, either version 3 of the
9 * License, or (at your option) any later version.
10 *
11 * In addition, as a special exception, the copyright holders of this
12 * program give permission to link the code of its release with the
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
14 * that use the same license as the "OpenSSL" library), and distribute
15 * the linked executables. You must obey the GNU General Public License
16 * in all respects for all of the code used other than "OpenSSL". If you
17 * modify file(s) with this exception, you may extend this exception to
18 * your version of the file(s), but you are not obligated to do so. If
19 * you do not wish to do so, delete this exception statement from your
20 * version. If you delete this exception statement from all source files
21 * in the program, then also delete it here.
22 *
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
30 **/
31
32
33 #include "../../OrthancServer/PrecompiledHeadersServer.h"
34 #include "PluginsErrorDictionary.h"
35
36 #if ORTHANC_PLUGINS_ENABLED != 1
37 #error The plugin support is disabled
38 #endif
39
40
41 #include "PluginsEnumerations.h"
42 #include "PluginsManager.h"
43
44 #include <memory>
45
46
47 namespace Orthanc
48 {
49 PluginsErrorDictionary::PluginsErrorDictionary() :
50 pos_(ErrorCode_START_PLUGINS)
51 {
52 }
53
54
55 PluginsErrorDictionary::~PluginsErrorDictionary()
56 {
57 for (Errors::iterator it = errors_.begin(); it != errors_.end(); ++it)
58 {
59 delete it->second;
60 }
61 }
62
63
64 OrthancPluginErrorCode PluginsErrorDictionary::Register(SharedLibrary& library,
65 int32_t pluginCode,
66 const char* description,
67 uint16_t httpStatus)
68 {
69 std::auto_ptr<Error> error(new Error);
70
71 error->pluginCode_ = pluginCode;
72 error->description_ = description;
73 error->httpStatus_ = static_cast<HttpStatus>(httpStatus);
74 error->pluginName_ = PluginsManager::GetPluginName(library);
75
76 OrthancPluginErrorCode code;
77
78 {
79 boost::mutex::scoped_lock lock(mutex_);
80 errors_[pos_] = error.release();
81 code = static_cast<OrthancPluginErrorCode>(pos_);
82 pos_ += 1;
83 }
84
85 return code;
86 }
87
88
89 void PluginsErrorDictionary::GetExceptionMessage(Json::Value& message, /* out */
90 HttpStatus& httpStatus, /* out */
91 const OrthancException& exception)
92 {
93 bool done = false;
94
95 if (exception.GetErrorCode() >= ErrorCode_START_PLUGINS)
96 {
97 boost::mutex::scoped_lock lock(mutex_);
98 Errors::const_iterator error = errors_.find(static_cast<int32_t>(exception.GetErrorCode()));
99
100 if (error != errors_.end())
101 {
102 httpStatus = error->second->httpStatus_;
103 message["PluginName"] = error->second->pluginName_;
104 message["PluginCode"] = error->second->pluginCode_;
105 message["Message"] = error->second->description_;
106
107 done = true;
108 }
109 }
110
111 if (!done)
112 {
113 httpStatus = exception.GetHttpStatus();
114 message["Message"] = exception.What();
115 }
116
117 message["HttpError"] = EnumerationToString(httpStatus);
118 message["HttpStatus"] = httpStatus;
119 message["OrthancError"] = EnumerationToString(exception.GetErrorCode());
120 message["OrthancStatus"] = exception.GetErrorCode();
121 }
122
123 }