/carrot-jdk6-jnlp-windows/src/plugin/share/plugin2/common/AbstractPlugin.cpp

https://github.com/carrot-garden/carrot-jnlper · C++ · 317 lines · 282 code · 29 blank · 6 comment · 47 complexity · f3a0f36ce9321ed74e78d2901d93ce74 MD5 · raw file

  1. /*
  2. * @(#)AbstractPlugin.cpp 1.3 10/03/24 12:03:38
  3. *
  4. * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
  5. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. #include "AbstractPlugin.h"
  8. #include "JavaVM.h"
  9. #include "JNIExceptions.h"
  10. bool AbstractPlugin::initialized = false;
  11. jmethodID AbstractPlugin::newBooleanID = NULL;
  12. jmethodID AbstractPlugin::newByteID = NULL;
  13. jmethodID AbstractPlugin::newCharacterID = NULL;
  14. jmethodID AbstractPlugin::newShortID = NULL;
  15. jmethodID AbstractPlugin::newIntegerID = NULL;
  16. jmethodID AbstractPlugin::newLongID = NULL;
  17. jmethodID AbstractPlugin::newFloatID = NULL;
  18. jmethodID AbstractPlugin::newDoubleID = NULL;
  19. jmethodID AbstractPlugin::wrapOrUnwrapScriptingObjectID = NULL;
  20. jmethodID AbstractPlugin::getScriptingObjectForAppletID = NULL;
  21. jmethodID AbstractPlugin::getJavaNameSpaceID = NULL;
  22. jmethodID AbstractPlugin::javaObjectInvokeID = NULL;
  23. jmethodID AbstractPlugin::javaObjectInvokeConstructorID = NULL;
  24. jmethodID AbstractPlugin::javaObjectGetFieldID = NULL;
  25. jmethodID AbstractPlugin::javaObjectSetFieldID = NULL;
  26. jmethodID AbstractPlugin::javaObjectRemoveFieldID = NULL;
  27. jmethodID AbstractPlugin::javaObjectHasFieldID = NULL;
  28. jmethodID AbstractPlugin::javaObjectHasMethodID = NULL;
  29. jmethodID AbstractPlugin::releaseRemoteJavaObjectID = NULL;
  30. jmethodID AbstractPlugin::runnableRunID = NULL;
  31. bool AbstractPlugin::initialize() {
  32. if (initialized) {
  33. return true;
  34. }
  35. JNIEnv* env = JavaVM_GetJNIEnv();
  36. if (env == NULL)
  37. return false;
  38. jclass absPluginClass = env->FindClass("sun/plugin2/main/server/AbstractPlugin");
  39. if (absPluginClass == NULL)
  40. return false;
  41. newBooleanID = env->GetMethodID(absPluginClass, "newBoolean", "(Z)Ljava/lang/Boolean;");
  42. newByteID = env->GetMethodID(absPluginClass, "newByte", "(B)Ljava/lang/Byte;");
  43. newCharacterID = env->GetMethodID(absPluginClass, "newCharacter", "(C)Ljava/lang/Character;");
  44. newShortID = env->GetMethodID(absPluginClass, "newShort", "(S)Ljava/lang/Short;");
  45. newIntegerID = env->GetMethodID(absPluginClass, "newInteger", "(I)Ljava/lang/Integer;");
  46. newLongID = env->GetMethodID(absPluginClass, "newLong", "(J)Ljava/lang/Long;");
  47. newFloatID = env->GetMethodID(absPluginClass, "newFloat", "(F)Ljava/lang/Float;");
  48. newDoubleID = env->GetMethodID(absPluginClass, "newDouble", "(D)Ljava/lang/Double;");
  49. wrapOrUnwrapScriptingObjectID = env->GetMethodID(absPluginClass, "wrapOrUnwrapScriptingObject", "(J)Ljava/lang/Object;");
  50. getScriptingObjectForAppletID = env->GetMethodID(absPluginClass, "getScriptingObjectForApplet", "(J)J");
  51. getJavaNameSpaceID = env->GetMethodID(absPluginClass, "getJavaNameSpace", "(Ljava/lang/String;)Ljava/lang/Object;");
  52. javaObjectInvokeID = env->GetMethodID(absPluginClass, "javaObjectInvoke", "(Lsun/plugin2/liveconnect/RemoteJavaObject;ZJJIJJ)Z");
  53. javaObjectInvokeConstructorID = env->GetMethodID(absPluginClass, "javaObjectInvokeConstructor", "(Lsun/plugin2/liveconnect/RemoteJavaObject;ZJIJJ)Z");
  54. javaObjectGetFieldID = env->GetMethodID(absPluginClass, "javaObjectGetField", "(Lsun/plugin2/liveconnect/RemoteJavaObject;ZJJJ)Z");
  55. javaObjectSetFieldID = env->GetMethodID(absPluginClass, "javaObjectSetField", "(Lsun/plugin2/liveconnect/RemoteJavaObject;ZJJJ)Z");
  56. javaObjectRemoveFieldID = env->GetMethodID(absPluginClass, "javaObjectRemoveField", "(Lsun/plugin2/liveconnect/RemoteJavaObject;JJ)V");
  57. javaObjectHasFieldID = env->GetMethodID(absPluginClass, "javaObjectHasField", "(Lsun/plugin2/liveconnect/RemoteJavaObject;J)Z");
  58. javaObjectHasMethodID = env->GetMethodID(absPluginClass, "javaObjectHasMethod", "(Lsun/plugin2/liveconnect/RemoteJavaObject;J)Z");
  59. releaseRemoteJavaObjectID = env->GetMethodID(absPluginClass, "releaseRemoteJavaObject", "(Lsun/plugin2/liveconnect/RemoteJavaObject;)V");
  60. runnableRunID = env->GetMethodID(env->FindClass("java/lang/Runnable"), "run", "()V");
  61. CHECK_EXCEPTION_VAL(env, false);
  62. initialized = true;
  63. return true;
  64. }
  65. jobject AbstractPlugin::newBoolean(JNIEnv* env, jobject javaPluginInstance, jboolean value) {
  66. if (javaPluginInstance == NULL) {
  67. return NULL;
  68. }
  69. jobject res = env->CallObjectMethod(javaPluginInstance, newBooleanID, value);
  70. CHECK_EXCEPTION_VAL(env, NULL);
  71. return res;
  72. }
  73. jobject AbstractPlugin::newByte(JNIEnv* env, jobject javaPluginInstance, jbyte value) {
  74. if (javaPluginInstance == NULL) {
  75. return NULL;
  76. }
  77. jobject res = env->CallObjectMethod(javaPluginInstance, newByteID, value);
  78. CHECK_EXCEPTION_VAL(env, NULL);
  79. return res;
  80. }
  81. jobject AbstractPlugin::newCharacter(JNIEnv* env, jobject javaPluginInstance, jchar value) {
  82. if (javaPluginInstance == NULL) {
  83. return NULL;
  84. }
  85. jobject res = env->CallObjectMethod(javaPluginInstance, newCharacterID, value);
  86. CHECK_EXCEPTION_VAL(env, NULL);
  87. return res;
  88. }
  89. jobject AbstractPlugin::newShort(JNIEnv* env, jobject javaPluginInstance, jshort value) {
  90. if (javaPluginInstance == NULL) {
  91. return NULL;
  92. }
  93. jobject res = env->CallObjectMethod(javaPluginInstance, newShortID, value);
  94. CHECK_EXCEPTION_VAL(env, NULL);
  95. return res;
  96. }
  97. jobject AbstractPlugin::newInteger(JNIEnv* env, jobject javaPluginInstance, jint value) {
  98. if (javaPluginInstance == NULL) {
  99. return NULL;
  100. }
  101. jobject res = env->CallObjectMethod(javaPluginInstance, newIntegerID, value);
  102. CHECK_EXCEPTION_VAL(env, NULL);
  103. return res;
  104. }
  105. jobject AbstractPlugin::newLong(JNIEnv* env, jobject javaPluginInstance, jlong value) {
  106. if (javaPluginInstance == NULL) {
  107. return NULL;
  108. }
  109. jobject res = env->CallObjectMethod(javaPluginInstance, newLongID, value);
  110. CHECK_EXCEPTION_VAL(env, NULL);
  111. return res;
  112. }
  113. jobject AbstractPlugin::newFloat(JNIEnv* env, jobject javaPluginInstance, jfloat value) {
  114. if (javaPluginInstance == NULL) {
  115. return NULL;
  116. }
  117. jobject res = env->CallObjectMethod(javaPluginInstance, newFloatID, value);
  118. CHECK_EXCEPTION_VAL(env, NULL);
  119. return res;
  120. }
  121. jobject AbstractPlugin::newDouble(JNIEnv* env, jobject javaPluginInstance, jdouble value) {
  122. if (javaPluginInstance == NULL) {
  123. return NULL;
  124. }
  125. jobject res = env->CallObjectMethod(javaPluginInstance, newDoubleID, value);
  126. CHECK_EXCEPTION_VAL(env, NULL);
  127. return res;
  128. }
  129. jobject AbstractPlugin::wrapOrUnwrapScriptingObject(JNIEnv* env,
  130. jobject javaPluginInstance,
  131. jlong scriptingObject) {
  132. if (javaPluginInstance == NULL) {
  133. return NULL;
  134. }
  135. jobject res = env->CallObjectMethod(javaPluginInstance, wrapOrUnwrapScriptingObjectID, scriptingObject);
  136. CHECK_EXCEPTION_VAL(env, NULL);
  137. return res;
  138. }
  139. jlong AbstractPlugin::getScriptingObjectForApplet(jobject javaPluginInstance,
  140. jlong exceptionInfo) {
  141. if (javaPluginInstance == NULL) {
  142. return NULL;
  143. }
  144. JNIEnv* env = JavaVM_GetJNIEnv();
  145. jlong res = env->CallLongMethod(javaPluginInstance, getScriptingObjectForAppletID, exceptionInfo);
  146. CHECK_EXCEPTION_VAL(env, NULL);
  147. return res;
  148. }
  149. jobject AbstractPlugin::getJavaNameSpace(jobject javaPluginInstance,
  150. const char* namespaceUTF8) {
  151. if (javaPluginInstance == NULL) {
  152. return NULL;
  153. }
  154. if (namespaceUTF8 == NULL) {
  155. return NULL;
  156. }
  157. JNIEnv* env = JavaVM_GetJNIEnv();
  158. jstring nameSpace = env->NewStringUTF(namespaceUTF8);
  159. jobject res = env->CallObjectMethod(javaPluginInstance, getJavaNameSpaceID, nameSpace);
  160. CHECK_EXCEPTION_VAL(env, NULL);
  161. return env->NewGlobalRef(res);
  162. }
  163. bool AbstractPlugin::javaObjectInvoke(jobject javaPluginInstance,
  164. jobject javaObject,
  165. jboolean objectIsApplet,
  166. jlong methodIdentifier,
  167. jlong variantArgs,
  168. jint argCount,
  169. jlong variantResult,
  170. jlong exceptionInfo) {
  171. if (javaPluginInstance == NULL) {
  172. return false;
  173. }
  174. JNIEnv* env = JavaVM_GetJNIEnv();
  175. return (bool) env->CallBooleanMethod(javaPluginInstance, javaObjectInvokeID,
  176. javaObject, objectIsApplet,
  177. methodIdentifier,
  178. variantArgs, argCount,
  179. variantResult,
  180. exceptionInfo);
  181. }
  182. bool AbstractPlugin::javaObjectInvokeConstructor(jobject javaPluginInstance,
  183. jobject javaObject,
  184. jboolean objectIsApplet,
  185. jlong variantArgs,
  186. jint argCount,
  187. jlong variantResult,
  188. jlong exceptionInfo) {
  189. if (javaPluginInstance == NULL) {
  190. return false;
  191. }
  192. JNIEnv* env = JavaVM_GetJNIEnv();
  193. return (bool) env->CallBooleanMethod(javaPluginInstance, javaObjectInvokeConstructorID,
  194. javaObject, objectIsApplet,
  195. variantArgs, argCount,
  196. variantResult,
  197. exceptionInfo);
  198. }
  199. bool AbstractPlugin::javaObjectGetField(jobject javaPluginInstance,
  200. jobject javaObject,
  201. jboolean objectIsApplet,
  202. jlong fieldIdentifier,
  203. jlong variantResult,
  204. jlong exceptionInfo) {
  205. if (javaPluginInstance == NULL) {
  206. return false;
  207. }
  208. JNIEnv* env = JavaVM_GetJNIEnv();
  209. return (bool) env->CallBooleanMethod(javaPluginInstance,
  210. javaObjectGetFieldID,
  211. javaObject, objectIsApplet,
  212. fieldIdentifier,
  213. variantResult,
  214. exceptionInfo);
  215. }
  216. bool AbstractPlugin::javaObjectSetField(jobject javaPluginInstance,
  217. jobject javaObject,
  218. jboolean objectIsApplet,
  219. jlong fieldIdentifier,
  220. jlong variantValue,
  221. jlong exceptionInfo) {
  222. if (javaPluginInstance == NULL) {
  223. return false;
  224. }
  225. JNIEnv* env = JavaVM_GetJNIEnv();
  226. return (bool) env->CallBooleanMethod(javaPluginInstance,
  227. javaObjectSetFieldID,
  228. javaObject, objectIsApplet,
  229. fieldIdentifier,
  230. variantValue,
  231. exceptionInfo);
  232. }
  233. void AbstractPlugin::javaObjectRemoveField(jobject javaPluginInstance,
  234. jobject javaObject,
  235. jlong fieldIdentifier,
  236. jlong exceptionInfo) {
  237. if (javaPluginInstance == NULL) {
  238. return;
  239. }
  240. JNIEnv* env = JavaVM_GetJNIEnv();
  241. return env->CallVoidMethod(javaPluginInstance,
  242. javaObjectRemoveFieldID,
  243. javaObject,
  244. fieldIdentifier,
  245. exceptionInfo);
  246. }
  247. bool AbstractPlugin::javaObjectHasField(jobject javaPluginInstance,
  248. jobject javaObject,
  249. jlong fieldIdentifier) {
  250. if (javaPluginInstance == NULL) {
  251. return false;
  252. }
  253. JNIEnv* env = JavaVM_GetJNIEnv();
  254. return (bool) env->CallBooleanMethod(javaPluginInstance,
  255. javaObjectHasFieldID,
  256. javaObject,
  257. fieldIdentifier);
  258. }
  259. bool AbstractPlugin::javaObjectHasMethod(jobject javaPluginInstance,
  260. jobject javaObject,
  261. jlong methodIdentifier) {
  262. if (javaPluginInstance == NULL) {
  263. return false;
  264. }
  265. JNIEnv* env = JavaVM_GetJNIEnv();
  266. return (bool) env->CallBooleanMethod(javaPluginInstance,
  267. javaObjectHasMethodID,
  268. javaObject,
  269. methodIdentifier);
  270. }
  271. void AbstractPlugin::releaseRemoteJavaObject(jobject javaPluginInstance,
  272. jobject remoteObject) {
  273. if (javaPluginInstance == NULL) {
  274. return;
  275. }
  276. JNIEnv* env = JavaVM_GetJNIEnv();
  277. env->CallVoidMethod(javaPluginInstance, releaseRemoteJavaObjectID, remoteObject);
  278. env->DeleteGlobalRef(remoteObject);
  279. CLEAR_EXCEPTION(env);
  280. }
  281. void AbstractPlugin::runRunnable(jobject runnable) {
  282. if (runnable == NULL) {
  283. return;
  284. }
  285. JNIEnv* env = JavaVM_GetJNIEnv();
  286. env->CallVoidMethod(runnable, runnableRunID);
  287. CLEAR_EXCEPTION(env);
  288. }