1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "SSMInterface/SSMCore_JNI.h"
23 #include "Common/PlatformLayer.h"
25 #define JNI_E_INVALIDARG -1001
26 #define JNI_E_METHODID -1002
31 #define ATTACH_CURRENT_THREAD(javaVM, env) if(env == NULL) javaVM->AttachCurrentThread((void**)&env, NULL)
33 #define ATTACH_CURRENT_THREAD(javaVM, env) if(env == NULL) javaVM->AttachCurrentThread(&env, NULL)
35 #define DETACH_CURRENT_THREAD(javaVM) javaVM->DetachCurrentThread()
37 jclass g_ClassQueryEngine = NULL;
38 jclass g_ClassDataReader = NULL;
39 jclass g_ClassModelData = NULL;
40 jclass g_ClassQueryEngineEvent = NULL;
41 jclass g_ClassReportReceiver = NULL;
42 jobject g_objReportReceiver = NULL;
44 void ReportMessage(const char *tag, const char *msg)
48 if (g_objReportReceiver == NULL)
51 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
53 ATTACH_CURRENT_THREAD(g_JVM, env);
55 jmethodID midReportReceiver =
56 env->GetMethodID(g_ClassReportReceiver, "onMessageReceived",
57 "(Ljava/lang/String;Ljava/lang/String;)V");
59 env->CallVoidMethod(g_objReportReceiver, midReportReceiver,
60 env->NewStringUTF(tag), env->NewStringUTF(msg));
62 DETACH_CURRENT_THREAD(g_JVM);
67 class QueryEngineEventReceiver
68 : public IQueryEngineEvent
71 jobject m_objQueryEngineEvent;
74 QueryEngineEventReceiver()
76 m_objQueryEngineEvent = NULL;
79 ~QueryEngineEventReceiver()
81 if (m_objQueryEngineEvent != NULL)
84 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
85 env->DeleteGlobalRef(m_objQueryEngineEvent);
89 void setQueryEngineEventObj(jobject objQueryEngineEvent)
91 if (m_objQueryEngineEvent != NULL)
94 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
95 env->DeleteGlobalRef(m_objQueryEngineEvent);
98 m_objQueryEngineEvent = objQueryEngineEvent;
101 SSMRESULT onQueryEngineEvent(int cqid, IDataReader *pResult)
104 g_JVM->GetEnv((void **) &env, JNI_VERSION_1_6);
106 ATTACH_CURRENT_THREAD(g_JVM, env);
108 jmethodID midQueryEngineEvent =
109 env->GetMethodID(g_ClassQueryEngineEvent, "onQueryEngineEvent",
110 "(ILorg/iotivity/service/ssm/DataReader;)V");
112 jmethodID cid_DataReader = env->GetMethodID(g_ClassDataReader, "<init>", "(I)V");
114 if (cid_DataReader == NULL)
117 env->CallVoidMethod(m_objQueryEngineEvent, midQueryEngineEvent,
119 env->NewObject(g_ClassDataReader, cid_DataReader, (jint)pResult));
121 DETACH_CURRENT_THREAD(g_JVM);
127 QueryEngineEventReceiver *g_QueryEngineEventReceiver = NULL;
129 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
132 if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)
135 g_ClassQueryEngine = (jclass) env->NewGlobalRef(
136 env->FindClass("org/iotivity/service/ssm/QueryEngine"));
138 g_ClassDataReader = (jclass) env->NewGlobalRef(
139 env->FindClass("org/iotivity/service/ssm/DataReader"));
141 g_ClassModelData = (jclass) env->NewGlobalRef(env->FindClass("org/iotivity/service/ssm/ModelData"));
143 g_ClassQueryEngineEvent = (jclass) env->NewGlobalRef(
144 env->FindClass("org/iotivity/service/ssm/IQueryEngineEvent"));
147 g_ClassReportReceiver = (jclass) env->NewGlobalRef(
148 env->FindClass("org/iotivity/service/ssm/IReportReceiver"));
153 g_QueryEngineEventReceiver = new QueryEngineEventReceiver();
155 return JNI_VERSION_1_6;
158 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
161 if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)
164 if (g_ClassQueryEngine != NULL)
165 env->DeleteGlobalRef(g_ClassQueryEngine);
167 if (g_ClassDataReader != NULL)
168 env->DeleteGlobalRef(g_ClassDataReader);
170 if (g_ClassModelData != NULL)
171 env->DeleteGlobalRef(g_ClassModelData);
173 if (g_ClassQueryEngineEvent != NULL)
174 env->DeleteGlobalRef(g_ClassQueryEngineEvent);
177 if (g_ClassReportReceiver != NULL)
178 env->DeleteGlobalRef(g_ClassReportReceiver);
180 if (g_objReportReceiver != NULL)
181 env->DeleteGlobalRef(g_objReportReceiver);
186 if (g_QueryEngineEventReceiver != NULL)
187 delete g_QueryEngineEventReceiver;
190 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_initializeSSMCore
191 (JNIEnv *env, jclass clz, jstring jstrXmlDescription)
193 if (jstrXmlDescription == NULL)
195 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"),
196 "InitializeSSMCore failed with Invalid parameter");
200 SSMRESULT res = SSM_E_FAIL;
201 const char *xmlDescription = env->GetStringUTFChars(jstrXmlDescription, NULL);
203 res = InitializeSSMCore(xmlDescription);
205 env->ReleaseStringUTFChars(jstrXmlDescription, xmlDescription);
208 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "InitializeSSMCore failed");
211 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_startSSMCore
212 (JNIEnv *env, jclass clz)
214 if (StartSSMCore() != SSM_S_OK)
215 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "StartSSMCore failed");
218 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_stopSSMCore
219 (JNIEnv *env, jclass clz)
221 if (StopSSMCore() != SSM_S_OK)
222 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "StopSSMCore failed");
225 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_terminateSSMCore
226 (JNIEnv *env, jclass clz)
228 if (TerminateSSMCore() != SSM_S_OK)
229 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "TerminateSSMCore failed");
232 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_createQueryEngine
233 (JNIEnv *env, jclass clz)
235 IQueryEngine *pQueryEngine = NULL;
237 if (CreateQueryEngine(&pQueryEngine) != SSM_S_OK)
239 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "CreateQueryEngine failed");
243 jmethodID cid_QueryEngine = env->GetMethodID(g_ClassQueryEngine, "<init>", "(I)V");
245 if (cid_QueryEngine == NULL)
248 return env->NewObject(g_ClassQueryEngine, cid_QueryEngine, (jint)pQueryEngine);
251 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_releaseQueryEngine
252 (JNIEnv *env, jclass clz, jobject queryEngine)
254 IQueryEngine *pQueryEngine = NULL;
256 jmethodID mid_GetQueryEngineInstance = env->GetMethodID(g_ClassQueryEngine,
257 "getQueryEngineInstance", "()I");
259 if (mid_GetQueryEngineInstance == NULL)
260 return JNI_E_METHODID;
262 pQueryEngine = (IQueryEngine *)env->CallIntMethod(queryEngine, mid_GetQueryEngineInstance);
264 return ReleaseQueryEngine(pQueryEngine);
267 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_executeContextQuery
268 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jstring jstrContextQuery)
271 if (jstrContextQuery == NULL)
273 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"),
274 "ExecuteContextQuery with Invalid context query");
278 IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
280 const char *contextQuery = env->GetStringUTFChars(jstrContextQuery, NULL);
282 if (pQueryEngine->executeContextQuery(contextQuery, &cqid) != SSM_S_OK)
284 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "ExecuteContextQuery failed");
287 env->ReleaseStringUTFChars(jstrContextQuery, contextQuery);
291 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_registerQueryEvent
292 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jobject queryEngineEvent)
294 IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
296 if (queryEngineEvent == NULL)
298 pQueryEngine->unregisterQueryEvent(g_QueryEngineEventReceiver);
302 g_QueryEngineEventReceiver->setQueryEngineEventObj(env->NewGlobalRef(queryEngineEvent));
303 pQueryEngine->registerQueryEvent(g_QueryEngineEventReceiver);
306 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_killContextQuery
307 (JNIEnv *env, jclass clz, jint pQueryEngineInstance, jint cqid)
309 IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance;
311 if (pQueryEngine->killContextQuery(cqid) != SSM_S_OK)
313 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "KillContextQuery failed");
317 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getDataId
318 (JNIEnv *env, jclass clz, jint pDataReaderInstance)
320 IModelData *pDataReader = (IModelData *)pDataReaderInstance;
322 return pDataReader->getDataId();
325 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyCount
326 (JNIEnv *env, jclass clz, jint pIModelDataInstance )
328 IModelData *pModelData = (IModelData *)pIModelDataInstance;
330 return pModelData->getPropertyCount();
333 JNIEXPORT jstring JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyName
334 (JNIEnv *env, jclass clz, jint pIModelDataInstance, jint propertyIndex )
336 IModelData *pModelData = (IModelData *)pIModelDataInstance;
338 return env->NewStringUTF(pModelData->getPropertyName(propertyIndex).c_str());
341 JNIEXPORT jstring JNICALL Java_org_iotivity_service_ssm_CoreController_getPropertyValue
342 (JNIEnv *env, jclass clz, jint pIModelDataInstance, jint propertyIndex )
344 IModelData *pModelData = (IModelData *)pIModelDataInstance;
346 return env->NewStringUTF(pModelData->getPropertyValue(propertyIndex).c_str());
349 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_getAffectedModels
350 (JNIEnv *env, jclass clz, jint pDataReaderInstance)
352 IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
353 std::vector<std::string> affectedModels;
355 jclass listClass = env->FindClass("java/util/ArrayList");
357 jmethodID add_mid = env->GetMethodID(listClass, "add", "(Ljava/lang/Object;)Z");
359 jmethodID list_cid = env->GetMethodID(listClass, "<init>", "()V");
361 jobject objAffectedModels = env->NewObject(listClass, list_cid);
363 pDataReader->getAffectedModels(&affectedModels);
365 for (std::vector<std::string>::iterator itor = affectedModels.begin();
366 itor != affectedModels.end(); ++itor)
368 env->CallBooleanMethod(objAffectedModels, add_mid, env->NewStringUTF((*itor).c_str()));
371 return objAffectedModels;
374 JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_getModelDataCount
375 (JNIEnv *env, jclass clz, jint pDataReaderInstance, jstring jstrModelName)
377 IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
379 const char *modelName = env->GetStringUTFChars(jstrModelName, NULL);
381 if (pDataReader->getModelDataCount(modelName, &modelCount) != SSM_S_OK)
383 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "GetModelDataCount failed");
386 env->ReleaseStringUTFChars(jstrModelName, modelName);
391 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ssm_CoreController_getModelData
392 (JNIEnv *env, jclass clz, jint pDataReaderInstance, jstring jstrModelName, jint jintDataIndex )
394 IDataReader *pDataReader = (IDataReader *)pDataReaderInstance;
395 IModelData *pModelData = NULL;
396 const char *modelName = env->GetStringUTFChars(jstrModelName, NULL);
398 if (pDataReader->getModelData(modelName, jintDataIndex, &pModelData) != SSM_S_OK)
400 env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "GetModelData failed");
404 jmethodID cid_ModelData = env->GetMethodID(g_ClassModelData, "<init>", "(I)V");
406 if (cid_ModelData == NULL)
409 return env->NewObject(g_ClassModelData, cid_ModelData, (jint)pModelData);
412 JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_registerReportReceiver
413 (JNIEnv *env, jclass clz, jobject reportReceiver)
415 if (g_objReportReceiver != NULL)
416 env->DeleteGlobalRef(g_objReportReceiver);
418 g_objReportReceiver = NULL;
420 if (reportReceiver != NULL)
421 g_objReportReceiver = env->NewGlobalRef(reportReceiver);