JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_killContextQuery (JNIEnv *env, jclass clz, jlong pQueryEngineInstance, jint cqid) { IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance; if (pQueryEngine->killContextQuery(cqid) != SSM_S_OK) { env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "KillContextQuery failed"); } }
JNIEXPORT void JNICALL Java_org_iotivity_service_ssm_CoreController_registerQueryEvent (JNIEnv *env, jclass clz, jlong pQueryEngineInstance, jobject queryEngineEvent) { IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance; if (queryEngineEvent == NULL) { pQueryEngine->unregisterQueryEvent(g_QueryEngineEventReceiver); return; } g_QueryEngineEventReceiver->setQueryEngineEventObj(env->NewGlobalRef(queryEngineEvent)); pQueryEngine->registerQueryEvent(g_QueryEngineEventReceiver); }
JNIEXPORT jint JNICALL Java_org_iotivity_service_ssm_CoreController_executeContextQuery (JNIEnv *env, jclass clz, jlong pQueryEngineInstance, jstring jstrContextQuery) { int cqid = -1; if (jstrContextQuery == NULL) { env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "ExecuteContextQuery with Invalid context query"); return cqid; } IQueryEngine *pQueryEngine = (IQueryEngine *)pQueryEngineInstance; const char *contextQuery = env->GetStringUTFChars(jstrContextQuery, NULL); if (pQueryEngine->executeContextQuery(contextQuery, &cqid) != SSM_S_OK) { env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "ExecuteContextQuery failed"); } env->ReleaseStringUTFChars(jstrContextQuery, contextQuery); return cqid; }
OCEntityHandlerResult SSMResourceServer::entityHandler(std::shared_ptr< OCResourceRequest > request) { SSMRESULT res = SSM_E_FAIL; auto response = std::make_shared<OC::OCResourceResponse>(); if (request) { // Get the request type and request flag std::string requestType = request->getRequestType(); int requestFlag = request->getRequestHandlerFlag(); response->setRequestHandle(request->getRequestHandle()); response->setResourceHandle(request->getResourceHandle()); if (requestFlag & RequestHandlerFlag::InitFlag) { // entity handler to perform resource initialization operations } if (requestFlag & RequestHandlerFlag::RequestFlag) { cout << "\t\trequestFlag : Request\n"; // If the request type is GET if (requestType == "GET") { std::map<std::string, std::string> responseAttributeMap; OCRepresentation rep = request->getResourceRepresentation(); if (g_vecQueryEventResults.size() > 0) { responseAttributeMap = g_vecQueryEventResults.front(); g_vecQueryEventResults.erase(g_vecQueryEventResults.begin()); } if (response) { for (std::map<std::string, std::string>::iterator itor = responseAttributeMap.begin(); itor != responseAttributeMap.end(); ++itor) { rep.setValue(itor->first, itor->second); } response->setErrorCode(200); response->setResourceRepresentation(rep, DEFAULT_INTERFACE); } } else if (requestType == "PUT") { OCRepresentation rep = request->getResourceRepresentation(); IQueryEngine *pQueryEngine = NULL; std::stringstream sstream; // Process query params and do required operations .. if (rep.getValue<std::string>("command") == "CreateQueryEngine") { CQueryEngineEvent *queryEngineEvent = NULL; res = CreateQueryEngine(&pQueryEngine); if (res != SSM_S_OK) { rep.setValue("error", "CreateQueryEngine failed"); goto CLEANUP; } sstream << reinterpret_cast<intptr_t>(pQueryEngine); // Register QueryEngineEvent queryEngineEvent = new CQueryEngineEvent(sstream.str(), m_hSSMResource); if (queryEngineEvent == NULL) { rep.setValue("error", "QueryEngineEvent create failed"); goto CLEANUP; } res = pQueryEngine->registerQueryEvent(queryEngineEvent); if (res != SSM_S_OK) { rep.setValue("error", "RegisterQueryEvent failed"); goto CLEANUP; } rep.setValue("queryEngineId", sstream.str()); } else if (rep.getValue<std::string>("command") == "ReleaseQueryEngine") { pQueryEngine = (IQueryEngine *) std::stoi( rep.getValue<std::string>("queryEngineId")); ReleaseQueryEngine(pQueryEngine); } else if (rep.getValue<std::string>("command") == "ExecuteContextQuery") { int CQID = 0; pQueryEngine = (IQueryEngine *) std::stoi( rep.getValue<std::string>("queryEngineId")); res = pQueryEngine->executeContextQuery( rep.getValue<std::string>("contextQuery"), &CQID); if (res != SSM_S_OK) { rep.setValue("error", "ExecuteContextQuery failed"); goto CLEANUP; } sstream << CQID; rep.setValue("CQID", sstream.str()); } else if (rep.getValue<std::string>("command") == "KillContextQuery") { pQueryEngine = (IQueryEngine *) std::stoi( rep.getValue<std::string>("queryEngineId")); res = pQueryEngine->killContextQuery(std::stoi(rep.getValue<std::string>("CQID"))); if (res != SSM_S_OK) { rep.setValue("error", "KillContextQuery failed"); goto CLEANUP; } } CLEANUP: if (response) { response->setErrorCode(200); response->setResourceRepresentation(rep, DEFAULT_INTERFACE); } } else if (requestType == "POST") { // POST request operations } else if (requestType == "DELETE") { // DELETE request operations } } if (requestFlag & RequestHandlerFlag::ObserverFlag) { // perform observe related operations on the resource. } } return OCPlatform::sendResponse(response) == OC_STACK_OK ? OC_EH_OK : OC_EH_ERROR; }