annotate Plugin/Plugin.cpp @ 0:3ecef5782f2c

initial commit
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 18 Oct 2023 17:59:44 +0200
parents
children 9032ffb3a7d5
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 #include <orthanc/OrthancCPlugin.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 #include <cassert>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #include <iostream>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 #include <jni.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 #include <list>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 #include <map>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 #include <memory>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include <set>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include <stdexcept>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include <vector>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #include <json/reader.h>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 #include "Mutex.h"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 static OrthancPluginContext* context_ = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 static const char* JAVA_EXCEPTION_CLASS = "be/uclouvain/orthanc/OrthancException";
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 class JavaVirtualMachine : public NonCopyable
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 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 JavaVM *jvm_;
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 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 JavaVirtualMachine(const std::string& classPath)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 std::string classPathOption = "-Djava.class.path=" + classPath;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 std::vector<JavaVMOption> options;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 options.resize(2);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 options[0].optionString = const_cast<char*>(classPathOption.c_str());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 options[0].extraInfo = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 options[1].optionString = const_cast<char*>("-Xcheck:jni");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 options[1].extraInfo = NULL;
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 JavaVMInitArgs vm_args;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 vm_args.version = JNI_VERSION_1_6;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 vm_args.nOptions = options.size();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 vm_args.options = (options.empty() ? NULL : &options[0]);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 vm_args.ignoreUnrecognized = false;
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 JNIEnv* env = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 jint res = JNI_CreateJavaVM(&jvm_, (void **) &env, &vm_args);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 if (res != JNI_OK ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 jvm_ == NULL ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 env == NULL)
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 throw std::runtime_error("Cannot create the JVM");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 }
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 ~JavaVirtualMachine()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 jvm_->DestroyJavaVM();
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 JavaVM& GetValue()
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 assert(jvm_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 return *jvm_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 }
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 class JavaEnvironment : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 JavaVM *jvm_;
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 JavaEnvironment(JNIEnv* env) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 jvm_(NULL),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 env_(env)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 if (env_ == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 JavaEnvironment(JavaVirtualMachine& jvm) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 jvm_(&jvm.GetValue())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 jint status = jvm_->GetEnv((void **) &env_, JNI_VERSION_1_6);
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 switch (status)
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 case JNI_OK:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 break;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 case JNI_EDETACHED:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 jint code = jvm_->AttachCurrentThread((void **) &env_, NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 if (code != JNI_OK)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 throw std::runtime_error("Cannot attach thread");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 break;
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 case JNI_EVERSION:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 throw std::runtime_error("JNI version not supported");
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 default:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 throw std::runtime_error("Not implemented");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 }
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 if (env_ == NULL)
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 throw std::runtime_error("Error inside JNI");
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 }
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 ~JavaEnvironment()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 if (jvm_ != NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 jvm_->DetachCurrentThread();
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 void CheckException()
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 if (env_->ExceptionCheck() == JNI_TRUE)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 env_->ExceptionClear();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 throw std::runtime_error("An exception has occurred in Java");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 }
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 JNIEnv& GetValue()
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 assert(env_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 return *env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 }
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 void RunGarbageCollector()
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 assert(env_ != NULL);
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 jclass system = FindClass("java/lang/System");
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 jmethodID runFinalization = env_->GetStaticMethodID(system, "gc", "()V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 if (runFinalization != NULL)
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 env_->CallStaticVoidMethod(system, runFinalization);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 throw std::runtime_error("Cannot run garbage collector");
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 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 jclass FindClass(const std::string& fqn)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 jclass c = GetValue().FindClass(fqn.c_str());
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 if (c == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 throw std::runtime_error("Unable to find class: " + fqn);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 else
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 return c;
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 }
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 jclass GetObjectClass(jobject obj)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 jclass c = GetValue().GetObjectClass(obj);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 if (c == NULL)
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 throw std::runtime_error("Unable to get class of object");
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 else
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 return c;
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 jmethodID GetMethodID(jclass c,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 const std::string& method,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 const std::string& signature)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 jmethodID m = GetValue().GetMethodID(c, method.c_str(), signature.c_str());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 if (m == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 throw std::runtime_error("Unable to locate method in class");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 return m;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 }
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 jobject ConstructJavaWrapper(const std::string& fqn,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 void* nativeObject)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 jclass cls = FindClass(fqn);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 jmethodID constructor = GetMethodID(cls, "<init>", "(J)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 jobject obj = env_->NewObject(cls, constructor, reinterpret_cast<intptr_t>(nativeObject));
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 if (obj == NULL)
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 throw std::runtime_error("Cannot create Java wrapper around C/C++ object: " + fqn);
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 else
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 return obj;
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 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 jbyteArray ConstructByteArray(const size_t size,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 const void* data)
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 assert(env_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 jbyteArray obj = env_->NewByteArray(size);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 if (obj == NULL)
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 throw std::runtime_error("Cannot create a byte array");
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 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 if (size > 0)
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 env_->SetByteArrayRegion(obj, 0, size, reinterpret_cast<const jbyte*>(data));
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 return obj;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 jbyteArray ConstructByteArray(const std::string& data)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 return ConstructByteArray(data.size(), data.c_str());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 void RegisterNatives(const std::string& fqn,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 const std::vector<JNINativeMethod>& methods)
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 (!methods.empty())
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 if (env_->RegisterNatives(FindClass(fqn), &methods[0], methods.size()) < 0)
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 throw std::runtime_error("Unable to register the native methods");
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 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282 void ThrowException(const std::string& fqn,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283 const std::string& message)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
284 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
285 if (GetValue().ThrowNew(FindClass(fqn), message.c_str()) != 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287 std::string message = "Cannot throw exception " + fqn;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
288 OrthancPluginLogError(context_, message.c_str());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
290 }
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 void ThrowException(const std::string& message)
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 ThrowException(JAVA_EXCEPTION_CLASS, message);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
296
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
297 void ThrowException(OrthancPluginErrorCode code)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
298 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
299 ThrowException(JAVA_EXCEPTION_CLASS, OrthancPluginGetErrorDescription(context_, code));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
300 }
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 jobject ConstructEnumValue(const std::string& fqn,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
303 int value)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
304 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
305 assert(env_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
306 jclass cls = FindClass(fqn);
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 std::string signature = "(I)L" + fqn + ";";
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
309 jmethodID constructor = env_->GetStaticMethodID(cls, "getInstance", signature.c_str());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
310 if (constructor != NULL)
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 jobject obj = env_->CallStaticObjectMethod(cls, constructor, static_cast<jint>(value));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
313 CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314 return obj;
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 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
317 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 char buf[16];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319 sprintf(buf, "%d", value);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
320 throw std::runtime_error("Cannot create enumeration value: " + fqn + " " + buf);
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 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
323
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
325 static void ThrowException(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326 const std::string& fqn,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 const std::string& message)
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 JavaEnvironment e(env);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 e.ThrowException(fqn, message);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 }
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 static void ThrowException(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334 const std::string& message)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 JavaEnvironment e(env);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 e.ThrowException(message);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
340 static void ThrowException(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
341 OrthancPluginErrorCode code)
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 JavaEnvironment e(env);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 e.ThrowException(code);
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 static std::unique_ptr<JavaVirtualMachine> java_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350
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 class JavaString : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
357 jstring javaStr_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358 const char* cStr_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359 jboolean isCopy_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
361 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 JavaString(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 jstring javaStr) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364 env_(env),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
365 javaStr_(javaStr)
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 if (env == NULL ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
368 javaStr == NULL)
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 throw std::runtime_error("Null pointer");
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
373 cStr_ = env_->GetStringUTFChars(javaStr_, &isCopy_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
374 if (cStr_ == NULL)
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 throw std::runtime_error("Cannot read string");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
377 }
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 ~JavaString()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
381 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
382 /**
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
383 * "The ReleaseString-Chars call is necessary whether
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
384 * GetStringChars has set isCopy to JNI_TRUE or JNI_FALSE."
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
385 * https://stackoverflow.com/a/5863081
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 env_->ReleaseStringUTFChars(javaStr_, cStr_);
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 const char* GetValue() const
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 return cStr_;
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 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
396
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
397 class JavaBytes : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
398 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
399 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401 jbyteArray bytes_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402 jbyte* data_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
403 jsize size_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
404 jboolean isCopy_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
405
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
406 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
407 JavaBytes(JNIEnv* env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
408 jbyteArray bytes) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
409 env_(env),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
410 bytes_(bytes)
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 if (env == NULL ||
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413 bytes == NULL)
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 throw std::runtime_error("Null pointer");
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
418 size_ = env->GetArrayLength(bytes);
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 if (size_ == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
422 data_ = NULL;
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 else
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 data_ = env->GetByteArrayElements(bytes_, &isCopy_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 if (data_ == NULL)
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 throw std::runtime_error("Cannot read array of bytes");
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 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 ~JavaBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 if (size_ > 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438 env_->ReleaseByteArrayElements(bytes_, data_, 0);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
439 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442 const void* GetData() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
443 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 return data_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447 size_t GetSize() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 return size_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
453
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 class OrthancString : public NonCopyable
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 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
457 char* str_;
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 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
460 OrthancString(char* str) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
461 str_(str)
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 }
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 ~OrthancString()
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 if (str_ != NULL)
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 OrthancPluginFreeString(context_, str_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
470 }
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 const char* GetValue() const
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 return str_;
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 class OrthancBytes : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
483 OrthancPluginMemoryBuffer buffer_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
484
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
485 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486 OrthancBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 buffer_.data = NULL;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489 buffer_.size = 0;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 }
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 ~OrthancBytes()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 OrthancPluginFreeMemoryBuffer(context_, &buffer_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 }
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 OrthancPluginMemoryBuffer* GetMemoryBuffer()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 return &buffer_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 }
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 const void* GetData() const
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 return buffer_.data;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 size_t GetSize() const
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 return buffer_.size;
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 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512
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 class JavaGlobalReference : public NonCopyable
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 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517 JavaVirtualMachine& jvm_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518 jobject obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521 JavaGlobalReference(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
522 jobject obj) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 jvm_(jvm),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524 obj_(NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531 JavaEnvironment env(jvm);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
532
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
533 obj_ = env.GetValue().NewGlobalRef(obj);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
534 if (obj_ == NULL)
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 throw std::runtime_error("Cannot create global reference");
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 }
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 ~JavaGlobalReference()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
542 assert(obj_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546 JavaEnvironment env(jvm_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 env.GetValue().DeleteGlobalRef(obj_);
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 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551 OrthancPluginLogError(context_, e.what());
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 }
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 jobject GetValue()
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 assert(obj_ != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 return obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559 }
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 class LocalJavaObject : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566 JNIEnv* env_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567 jobject obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 LocalJavaObject(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571 jobject obj,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 bool objCanBeNull = false) :
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573 env_(&env.GetValue()),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574 obj_(obj)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576 if (!objCanBeNull && obj == NULL)
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 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582 ~LocalJavaObject()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 env_->DeleteLocalRef(obj_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 jobject GetValue()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
588 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
589 return obj_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 }
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 static LocalJavaObject* CreateArrayOfStrings(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 const std::vector<std::string>& items)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
595 LocalJavaObject emptyString(env, env.GetValue().NewStringUTF(""));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
596
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
597 jobjectArray obj = env.GetValue().NewObjectArray(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
598 items.size(), env.GetValue().FindClass("java/lang/String"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
599 emptyString.GetValue());
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 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
602 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
603 throw std::runtime_error("Cannot create an array of Java strings");
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 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
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 for (size_t i = 0; i < items.size(); i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
610 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
611 LocalJavaObject item(env, env.GetValue().NewStringUTF(items[i].c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 env.GetValue().SetObjectArrayElement(obj, i, item.GetValue());
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
615 return result.release();
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 }
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 static LocalJavaObject* CreateDictionary(JavaEnvironment& env,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620 const std::map<std::string, std::string>& items)
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 // NB: In JNI, there are no generics. All the templated arguments
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623 // are taken as instances of the "Object" base class.
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 jclass cls = env.FindClass("java/util/HashMap");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 jmethodID constructor = env.GetMethodID(cls, "<init>", "()V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 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
628 jobject obj = env.GetValue().NewObject(cls, constructor);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
629
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630 if (obj == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632 throw std::runtime_error("Cannot create a Java dictionary");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
633 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
635 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
637
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 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
639 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640 LocalJavaObject key(env, env.GetValue().NewStringUTF(it->first.c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641 LocalJavaObject value(env, env.GetValue().NewStringUTF(it->second.c_str()));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
642 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
643 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
644 }
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 return result.release();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
647 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
652
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
653 #include "NativeSDK.cpp"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
654
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
656
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 #define MAX_REST_CALLBACKS 10
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 class CallbacksConfiguration : public NonCopyable
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
661 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
662 Mutex mutex_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
663 std::list<JavaGlobalReference*> onChangeCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
664 std::vector<JavaGlobalReference*> onRestRequestCallbacks_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
665
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
666 static void DestructCallbacks(std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
667 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
668 for (std::list<JavaGlobalReference*>::iterator it = lst.begin(); it != lst.end(); ++it)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
669 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
670 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
671 delete *it;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
672 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
673 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
674
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
675 static void DestructCallbacks(std::vector<JavaGlobalReference*>& v)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
676 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
677 for (size_t i = 0; i < v.size(); i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
678 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
679 assert(v[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
680 delete v[i];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
681 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
682 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
683
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
684 void CopyCallbacks(std::list<jobject>& target,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
685 const std::list<JavaGlobalReference*>& lst)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
686 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
687 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
688 target.clear();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
689
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
690 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
691 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
692 assert(*it != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
693 target.push_back((*it)->GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
694 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
695 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
696
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
697 void AddCallback(std::list<JavaGlobalReference*>& lst,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
698 JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
699 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
700 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
701 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
702 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
703 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
704 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
705 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
706 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
707 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
708 lst.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
709 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
710 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
711
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
712 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
713 CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
714 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
715 onRestRequestCallbacks_.reserve(MAX_REST_CALLBACKS);
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
718 ~CallbacksConfiguration()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
719 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720 DestructCallbacks(onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721 DestructCallbacks(onRestRequestCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 }
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 void AddOnChangeCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
725 jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
726 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
727 AddCallback(onChangeCallbacks_, jvm, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
728 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
729
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
730 void GetOnChangeCallbacks(std::list<jobject>& target)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
731 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732 CopyCallbacks(target, onChangeCallbacks_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
734
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
735 size_t AddOnRestRequestCallback(JavaVirtualMachine& jvm,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
736 jobject callback)
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 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
739 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
740 throw std::runtime_error("Null pointer");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
741 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
742 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
743 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
744 Mutex::Locker locker(mutex_);
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 (onRestRequestCallbacks_.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 char buf[16];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
749 sprintf(buf, "%d", MAX_REST_CALLBACKS);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
750 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
751 std::string(buf) + " REST callbacks");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
752 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
753 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
754 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
755 size_t result = onRestRequestCallbacks_.size();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
756 onRestRequestCallbacks_.push_back(new JavaGlobalReference(jvm, callback));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
757 return result;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
758 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
759 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
760 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
761
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
762 jobject GetOnRestCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
763 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
764 Mutex::Locker locker(mutex_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
765
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
766 if (i >= onRestRequestCallbacks_.size())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
767 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
768 throw std::runtime_error("Unknown REST callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
769 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
770 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
771 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
772 assert(onRestRequestCallbacks_[i] != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
773 return onRestRequestCallbacks_[i]->GetValue();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
774 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
775 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
776 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
777
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
778 static std::unique_ptr<CallbacksConfiguration> callbacksConfiguration_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
779
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
780
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
783 template<size_t Index>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
784 class RestCallbacksPool
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
785 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
786 private:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
787 RestCallbacksPool<Index - 1> next_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
788
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
789 static OrthancPluginErrorCode Callback(OrthancPluginRestOutput* output,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
790 const char* uri,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
791 const OrthancPluginHttpRequest* request)
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 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
794 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
795 jobject callback = callbacksConfiguration_->GetOnRestCallback(MAX_REST_CALLBACKS - Index);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
796 if (callback == NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
797 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
798 throw std::runtime_error("Missing callback");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
799 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
800
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
801 std::vector<std::string> groups;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
802 groups.resize(request->groupsCount);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
803 for (uint32_t i = 0; i < request->groupsCount; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
804 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
805 groups[i].assign(request->groups[i]);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
806 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
807
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
808 std::map<std::string, std::string> headers;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
809 for (uint32_t i = 0; i < request->headersCount; i++)
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 headers[request->headersKeys[i]] = request->headersValues[i];
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
814 std::map<std::string, std::string> getParameters;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
815 for (uint32_t i = 0; i < request->getCount; i++)
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 getParameters[request->getKeys[i]] = request->getValues[i];
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 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
821
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
822 LocalJavaObject joutput(env, env.ConstructJavaWrapper("be/uclouvain/orthanc/RestOutput", output));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
823 LocalJavaObject jmethod(env, env.ConstructEnumValue("be/uclouvain/orthanc/HttpMethod", request->method));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
824 LocalJavaObject juri(env, env.GetValue().NewStringUTF(uri == NULL ? "" : uri));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
825 std::unique_ptr<LocalJavaObject> jgroups(LocalJavaObject::CreateArrayOfStrings(env, groups));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
826 std::unique_ptr<LocalJavaObject> jheaders(LocalJavaObject::CreateDictionary(env, headers));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
827 std::unique_ptr<LocalJavaObject> jgetParameters(LocalJavaObject::CreateDictionary(env, getParameters));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
828 LocalJavaObject jbody(env, env.ConstructByteArray(request->bodySize, request->body));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
829
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
830 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
831 env.GetObjectClass(callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
832 "(Lbe/uclouvain/orthanc/RestOutput;Lbe/uclouvain/orthanc/HttpMethod;Ljava/lang/String;"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
833 "[Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;[B)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
834
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
835 env.GetValue().CallVoidMethod(callback, call, joutput.GetValue(), jmethod.GetValue(), juri.GetValue(),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
836 jgroups->GetValue(), jheaders->GetValue(), jgetParameters->GetValue(), jbody.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
837 env.CheckException();
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 return OrthancPluginErrorCode_Success;
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 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
842 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
843 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
844 return OrthancPluginErrorCode_Plugin;
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 catch (...)
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 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
849 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
850 }
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
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
853 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
854 OrthancPluginRestCallback GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
855 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
856 if (i == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
857 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
858 return Callback;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
859 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
860 else
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
861 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
862 return next_.GetCallback(i - 1);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
863 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
864 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
865 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
866
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
867 template<>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
868 class RestCallbacksPool<0>
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
869 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
870 public:
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
871 OrthancPluginRestCallback& GetCallback(size_t i)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
872 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
873 throw std::runtime_error("Out of tuple");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
874 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
875 };
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
876
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
877
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
878 static RestCallbacksPool<MAX_REST_CALLBACKS> restCallbacksPool_;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
879
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
880
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
881
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
882 OrthancPluginErrorCode OnChangeCallback(OrthancPluginChangeType changeType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
883 OrthancPluginResourceType resourceType,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
884 const char* resourceId)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
885 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
886 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
887 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
888 std::list<jobject> callbacks;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
889 callbacksConfiguration_->GetOnChangeCallbacks(callbacks);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
890
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
891 if (!callbacks.empty())
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
892 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
893 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
894
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
895 LocalJavaObject c(env, env.ConstructEnumValue("be/uclouvain/orthanc/ChangeType", changeType));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
896 LocalJavaObject r(env, env.ConstructEnumValue("be/uclouvain/orthanc/ResourceType", resourceType));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
897 LocalJavaObject s(env, env.GetValue().NewStringUTF(resourceId == NULL ? "" : resourceId));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
898
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
899 for (std::list<jobject>::const_iterator
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
900 callback = callbacks.begin(); callback != callbacks.end(); ++callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
901 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
902 assert(*callback != NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
903
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
904 jmethodID call = env.GetMethodID(
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
905 env.GetObjectClass(*callback), "call",
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
906 "(Lbe/uclouvain/orthanc/ChangeType;Lbe/uclouvain/orthanc/ResourceType;Ljava/lang/String;)V");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
907
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
908 env.GetValue().CallVoidMethod(*callback, call, c.GetValue(), r.GetValue(), s.GetValue());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
909 env.CheckException();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
910 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
911 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
912
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
913 return OrthancPluginErrorCode_Success;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
914 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
915 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
916 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
917 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
918 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
919 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
920 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
921 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
922 OrthancPluginLogError(context_, "Caught native exception");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
923 return OrthancPluginErrorCode_Plugin;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
924 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
925 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
926
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
927
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
928 JNIEXPORT void RegisterOnChangeCallback(JNIEnv* env, jobject sdkObject, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
929 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
930 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
931 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
932 callbacksConfiguration_->AddOnChangeCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
933 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
934 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
935 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
936 JavaEnvironment::ThrowException(env, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
937 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
938 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
939 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
940 JavaEnvironment::ThrowException(env, OrthancPluginErrorCode_Plugin);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
941 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
942 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
943
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
944
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
945 JNIEXPORT void RegisterOnRestRequestCallback(JNIEnv* env, jobject sdkObject, jstring regex, jobject callback)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
946 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
947 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
948 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
949 JavaString cregex(env, regex);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
950 size_t index = callbacksConfiguration_->AddOnRestRequestCallback(*java_, callback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
951 OrthancPluginRegisterRestCallbackNoLock(context_, cregex.GetValue(), restCallbacksPool_.GetCallback(index));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
952 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
953 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
954 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
955 JavaEnvironment::ThrowException(env, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
956 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
957 catch (...)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
958 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
959 JavaEnvironment::ThrowException(env, OrthancPluginErrorCode_Plugin);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
960 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
961 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
962
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
963
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
964 extern "C"
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
965 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
966 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
967 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
968 context_ = context;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
969
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
970 /* Check the version of the Orthanc core */
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
971 if (OrthancPluginCheckVersion(context) == 0)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
972 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
973 char info[1024];
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
974 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
975 context->orthancVersion,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
976 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
977 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
978 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
979 OrthancPluginLogError(context, info);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
980 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
981 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
982
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
983 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
984 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
985 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
986 // Sanity check to ensure that the compiler has created different callback functions
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
987 std::set<intptr_t> c;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
988 for (unsigned int i = 0; i < MAX_REST_CALLBACKS; i++)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
989 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
990 c.insert(reinterpret_cast<intptr_t>(restCallbacksPool_.GetCallback(i)));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
991 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
992
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
993 if (c.size() != MAX_REST_CALLBACKS)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
994 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
995 throw std::runtime_error("The Java plugin has not been properly compiled");
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
996 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
997 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
998
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
999 java_.reset(new JavaVirtualMachine("TODO"));
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1000
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1001 callbacksConfiguration_.reset(new CallbacksConfiguration);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1002 OrthancPluginRegisterOnChangeCallback(context_, OnChangeCallback);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1003
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1004 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1005
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1006 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1007 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1008 JNI_LoadNatives(methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1009 env.RegisterNatives("be/uclouvain/orthanc/NativeSDK", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1010 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1011
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1012 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1013 std::vector<JNINativeMethod> methods;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1014 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1015 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1016 const_cast<char*>("(Lbe/uclouvain/orthanc/Callbacks$OnChange;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1017 (void*) RegisterOnChangeCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1018 methods.push_back((JNINativeMethod) {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1019 const_cast<char*>("register"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1020 const_cast<char*>("(Ljava/lang/String;Lbe/uclouvain/orthanc/Callbacks$OnRestRequest;)V"),
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1021 (void*) RegisterOnRestRequestCallback });
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1022 env.RegisterNatives("be/uclouvain/orthanc/Callbacks", methods);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1023 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1024 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1025 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1026 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1027 OrthancPluginLogError(context, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1028 return -1;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1029 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1030
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1031 return 0;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1032 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1033
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1034
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1035 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1036 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1037 if (java_.get() != NULL)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1038 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1039 callbacksConfiguration_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1040
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1041 try
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1042 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1043 JavaEnvironment env(*java_);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1044 env.RunGarbageCollector();
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1045 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1046 catch (std::runtime_error& e)
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1047 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1048 OrthancPluginLogError(context_, e.what());
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1049 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1050
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1051 java_.reset(NULL);
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1052 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1053 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1054
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1055
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1056 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1057 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1058 return "java";
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1059 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1060
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1061
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1062 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1063 {
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1064 return PLUGIN_VERSION;
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1065 }
3ecef5782f2c initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1066 }