void get_resource_uri(char *URI, char *resourceURI, int length);
int get_secure_information(CAPayload_t payLoad);
CAResult_t get_network_type(int selectedNetwork);
-void callback(char *subject, char *receicedData);
+void callback(char *subject, char *receivedData);
CAConnectivityType_t gSelectedNwType;
static CAToken_t gLastRequestToken = NULL;
static jobject gResponseListenerObject = NULL;
extern JavaVM *g_jvm;
+static CARemoteEndpoint_t* clientEndpoint =NULL;
+static CAToken_t clientToken;
+
// init
JNIEXPORT void JNICALL Java_com_iotivity_service_RMInterface_setNativeResponseListener(JNIEnv *env, jobject obj, jobject listener){
LOGI("setNativeResponseListener");
}
#endif
+JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
+{
+ printf("JNI_OnLoad");
+
+ JNIEnv* env;
+ if((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK)
+ {
+ return -1;
+ }
+ g_jvm = jvm; /* cache the JavaVM pointer */
+
+ CANativeJNISetJavaVM(g_jvm);
+
+ return JNI_VERSION_1_6;
+}
+
+void JNI_OnUnload(JavaVM *jvm, void *reserved)
+{
+ printf("JNI_OnUnload");
+
+ JNIEnv* env;
+ if((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK)
+ {
+ return;
+ }
+ g_jvm = 0;
+ return;
+}
+
JNIEXPORT void JNICALL Java_com_iotivity_service_RMInterface_RMInitialize
(JNIEnv *env, jobject obj, jobject context)
{
LOGI("RMInitialize");
- //Currently set context for WiFiCore
- CAJniSetContext(context);
- CALEServerJNISetContext(env, context);
- CALEClientJNISetContext(env, context);
- CALENetworkMonitorJNISetContext(env, context);
+
+ //Currently set context for Android Platform
+ CANativeJNISetContext(env, context);
CAResult_t res;
}
JNIEXPORT void JNICALL Java_com_iotivity_service_RMInterface_RMSendResponse(JNIEnv *env,
- jobject obj, jstring uri, jstring payload, jint selectedNetwork, jint isSecured)
+ jobject obj, jint selectedNetwork, jint isSecured, jint msgType, jint responseValue)
{
LOGI("RMSendResponse");
- const char* strUri = (*env)->GetStringUTFChars(env, uri, NULL);
- LOGI("RMSendResponse - %s", strUri);
-
CAResult_t res;
LOGI("selectedNetwork - %d", selectedNetwork);
return;
}
- //create remote endpoint
- CARemoteEndpoint_t* endpoint = NULL;
-
- if(CA_STATUS_OK != CACreateRemoteEndpoint((const CAURI_t)strUri, gSelectedNwType, &endpoint))
+ if (clientEndpoint == NULL)
{
- LOGI("Could not create remote end point");
- CADestroyRemoteEndpoint(endpoint);
+ LOGI("No Request received");
return;
}
- CAMessageType_t messageType = CA_MSG_ACKNOWLEDGE;
-
- // create token
- CAToken_t token = NULL;
- res = CAGenerateToken(&token);
- if (res != CA_STATUS_OK)
- {
- LOGI("token generate error!");
- token = NULL;
- }
-
- char resourceURI[15] = {0};
-
- get_resource_uri((const CAURI_t)strUri, resourceURI, 14);
+ CAMessageType_t messageType = msgType;
CAInfo_t responseData;
memset(&responseData, 0, sizeof(CAInfo_t));
- responseData.token = token;
+ responseData.token = clientToken;
- const char* strPayload = (*env)->GetStringUTFChars(env, payload, NULL);
if (isSecured == 1)
{
- int length = strlen(gSecureInfoData) + strlen(resourceURI) + 1;
+ int length = strlen(gSecureInfoData) + strlen(clientEndpoint->resourceUri) + 1;
responseData.payload = (CAPayload_t) malloc(length);
- sprintf(responseData.payload, gSecureInfoData, resourceURI, gLocalSecurePort);
+ sprintf(responseData.payload, gSecureInfoData, clientEndpoint->resourceUri, gLocalSecurePort);
}
else
{
- int length = strlen(strPayload) + strlen(resourceURI) + 1;
+ int length = strlen("sendResponse Payload") + strlen(clientEndpoint->resourceUri) + 1;
responseData.payload = (CAPayload_t) malloc(length);
- sprintf(responseData.payload, strPayload, resourceURI);
+ sprintf(responseData.payload, gNormalInfoData, clientEndpoint->resourceUri);
}
responseData.type = messageType;
CAResponseInfo_t responseInfo;
memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
- responseInfo.result = CA_SUCCESS;
+ responseInfo.result = responseValue;
responseInfo.info = responseData;
// send request
- if(CA_STATUS_OK != CASendResponse(endpoint, &responseInfo))
+ if(CA_STATUS_OK != CASendResponse(clientEndpoint, &responseInfo))
{
LOGI("Could not send response");
}
- LOGI("Send response");
-
// destroy token
- if (token != NULL)
+ if (clientToken != NULL)
{
- CADestroyToken(token);
+ CADestroyToken(clientToken);
}
// destroy remote endpoint
- if (endpoint != NULL)
+ if (clientEndpoint != NULL)
{
- CADestroyRemoteEndpoint(endpoint);
+ CADestroyRemoteEndpoint(clientEndpoint);
}
}
void request_handler(const CARemoteEndpoint_t* object, const CARequestInfo_t* requestInfo)
{
+
+ char *cloneUri = NULL;
+ char *cloneRemoteAddress = NULL;
+ char *clonePayload = NULL;
+ char *cloneOptionData = NULL;
+ uint32_t len = 0;
+
if (!object)
{
LOGI("Remote endpoint is NULL!");
LOGI("##########received request from remote device #############\n");
LOGI("Uri: %s\n", object->resourceUri);
LOGI("Remote Address: %s\n", object->addressInfo.IP.ipAddress);
-
LOGI("Data: %s\n", requestInfo->info.payload);
+ LOGI("Token: %s\n", requestInfo->info.token);
+ LOGI("Code: %d\n", requestInfo->method);
if (NULL != gResponseListenerObject)
{
callback("received request from remote device", "#######");
- callback("Uri: ", object->resourceUri);
- callback("Remote Address: ", (char *) object->addressInfo.IP.ipAddress);
+ if (object->resourceUri != NULL)
+ {
+ len = strlen(object->resourceUri);
+ cloneUri = (char *) OICMalloc(sizeof(char) * (len + 1));
+
+ if (cloneUri == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(cloneUri, 0, sizeof(char) * (len + 1));
+ strncpy(cloneUri, object->resourceUri, len);
+
+ callback("Uri: ", cloneUri);
+ free(cloneUri);
+ }
+
+ len = strlen(object->addressInfo.IP.ipAddress);
+ cloneRemoteAddress = (char *) OICMalloc(sizeof(char) * (len + 1));
- if(requestInfo->info.payload)
+ if (cloneRemoteAddress == NULL)
{
- callback("Data: ", requestInfo->info.payload);
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(cloneRemoteAddress, 0, sizeof(char) * (len + 1));
+ strncpy(cloneRemoteAddress, object->addressInfo.IP.ipAddress, len);
+
+ callback("Remote Address: ", cloneRemoteAddress);
+ free(cloneRemoteAddress);
+
+
+ if(requestInfo->info.payload != NULL)
+ {
+ len = strlen(requestInfo->info.payload);
+ clonePayload = (char *) OICMalloc(sizeof(char) * (len + 1));
+
+ if (clonePayload == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(clonePayload, 0, sizeof(char) * (len + 1));
+ strncpy(clonePayload, requestInfo->info.payload, len);
+
+ callback("Data: ", clonePayload);
+ free(clonePayload);
}
}
{
uint32_t len = requestInfo->info.numOptions;
uint32_t i;
+
+ LOGI("Option count: %d\n", requestInfo->info.numOptions);
+
for (i = 0; i < len; i++)
{
LOGI("Option %d\n", i + 1);
if (NULL != gResponseListenerObject)
{
- char tmpbuf[30];
- sprintf(tmpbuf, "%d", i + 1);
- callback("Option: ", tmpbuf);
+ char optionInfo[1024] = {0,};
+ sprintf(optionInfo, "Num[%d] - ID : %d, Option Length : %d", i+1,
+ requestInfo->info.options[i].optionID, requestInfo->info.options[i].optionLength);
+
+ callback("Option info: ", optionInfo);
- sprintf(tmpbuf, "%d", requestInfo->info.options[i].optionID);
- callback("ID: ", tmpbuf);
+ if (requestInfo->info.options[i].optionData != NULL)
+ {
+ uint32_t optionDataLen = strlen(requestInfo->info.options[i].optionData);
+ cloneOptionData = (char *) OICMalloc(sizeof(char) * (optionDataLen + 1));
- sprintf(tmpbuf, "Data:[%d]", requestInfo->info.options[i].optionLength);
- callback("tmpbuf: ", requestInfo->info.options[i].optionData);
+ if (cloneOptionData == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(cloneOptionData, 0, sizeof(char) * (optionDataLen + 1));
+ strncpy(cloneOptionData, requestInfo->info.options[i].optionData, optionDataLen);
+
+ callback("Option Data: ", cloneOptionData);
+ free(cloneOptionData);
+ }
}
}
}
+
printf("############################################################\n");
//Check if this has secure communication information
- if (requestInfo->info.payload)
+ if (requestInfo->info.payload && object->resourceUri)
{
int securePort = get_secure_information(requestInfo->info.payload);
if (0 < securePort) //Set the remote endpoint secure details and send response
gReceived = 1;
- // response
-// send_response(object, (requestInfo != NULL) ? requestInfo->info.token : "");
-
+ clientEndpoint = object;
+ clientToken = requestInfo->info.token;
}
void response_handler(const CARemoteEndpoint_t* object, const CAResponseInfo_t* responseInfo)
{
+ char *cloneUri = NULL;
+ char *cloneRemoteAddress = NULL;
+ char *clonePayload = NULL;
+ char *cloneOptionData = NULL;
+ uint32_t len = 0;
+
LOGI("##########Received response from remote device #############\n");
LOGI("Uri: %s\n", object->resourceUri);
LOGI("Remote Address: %s\n", object->addressInfo.IP.ipAddress);
LOGI("response result: %d\n", responseInfo->result);
LOGI("Data: %s\n", responseInfo->info.payload);
+ LOGI("Token: %s\n", responseInfo->info.token);
+ LOGI("Code: %d\n", responseInfo->result);
if (NULL != gResponseListenerObject)
{
- callback("received response from remote device", "#######");
- callback("Uri: ", object->resourceUri);
+ if (object->resourceUri != NULL)
+ {
+ len = strlen(object->resourceUri);
+ cloneUri = (char *) OICMalloc(sizeof(char) * (len + 1));
- callback("Remote Address: ", (char *)object->addressInfo.IP.ipAddress);
+ if (cloneUri == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(cloneUri, 0, sizeof(char) * (len + 1));
+ strncpy(cloneUri, object->resourceUri, len);
- if(responseInfo->info.payload)
+ callback("Uri: ", cloneUri);
+ free(cloneUri);
+ }
+
+ len = strlen(object->addressInfo.IP.ipAddress);
+ cloneRemoteAddress = (char *) OICMalloc(sizeof(char) * (len + 1));
+
+ if (cloneRemoteAddress == NULL)
{
- callback("Data: ", responseInfo->info.payload);
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(cloneRemoteAddress, 0, sizeof(char) * (len + 1));
+ strncpy(cloneRemoteAddress, object->addressInfo.IP.ipAddress, len);
+
+ callback("Remote Address: ", cloneRemoteAddress);
+ free(cloneRemoteAddress);
+
+
+ if(responseInfo->info.payload != NULL)
+ {
+ len = strlen(responseInfo->info.payload);
+ clonePayload = (char *) OICMalloc(sizeof(char) * (len + 1));
+
+ if (clonePayload == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+
+ memset(clonePayload, 0, sizeof(char) * (len + 1));
+ strncpy(clonePayload, responseInfo->info.payload, len);
+
+ callback("Data: ", clonePayload);
+ free(clonePayload);
}
}
if (NULL != gResponseListenerObject)
{
- char tmpbuf[30];
- sprintf(tmpbuf, "%d", i + 1);
- callback("Option: ", tmpbuf);
-
- sprintf(tmpbuf, "%d", responseInfo->info.options[i].optionID);
- callback("ID: ", tmpbuf);
-
- sprintf(tmpbuf, "Data:[%d]", responseInfo->info.options[i].optionLength);
- callback("tmpbuf: ", responseInfo->info.options[i].optionData);
+ char optionInfo[1024] = {0,};
+ sprintf(optionInfo, "Num[%d] - ID : %d, Option Length : %d", i+1,
+ responseInfo->info.options[i].optionID,
+ responseInfo->info.options[i].optionLength);
+
+ callback("Option info: ", optionInfo);
+
+ if (responseInfo->info.options[i].optionData != NULL)
+ {
+ uint32_t optionDataLen = strlen(responseInfo->info.options[i].optionData);
+ cloneOptionData = (char *) OICMalloc(sizeof(char) * (optionDataLen + 1));
+
+ if (cloneOptionData == NULL)
+ {
+ LOGI("CACloneRemoteEndpoint Out of memory");
+ return;
+ }
+ memset(cloneOptionData, 0, sizeof(char) * (optionDataLen + 1));
+ strncpy(cloneOptionData, responseInfo->info.options[i].optionData, optionDataLen);
+ callback("Option Data: ", cloneOptionData);
+ free(cloneOptionData);
+ }
}
}
}
}
}
-void send_response(const CARemoteEndpoint_t* endpoint, CAToken_t request_token)
-{
- LOGI("send_response");
-
- CAInfo_t responseData;
- memset(&responseData, 0, sizeof(CAInfo_t));
- responseData.token = request_token;
- responseData.payload = "response payload";
-
- CAResponseInfo_t responseInfo;
- memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
- responseInfo.result = 203;
- responseInfo.info = responseData;
-
- // send request
- CASendResponse(endpoint, &responseInfo);
-}
-
void get_resource_uri(char *URI, char *resourceURI, int length)
{
char *startPos = URI;
return CA_NOT_SUPPORTED;
}
-void callback(char *subject, char *receicedData)
+void callback(char *subject, char *receivedData)
{
JNIEnv* env = NULL;
int status = (*g_jvm)->GetEnv(g_jvm, (void **) &env, JNI_VERSION_1_6);
jmethodID mid = (*env)->GetMethodID(env, cls, "OnResponseReceived", "(Ljava/lang/String;Ljava/lang/String;)V");
jstring jsubject = (*env)->NewStringUTF(env, (char*)subject);
- jstring jreceivedData = (*env)->NewStringUTF(env, (char*)receicedData);
+ jstring jreceivedData = (*env)->NewStringUTF(env, (char*)receivedData);
(*env)->CallVoidMethod(env, gResponseListenerObject, mid, jsubject, jreceivedData);
+
}