annotate Plugin/Plugin.cpp @ 5:c8f19e93ff99

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 19 Oct 2023 08:49:07 +0200
parents 9032ffb3a7d5
children b14ed1ea3a23
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023 Sebastien Jodogne, UCLouvain, Belgium
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 */
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Java plugin for Orthanc
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023 Sebastien Jodogne, UCLouvain, Belgium
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
25 #include "JavaEnvironment.h"
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
26 #include "JavaVirtualMachine.h"
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
27
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #include <orthanc/OrthancCPlugin.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 #include <cassert>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 #include <iostream>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 #include <jni.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include <list>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include <map>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include <memory>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #include <set>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #include <stdexcept>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #include <vector>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #include <json/reader.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 #include "Mutex.h"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
44 OrthancPluginContext* context_ = NULL;
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 static std::unique_ptr<JavaVirtualMachine> java_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 class JavaString : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 jstring javaStr_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 const char* cStr_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 jboolean isCopy_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 JavaString(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 jstring javaStr) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 env_(env),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 javaStr_(javaStr)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 if (env == NULL ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 javaStr == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 cStr_ = env_->GetStringUTFChars(javaStr_, &isCopy_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 if (cStr_ == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 throw std::runtime_error("Cannot read string");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 ~JavaString()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 * "The ReleaseString-Chars call is necessary whether
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 * GetStringChars has set isCopy to JNI_TRUE or JNI_FALSE."
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 * https://stackoverflow.com/a/5863081
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 **/
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 env_->ReleaseStringUTFChars(javaStr_, cStr_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 const char* GetValue() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 return cStr_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 class JavaBytes : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 jbyteArray bytes_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 jbyte* data_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 jsize size_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 jboolean isCopy_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 JavaBytes(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 jbyteArray bytes) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 env_(env),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 bytes_(bytes)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 if (env == NULL ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 bytes == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 size_ = env->GetArrayLength(bytes);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 if (size_ == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 data_ = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 data_ = env->GetByteArrayElements(bytes_, &isCopy_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 if (data_ == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 throw std::runtime_error("Cannot read array of bytes");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 ~JavaBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 if (size_ > 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 env_->ReleaseByteArrayElements(bytes_, data_, 0);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 const void* GetData() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 return data_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 size_t GetSize() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 return size_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 class OrthancString : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 char* str_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 OrthancString(char* str) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 str_(str)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 ~OrthancString()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 if (str_ != NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 OrthancPluginFreeString(context_, str_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 const char* GetValue() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 return str_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 class OrthancBytes : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 OrthancPluginMemoryBuffer buffer_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 OrthancBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 buffer_.data = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 buffer_.size = 0;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 ~OrthancBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 OrthancPluginFreeMemoryBuffer(context_, &buffer_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 OrthancPluginMemoryBuffer* GetMemoryBuffer()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 return &buffer_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 const void* GetData() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 return buffer_.data;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 size_t GetSize() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 return buffer_.size;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 class JavaGlobalReference : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 JavaVirtualMachine& jvm_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 jobject obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 JavaGlobalReference(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 jobject obj) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 jvm_(jvm),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 obj_(NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 JavaEnvironment env(jvm);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 obj_ = env.GetValue().NewGlobalRef(obj);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 if (obj_ == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 throw std::runtime_error("Cannot create global reference");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 ~JavaGlobalReference()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 assert(obj_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 JavaEnvironment env(jvm_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 env.GetValue().DeleteGlobalRef(obj_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 jobject GetValue()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 assert(obj_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 return obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 class LocalJavaObject : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 jobject obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 LocalJavaObject(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 jobject obj,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 bool objCanBeNull = false) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 env_(&env.GetValue()),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 obj_(obj)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273 if (!objCanBeNull && obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279 ~LocalJavaObject()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281 env_->DeleteLocalRef(obj_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
284 jobject GetValue()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
285 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 return obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
288
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289 static LocalJavaObject* CreateArrayOfStrings(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
290 const std::vector<std::string>& items)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
291 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
292 LocalJavaObject emptyString(env, env.GetValue().NewStringUTF(""));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
293
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
294 jobjectArray obj = env.GetValue().NewObjectArray(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 items.size(), env.GetValue().FindClass("java/lang/String"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
296 emptyString.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
297
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
298 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
299 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
300 throw std::runtime_error("Cannot create an array of Java strings");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
301 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
302 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
303 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
304 std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
305
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
306 for (size_t i = 0; i < items.size(); i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
307 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
308 LocalJavaObject item(env, env.GetValue().NewStringUTF(items[i].c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
309 env.GetValue().SetObjectArrayElement(obj, i, item.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
310 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
311
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
312 return result.release();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
313 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
315
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
316 static LocalJavaObject* CreateDictionary(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
317 const std::map<std::string, std::string>& items)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319 // NB: In JNI, there are no generics. All the templated arguments
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
320 // are taken as instances of the "Object" base class.
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
321
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
322 jclass cls = env.FindClass("java/util/HashMap");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
323 jmethodID constructor = env.GetMethodID(cls, "<init>", "()V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324 jmethodID setter = env.GetMethodID(cls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
325 jobject obj = env.GetValue().NewObject(cls, constructor);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
329 throw std::runtime_error("Cannot create a Java dictionary");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 for (std::map<std::string, std::string>::const_iterator it = items.begin(); it != items.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 LocalJavaObject key(env, env.GetValue().NewStringUTF(it->first.c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 LocalJavaObject value(env, env.GetValue().NewStringUTF(it->second.c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 LocalJavaObject previousValue(env, env.GetValue().CallObjectMethod(obj, setter, key.GetValue(), value.GetValue()), true);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
340 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
341 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
342
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
343 return result.release();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
345 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
346 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
347
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
348
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
349
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 #include "NativeSDK.cpp"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
351
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
352
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
353
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 #define MAX_REST_CALLBACKS 10
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356 class CallbacksConfiguration : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
357 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359 Mutex mutex_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360 std::list<JavaGlobalReference*> onChangeCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
361 std::vector<JavaGlobalReference*> onRestRequestCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 static void DestructCallbacks(std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
365 for (std::list<JavaGlobalReference*>::iterator it = lst.begin(); it != lst.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
366 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
367 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
368 delete *it;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
369 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
370 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
371
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
372 static void DestructCallbacks(std::vector<JavaGlobalReference*>& v)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
373 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
374 for (size_t i = 0; i < v.size(); i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
375 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
376 assert(v[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
377 delete v[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
378 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
379 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
380
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
381 void CopyCallbacks(std::list<jobject>& target,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
382 const std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
383 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
384 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
385 target.clear();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
386
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
387 for (std::list<JavaGlobalReference*>::const_iterator it = lst.begin(); it != lst.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
388 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
389 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 target.push_back((*it)->GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
391 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
392 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
393
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394 void AddCallback(std::list<JavaGlobalReference*>& lst,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
396 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
397 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
398 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
399 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
403 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
404 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
405 lst.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
406 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
407 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
408
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
409 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
410 CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
411 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412 onRestRequestCallbacks_.reserve(MAX_REST_CALLBACKS);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
414
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
415 ~CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
416 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417 DestructCallbacks(onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
418 DestructCallbacks(onRestRequestCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
419 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
420
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 void AddOnChangeCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
422 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
423 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 AddCallback(onChangeCallbacks_, jvm, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
426
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 void GetOnChangeCallbacks(std::list<jobject>& target)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 CopyCallbacks(target, onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432 size_t AddOnRestRequestCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
439 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
440 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
441 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
443 if (onRestRequestCallbacks_.size() >= MAX_REST_CALLBACKS)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 char buf[16];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446 sprintf(buf, "%d", MAX_REST_CALLBACKS);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447 throw std::runtime_error("The Java plugin for Orthanc has been compiled for a maximum of " +
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 std::string(buf) + " REST callbacks");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
451 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
452 size_t result = onRestRequestCallbacks_.size();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
453 onRestRequestCallbacks_.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 return result;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
455 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
456 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
457 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
458
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
459 jobject GetOnRestCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
460 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
461 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
462
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
463 if (i >= onRestRequestCallbacks_.size())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
464 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
465 throw std::runtime_error("Unknown REST callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
466 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
467 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
468 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
469 assert(onRestRequestCallbacks_[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
470 return onRestRequestCallbacks_[i]->GetValue();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
471 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
472 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
473 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
474
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
475 static std::unique_ptr<CallbacksConfiguration> callbacksConfiguration_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
476
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
477
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
478
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
479
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
480 template<size_t Index>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481 class RestCallbacksPool
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
483 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
484 RestCallbacksPool<Index - 1> next_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
485
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486 static OrthancPluginErrorCode Callback(OrthancPluginRestOutput* output,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487 const char* uri,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 const OrthancPluginHttpRequest* request)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
491 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
492 jobject callback = callbacksConfiguration_->GetOnRestCallback(MAX_REST_CALLBACKS - Index);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 throw std::runtime_error("Missing callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
496 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 std::vector<std::string> groups;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 groups.resize(request->groupsCount);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 for (uint32_t i = 0; i < request->groupsCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502 groups[i].assign(request->groups[i]);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 std::map<std::string, std::string> headers;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506 for (uint32_t i = 0; i < request->headersCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 headers[request->headersKeys[i]] = request->headersValues[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
510
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
511 std::map<std::string, std::string> getParameters;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512 for (uint32_t i = 0; i < request->getCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514 getParameters[request->getKeys[i]] = request->getValues[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519 LocalJavaObject joutput(env, env.ConstructJavaWrapper("be/uclouvain/orthanc/RestOutput", output));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520 LocalJavaObject jmethod(env, env.ConstructEnumValue("be/uclouvain/orthanc/HttpMethod", request->method));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521 LocalJavaObject juri(env, env.GetValue().NewStringUTF(uri == NULL ? "" : uri));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
522 std::unique_ptr<LocalJavaObject> jgroups(LocalJavaObject::CreateArrayOfStrings(env, groups));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 std::unique_ptr<LocalJavaObject> jheaders(LocalJavaObject::CreateDictionary(env, headers));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524 std::unique_ptr<LocalJavaObject> jgetParameters(LocalJavaObject::CreateDictionary(env, getParameters));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525 LocalJavaObject jbody(env, env.ConstructByteArray(request->bodySize, request->body));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528 env.GetObjectClass(callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 "(Lbe/uclouvain/orthanc/RestOutput;Lbe/uclouvain/orthanc/HttpMethod;Ljava/lang/String;"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530 "[Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;[B)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
532 env.GetValue().CallVoidMethod(callback, call, joutput.GetValue(), jmethod.GetValue(), juri.GetValue(),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
533 jgroups->GetValue(), jheaders->GetValue(), jgetParameters->GetValue(), jbody.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
534 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
535
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
536 return OrthancPluginErrorCode_Success;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
537 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
538 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
539 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
542 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
548 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551 OrthancPluginRestCallback GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553 if (i == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 return Callback;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559 return next_.GetCallback(i - 1);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
560 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
561 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
562 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
563
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 template<>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 class RestCallbacksPool<0>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568 OrthancPluginRestCallback& GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 throw std::runtime_error("Out of tuple");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575 static RestCallbacksPool<MAX_REST_CALLBACKS> restCallbacksPool_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
577
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
578
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580 OrthancPluginResourceType resourceType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581 const char* resourceId)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 std::list<jobject> callbacks;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586 callbacksConfiguration_->GetOnChangeCallbacks(callbacks);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
588 if (!callbacks.empty())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
589 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
591
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
592 LocalJavaObject c(env, env.ConstructEnumValue("be/uclouvain/orthanc/ChangeType", changeType));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 LocalJavaObject r(env, env.ConstructEnumValue("be/uclouvain/orthanc/ResourceType", resourceType));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 LocalJavaObject s(env, env.GetValue().NewStringUTF(resourceId == NULL ? "" : resourceId));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
595
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
596 for (std::list<jobject>::const_iterator
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
597 callback = callbacks.begin(); callback != callbacks.end(); ++callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
598 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
599 assert(*callback != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
600
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
601 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
602 env.GetObjectClass(*callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
603 "(Lbe/uclouvain/orthanc/ChangeType;Lbe/uclouvain/orthanc/ResourceType;Ljava/lang/String;)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
604
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
605 env.GetValue().CallVoidMethod(*callback, call, c.GetValue(), r.GetValue(), s.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
608 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
609
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
610 return OrthancPluginErrorCode_Success;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
611 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
613 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
614 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
615 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
616 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
617 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
618 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
619 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
621 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
622 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
624
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
625 JNIEXPORT void RegisterOnChangeCallback(JNIEnv* env, jobject sdkObject, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
628 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
629 callbacksConfiguration_->AddOnChangeCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
633 JavaEnvironment::ThrowOrthancException(env, e.what());
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
635 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
637 JavaEnvironment::ThrowOrthancException(env, OrthancPluginErrorCode_Plugin);
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
639 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
642 JNIEXPORT void RegisterOnRestRequestCallback(JNIEnv* env, jobject sdkObject, jstring regex, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
643 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
644 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
645 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
646 JavaString cregex(env, regex);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
647 size_t index = callbacksConfiguration_->AddOnRestRequestCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648 OrthancPluginRegisterRestCallbackNoLock(context_, cregex.GetValue(), restCallbacksPool_.GetCallback(index));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
649 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
650 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
652 JavaEnvironment::ThrowOrthancException(env, e.what());
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
653 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
654 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 {
5
c8f19e93ff99 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
656 JavaEnvironment::ThrowOrthancException(env, OrthancPluginErrorCode_Plugin);
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
658 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
659
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
661 static void ParseJson(Json::Value& target,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
662 const std::string& source)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
663 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
664 Json::CharReaderBuilder builder;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
665 builder.settings_["collectComments"] = false;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
666
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
667 const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
668 assert(reader.get() != NULL);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
669
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
670 JSONCPP_STRING err;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
671 if (!reader->parse(source.c_str(), source.c_str() + source.size(), &target, &err))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
672 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
673 throw std::runtime_error("Cannot parse JSON: " + err);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
674 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
675 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
676
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
677
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
678 static bool HasOption(const Json::Value& json,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
679 const std::string& key,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
680 Json::ValueType type,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
681 bool isMandatory)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
682 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
683 if (!json.isMember(key))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
684 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
685 if (isMandatory)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
686 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
687 throw std::runtime_error("Missing configuration option for the Java plugin: \"" + key + "\"");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
688 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
689 else
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
690 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
691 return false;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
692 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
693 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
694 else if (json[key].type() == type)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
695 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
696 return true;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
697 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
698 else
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
699 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
700 throw std::runtime_error("The configuration option \"" + key + "\" for the Java plugin has not the proper type");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
701 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
702 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
703
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
704
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
705 static std::string GetMandatoryString(const Json::Value& json,
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
706 const std::string& key)
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
707 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
708 HasOption(json, key, Json::stringValue, true);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
709 assert(json.isMember(key) &&
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
710 json[key].type() == Json::stringValue);
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
711 return json[key].asString();
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
712 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
713
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
714
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
715 extern "C"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
716 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
717 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
718 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
719 context_ = context;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721 /* Check the version of the Orthanc core */
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 if (OrthancPluginCheckVersion(context) == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
723 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
724 char info[1024];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
725 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
726 context->orthancVersion,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
727 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
728 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
729 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
730 OrthancPluginLogError(context, info);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
731 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
734 OrthancPluginSetDescription(context, "Java plugin for Orthanc");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
735
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
736 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
737 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
738 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
739 // Sanity check to ensure that the compiler has created different callback functions
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
740 std::set<intptr_t> c;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
741 for (unsigned int i = 0; i < MAX_REST_CALLBACKS; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
742 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
743 c.insert(reinterpret_cast<intptr_t>(restCallbacksPool_.GetCallback(i)));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
744 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
745
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
746 if (c.size() != MAX_REST_CALLBACKS)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
747 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
748 throw std::runtime_error("The Java plugin has not been properly compiled");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
749 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
750 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
751
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
752 Json::Value globalConfiguration;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
753
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
754 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
755 OrthancString tmp(OrthancPluginGetConfiguration(context));
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
756 ParseJson(globalConfiguration, tmp.GetValue());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
757 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
758
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
759 static const std::string KEY_JAVA = "Java";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
760 static const std::string KEY_ENABLED = "Enabled";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
761 static const std::string KEY_CLASSPATH = "Classpath";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
762 static const std::string KEY_INITIALIZATION_CLASS = "InitializationClass";
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
763
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
764 if (!HasOption(globalConfiguration, KEY_JAVA, Json::objectValue, false))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
765 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
766 OrthancPluginLogInfo(context, "Java plugin is disabled");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
767 return 0;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
768 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
769
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
770 Json::Value javaConfiguration = globalConfiguration[KEY_JAVA];
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
771 assert(javaConfiguration.isObject());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
772
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
773 if (HasOption(javaConfiguration, KEY_ENABLED, Json::booleanValue, false) &&
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
774 !javaConfiguration[KEY_ENABLED].asBool())
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
775 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
776 OrthancPluginLogInfo(context, "Java plugin is disabled");
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
777 return 0;
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
778 }
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
779
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
780 java_.reset(new JavaVirtualMachine(GetMandatoryString(javaConfiguration, KEY_CLASSPATH)));
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
781
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
782 callbacksConfiguration_.reset(new CallbacksConfiguration);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
783 OrthancPluginRegisterOnChangeCallback(context_, OnChangeCallback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
784
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
785 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
786
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
787 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
788 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
789 JNI_LoadNatives(methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
790 env.RegisterNatives("be/uclouvain/orthanc/NativeSDK", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
791 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
792
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
793 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
794 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
795 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
796 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
797 const_cast<char*>("(Lbe/uclouvain/orthanc/Callbacks$OnChange;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
798 (void*) RegisterOnChangeCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
799 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
800 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
801 const_cast<char*>("(Ljava/lang/String;Lbe/uclouvain/orthanc/Callbacks$OnRestRequest;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
802 (void*) RegisterOnRestRequestCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
803 env.RegisterNatives("be/uclouvain/orthanc/Callbacks", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
804 }
4
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
805
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
806 if (HasOption(javaConfiguration, KEY_INITIALIZATION_CLASS, Json::stringValue, false))
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
807 {
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
808 env.FindClass(javaConfiguration[KEY_INITIALIZATION_CLASS].asString());
9032ffb3a7d5 added configuration options
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
809 }
0
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
810 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
811 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
812 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
813 OrthancPluginLogError(context, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
814 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
815 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
816
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
817 return 0;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
818 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
819
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
820
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
821 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
822 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
823 if (java_.get() != NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
824 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
825 callbacksConfiguration_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
826
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
827 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
828 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
829 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
830 env.RunGarbageCollector();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
831 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
832 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
833 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
834 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
835 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
836
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
837 java_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
838 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
839 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
840
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
841
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
842 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
843 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
844 return "java";
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
845 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
846
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
847
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
848 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
849 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
850 return PLUGIN_VERSION;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
851 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
852 }