Fixed klockwork memory leaks and modified the logs
authorAshok Channa <ashok.channa@samsung.com>
Fri, 16 Jan 2015 11:45:06 +0000 (20:45 +0900)
committerSudarshan Prasad <sudarshan.prasad@intel.com>
Wed, 21 Jan 2015 03:40:24 +0000 (03:40 +0000)
[IoT 252] CAGenerateToken creates the same token if it
is called less than 500 milli seconds
Removed un-necessary files and added more test cases
Updated for compilation warning and klockwork fixes

Change-Id: I3710e92e9609441affcb40f10f92ef60f8d9f236
Signed-off-by: Ashok Channa <ashok.channa@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/151
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Sudarshan Prasad <sudarshan.prasad@intel.com>
62 files changed:
resource/csdk/connectivity/RELEASE v0.7 [moved from resource/csdk/connectivity/RELEASE v0.61 with 95% similarity]
resource/csdk/connectivity/api/cainterface.h
resource/csdk/connectivity/build/How_To_Build.txt
resource/csdk/connectivity/build/android/jni/Android.mk
resource/csdk/connectivity/build/linux/Makefile
resource/csdk/connectivity/common/SConscript
resource/csdk/connectivity/common/inc/logger.h
resource/csdk/connectivity/common/src/logger.c
resource/csdk/connectivity/common/src/logger.cpp [deleted file]
resource/csdk/connectivity/common/src/uarraylist.c
resource/csdk/connectivity/inc/caedrclient.h [moved from resource/csdk/connectivity/inc/caedrcore.h with 66% similarity]
resource/csdk/connectivity/inc/caedrinterface.h
resource/csdk/connectivity/inc/caedrserver.h [new file with mode: 0644]
resource/csdk/connectivity/inc/caedrutils.h [new file with mode: 0644]
resource/csdk/connectivity/lib/arduino/RBL_nRF8001.patch
resource/csdk/connectivity/samples/arduino/casample.cpp
resource/csdk/connectivity/samples/arduino/sample_main.cpp
resource/csdk/connectivity/samples/linux/sample_main.c
resource/csdk/connectivity/samples/tizen/casample.c
resource/csdk/connectivity/samples/tizen/interfacesample.c
resource/csdk/connectivity/src/adapter_util/caadapterutils.c
resource/csdk/connectivity/src/adapter_util/camsgparser.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedradapter.c [deleted file]
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c [moved from resource/csdk/connectivity/src/bt_edr_adapter/android/caedrcore.c with 57% similarity]
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c [new file with mode: 0644]
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c [new file with mode: 0644]
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c [new file with mode: 0644]
resource/csdk/connectivity/src/bt_edr_adapter/caedradapter.c
resource/csdk/connectivity/src/bt_edr_adapter/tizen/caedrclient.c
resource/csdk/connectivity/src/bt_edr_adapter/tizen/caedrserver.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleadapter.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c
resource/csdk/connectivity/src/bt_le_adapter/arduino/cableserver.cpp
resource/csdk/connectivity/src/bt_le_adapter/caleadapter.c
resource/csdk/connectivity/src/bt_le_adapter/caleadapter_singlethread.c
resource/csdk/connectivity/src/bt_le_adapter/tizen/cableclient.c
resource/csdk/connectivity/src/bt_le_adapter/tizen/cableserver.c
resource/csdk/connectivity/src/caconnectivitymanager_singlethread.c
resource/csdk/connectivity/src/cainterfacecontroller_singlethread.c
resource/csdk/connectivity/src/camessagehandler.c
resource/csdk/connectivity/src/camessagehandler_singlethread.c
resource/csdk/connectivity/src/canetworkconfigurator.c
resource/csdk/connectivity/src/canetworkconfigurator_singlethread.c
resource/csdk/connectivity/src/caprotocolmessage.c
resource/csdk/connectivity/src/caqueueingthread.c
resource/csdk/connectivity/src/caremotehandler.c
resource/csdk/connectivity/src/caretransmission_singlethread.cpp
resource/csdk/connectivity/src/ethernet_adapter/SConscript
resource/csdk/connectivity/src/ethernet_adapter/caethernetadapter.c
resource/csdk/connectivity/src/ethernet_adapter/caethernetadapter_singlethread.c
resource/csdk/connectivity/src/ethernet_adapter/linux/caethernetserver.c
resource/csdk/connectivity/src/wifi_adapter/android/cawifinwmonitor.c
resource/csdk/connectivity/src/wifi_adapter/android/cawifiserver.c
resource/csdk/connectivity/src/wifi_adapter/cawifiadapter.c
resource/csdk/connectivity/src/wifi_adapter/cawifiadapter_singlethread.c
resource/csdk/connectivity/src/wifi_adapter/linux/cawifiserver.c
resource/csdk/connectivity/src/wifi_adapter/tizen/cawifinwmonitor.c
resource/csdk/connectivity/src/wifi_adapter/tizen/cawifiserver.c
resource/csdk/connectivity/unittests/tizen/tct/README.txt
resource/csdk/connectivity/unittests/tizen/tct/liboic/bt/utc-bt-liboic.c
resource/csdk/connectivity/unittests/tizen/tct/liboic/wifi/utc-wifi-liboic.c

similarity index 95%
rename from resource/csdk/connectivity/RELEASE v0.61
rename to resource/csdk/connectivity/RELEASE v0.7
index df2d75d..f7b33bb 100644 (file)
@@ -1,5 +1,5 @@
 Project Name: IoTivity
-Release Version No: CA_v0.61
+Release Version No: CA_v0.7
 API Version: CA_v0.8
 
 Release Description:
@@ -22,6 +22,7 @@ Preconditions:
 3)libcoap.a library ( do make @lib/libcoap-4.1.1)
 4)tinyDTLS library for DTLS enabled applications( enable DTLS = 1 in makefile @connectivity\build/linux)
 5)Ethernet, BLE, TimedActions, Timer libraries for arduino support.
+6)scons for scon script compilation.
 
 Scope of Release:
 1. Supported APIs ( please check below APIs)
@@ -54,7 +55,6 @@ CAGetNetworkInfo()
 Known and Open Issues:
 1) OIC Log, OIC Malloc will be removed once name changes applied to OIC Bases code.
 2) Tizen platform BLE stack is not stable. So we may see random crashes.
-3) GetDtlsPskCredentials is implemented in sample which will be replace by security call during integration
 
 How to Build for Linux:
 Follow below steps to execute CA Client / server in different systems
index 614641f..5689fb5 100644 (file)
@@ -58,7 +58,7 @@ typedef void (*CARequestCallback)(const CARemoteEndpoint_t *object,
  */
 typedef void (*CAResponseCallback)(const CARemoteEndpoint_t *object,
                                    const CAResponseInfo_t *responseInfo);
-                                                                  
+
 #ifdef __WITH_DTLS__
 /**
  * @brief   Callback function type for getting DTLS credentials.
@@ -73,7 +73,7 @@ typedef void (*CAGetDTLSCredentialsHandler)(OCDtlsPskCredsBlob **credInfo);
  *          It will initialize adapters, thread pool and other modules based on the platform
  *          compilation options.
  *
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CAInitialize();
 
@@ -88,7 +88,7 @@ void CATerminate();
  * @brief   Starts listening servers.
  *          This API is used by resource hosting server for listening multicast requests.
  *          Based on the adapters configurations, different kinds of servers are started.
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED
  */
 CAResult_t CAStartListeningServer();
 
@@ -96,7 +96,7 @@ CAResult_t CAStartListeningServer();
  * @brief   Starts discovery servers.
  *          This API is used by resource required clients for listening multicast requests.
  *          Based on the adapters configurations, different kinds of servers are started.
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED
  */
 CAResult_t CAStartDiscoveryServer();
 
@@ -114,7 +114,7 @@ void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHand
 /**
  * @brief   Register callback to get DTLS PSK credentials.
  * @param   GetDTLSCredentials   [IN] GetDTLS Credetials callback
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK
  */
 CAResult_t CARegisterDTLSCredentialsHandler(
                                                    CAGetDTLSCredentialsHandler GetDTLSCredentials);
@@ -130,7 +130,7 @@ CAResult_t CARegisterDTLSCredentialsHandler(
  *                                    \n coap://10:11:12:13:45:45/resource_uri ( for BT)
  * @param   connectivityType    [IN]  Connectivity type of the endpoint
  * @param   object              [OUT] Endpoint object which contains the above parsed data
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED
  * @remark  The created Remote endpoint can be freed using CADestroyRemoteEndpoint() API.
  * @see     CADestroyRemoteEndpoint
  */
@@ -148,7 +148,7 @@ void CADestroyRemoteEndpoint(CARemoteEndpoint_t *object);
 /**
  * @brief   Generating the token for matching the request and response.
  * @param   token   [OUT] Token for the request
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  * @remark  Token memory is destroyed by the caller using CADestroyToken().
  * @see     CADestroyToken
  */
@@ -168,7 +168,7 @@ void CADestroyToken(CAToken_t token);
  * @param   resourceUri [IN] Uri to send multicast search request. Must contain only relative
  *                           path of Uri to be search.
  * @param   token       [IN] Token for the request
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED
  */
 CAResult_t CAFindResource(const CAURI_t resourceUri, const CAToken_t token);
 
@@ -177,7 +177,7 @@ CAResult_t CAFindResource(const CAURI_t resourceUri, const CAToken_t token);
  * @param   object      [IN] Remote Endpoint where the payload need to be sent.
  *                           This Remote endpoint is delivered with Request or response callback.
  * @param   requestInfo [IN] Information for the request.
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK #CA_STATUS_FAILED #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CASendRequest(const CARemoteEndpoint_t *object, CARequestInfo_t *requestInfo);
 
@@ -186,7 +186,7 @@ CAResult_t CASendRequest(const CARemoteEndpoint_t *object, CARequestInfo_t *requ
  * @param   object      [IN] Group Endpoint where the payload need to be sent.
  *                           This Remote endpoint is delivered with Request or response callback.
  * @param   requestInfo [IN] Information for the request.
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CASendRequestToAll(const CAGroupEndpoint_t *object,
                               const CARequestInfo_t *requestInfo);
@@ -196,7 +196,7 @@ CAResult_t CASendRequestToAll(const CAGroupEndpoint_t *object,
  * @param   object          [IN] Remote Endpoint where the payload need to be sent.
  *                               This Remote endpoint is delivered with Request or response callback
  * @param   responseInfo    [IN] Information for the response
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or  #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CASendResponse(const CARemoteEndpoint_t *object, CAResponseInfo_t *responseInfo);
 
@@ -205,7 +205,7 @@ CAResult_t CASendResponse(const CARemoteEndpoint_t *object, CAResponseInfo_t *re
  * @param   object          [IN] Remote Endpoint where the payload need to be sent.
  *                               This Remote endpoint is delivered with Request or response callback.
  * @param   responseInfo    [IN] Information for the response.
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CASendNotification(const CARemoteEndpoint_t *object,
                               CAResponseInfo_t *responseInfo);
@@ -216,7 +216,7 @@ CAResult_t CASendNotification(const CARemoteEndpoint_t *object,
  * @param   token       [IN] Token for the request
  * @param   options     [IN] Header options information
  * @param   numOptions  [IN] Number of options
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CAAdvertiseResource(const CAURI_t resourceUri, CAToken_t token,
                                CAHeaderOption_t *options, uint8_t numOptions);
@@ -224,14 +224,14 @@ CAResult_t CAAdvertiseResource(const CAURI_t resourceUri, CAToken_t token,
 /**
  * @brief   Select network to use
  * @param   interestedNetwork   [IN] Connectivity Type enum
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_NOT_SUPPORTED or #CA_STATUS_FAILED or #CA_NOT_SUPPORTED
  */
 CAResult_t CASelectNetwork(const uint32_t interestedNetwork);
 
 /**
  * @brief   Select network to unuse
  * @param   nonInterestedNetwork    [IN] Connectivity Type enum
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_NOT_SUPPORTED or #CA_STATUS_FAILED
  */
 CAResult_t CAUnSelectNetwork(const uint32_t nonInterestedNetwork);
 
@@ -240,13 +240,13 @@ CAResult_t CAUnSelectNetwork(const uint32_t nonInterestedNetwork);
  *          It should be destroyed by the caller as it Get Information.
  * @param   info    [OUT] LocalConnectivity objects
  * @param   size    [OUT] No Of Array objects
- * @return  #CA_STATUS_OK or Appropriate error code
+ * @return  #CA_STATUS_OK or #CA_STATUS_FAILED or #CA_STATUS_INVALID_PARAM or #CA_MEMORY_ALLOC_FAILED
  */
 CAResult_t CAGetNetworkInformation(CALocalConnectivity_t **info, uint32_t *size);
 
 /**
  * @brief    To Handle the Request or Response
- * @return   #CA_STATUS_OK or Appropriate error code
+ * @return   #CA_STATUS_OK
  */
 CAResult_t CAHandleRequestResponse();
 
index c248e62..d69465a 100644 (file)
@@ -17,48 +17,48 @@ Linux Build:
 2) Execute following command(s) to start build based on transport selection required :
 
     -> Building for all transports :
-    scons TARGET_OS=linux TARGET_TRANSPORT=ALL
+    scons TARGET_OS=linux TARGET_TRANSPORT=ALL
 
     -> Building for a specific transport :
-    scons TARGET_OS=linux TARGET_TRANSPORT=WIFI
+    scons TARGET_OS=linux TARGET_TRANSPORT=WIFI
 
     -> Building for multiple transports :
-    scons TARGET_OS=linux TARGET_TRANSPORT=WIFI,ETHERNET
-       
-       sudo scons TARGET_OS=linux TARGET_TRANSPORT=ALL -c ( for clean)
+    $ scons TARGET_OS=linux TARGET_TRANSPORT=WIFI,ETHERNET
 
+    -> Clean Build (all transports) :
+    scons TARGET_OS=linux TARGET_TRANSPORT=ALL -c (for clean)
 
-3)The above command will build sample also.
 
-For Enabling Secured server, 
-    *Note: tinydtls libray has to copied to "connectivity/lib/tinydtls" for secured build.
+3) The above command will build sample also.
 
-    Secured Server will be only used for WIFI and ETHERNET transports.
+    For Enabling Secured server, 
+    * Note: tinydtls library has to copied to "connectivity/lib/tinydtls" for secured build.
 
-    Give command "sudo scons TARGET_OS=linux TARGET_TRANSPORT=WIFI SECURED=1
+    Secured Server will be only used for WIFI and ETHERNET transports.
 
-    or(For multiple transports will be mentioned using comma)
+    Give command "scons TARGET_OS=linux TARGET_TRANSPORT=WIFI SECURED=1
 
-    Give command "sudo scons TARGET_OS=linux TARGET_TRANSPORT=WIFI,ETHERNET SECURED=1
+    or (For multiple transports will be mentioned using comma)
 
+    Give command "scons TARGET_OS=linux TARGET_TRANSPORT=WIFI,ETHERNET SECURED=1
 
 Android Build:
 
-1) Go to "connectivity/build" folder.
+1) Go to "connectivity/" folder.
 
 2) Execute following command(s) to start build based on transport selection required :
 
     -> Building for all transports :
-    scons TARGET_OS=android TARGET_TRANSPORT=ALL TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
+    scons TARGET_OS=android TARGET_TRANSPORT=ALL TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
 
     -> Building for a specific transport :
-    scons TARGET_OS=android TARGET_TRANSPORT=WIFI TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
+    scons TARGET_OS=android TARGET_TRANSPORT=WIFI TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
 
     -> Building for multiple transports :
-    scons TARGET_OS=android TARGET_TRANSPORT=WIFI,BT TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
+    scons TARGET_OS=android TARGET_TRANSPORT=WIFI,BT TARGET_ARCH=x86 ANDROID_NDK=your_ndk_path
 
 Note :- Upon successful execution of above command(s) CA library will be generated at path
-               "~/connectivity/build/out/android/TARGET_ARCH/release or debug".
+        "~/connectivity/build/out/android/TARGET_ARCH/release or debug".
 
 Tizen Build:
 
@@ -69,13 +69,13 @@ Tizen Build:
 3) Execute following command(s) to start build based on transport selection required :
 
     -> Building for all transports :
-    scons TARGET_OS=tizen TARGET_TRANSPORT=ALL
+    scons TARGET_OS=tizen TARGET_TRANSPORT=ALL
 
     -> Building for a specific transport :
-    scons TARGET_OS=tizen TARGET_TRANSPORT=WIFI
+    scons TARGET_OS=tizen TARGET_TRANSPORT=WIFI
 
     -> Building for multiple transports :
-    scons TARGET_OS=tizen TARGET_TRANSPORT=WIFI,BT,BLE
+    scons TARGET_OS=tizen TARGET_TRANSPORT=WIFI,BT,BLE
 
 4) By default, above command will build sample also.
    To disable building sample, add BUILD_SAMPLE=OFF to the build command.
@@ -89,33 +89,35 @@ Arduino Build:
 
 Note :- Currently only megaADK build is supported.
 
-1) Set up Arduino first before building. Refer to connectivity\build\arduino\Arduino_Setup_README.txt file for help.
+1) Set up Arduino first before building. Refer to "connectivity\build\arduino\Arduino_Setup_README.txt" file for help.
 
 2) Go to "connectivity/" folder.
 
 3) Execute following command to start build :
 
-    scons TARGET_OS=arduino TARGET_TRANSPORT=<transport> TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
+    scons TARGET_OS=arduino TARGET_TRANSPORT=<transport> TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
 
     Possible values for <transport> are:
     -> ETHERNET :
-    scons TARGET_OS=arduino TARGET_TRANSPORT=ETHERNET TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
+    scons TARGET_OS=arduino TARGET_TRANSPORT=ETHERNET TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
     -> WIFI :
-    scons TARGET_OS=arduino TARGET_TRANSPORT=WIFI TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
+    scons TARGET_OS=arduino TARGET_TRANSPORT=WIFI TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
     -> BLE :
-    scons TARGET_OS=arduino TARGET_TRANSPORT=BLE TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
+    scons TARGET_OS=arduino TARGET_TRANSPORT=BLE TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation>
 
     Note :- Only single transport can be built at a time for Arduino.
 
 4) The above command will build sample also. The "CASample.hex" can be found at "/samples/arduino/"
 
-5) After building sample, script will try to install on "/dev/ttyACM0" port in sudo mode.
+5) After building sample, script will try to install on "/dev/ttyACM0" port in 'sudo' mode.
    To skip installation, set command line argument 'UPLOAD=false'.
    "scons TARGET_OS=arduino TARGET_TRANSPORT=ETHERNET TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation> UPLOAD=false"
 
-6) To set BLE Shield Name, include the option DEVICE_NAME during scon build.
-       "scons TARGET_OS=arduino TARGET_TRANSPORT=ETHERNET TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation> DEVICE_NAME=OIC"
+6) To set BLE Shield Name, include the option DEVICE_NAME during scons build.
+
+   -> $ scons TARGET_OS=arduino TARGET_TRANSPORT=ETHERNET TARGET_ARCH=avr BOARD=megaADK ARDUINO_HOME=<path_to_arduino_installation> DEVICE_NAME=OIC
+
    Specified Device name length MUST be less than 10 characters. RBL Library has this limitation.
    By Default DEVICE_NAME=OIC-DEVICE, if device name option is not specified
 
-   To change the port number, please modify  "port" variable in __upload() function in: "/build/arduino/SConscript".
\ No newline at end of file
+   To change the port number, please modify  "port" variable in __upload() function in: "/build/arduino/SConscript".
index 6ba7f6f..95ff806 100644 (file)
@@ -37,9 +37,10 @@ BUILD_FLAG = $(BUILD_FLAG.$(BUILD))
 include $(CLEAR_VARS)
 LOCAL_PATH = $(PROJECT_LIB_PATH)/android
 LOCAL_MODULE = Glib
-LOCAL_SRC_FILES := libglib-2.0.so
-LOCAL_EXPORT_C_INCLUDES = $(PROJECT_LIB_PATH)/android/glib-master \
-                          $(PROJECT_LIB_PATH)/android/glib-master/android
+LOCAL_SRC_FILES := libglib-2.40.2.so
+LOCAL_EXPORT_C_INCLUDES = $(PROJECT_LIB_PATH)/android/glib-2.40.2 \
+                          $(PROJECT_LIB_PATH)/android/glib-2.40.2/glib
+
 include $(PREBUILT_SHARED_LIBRARY)
 
 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -48,15 +49,15 @@ include $(PREBUILT_SHARED_LIBRARY)
 include $(CLEAR_VARS)
 LOCAL_PATH = $(PROJECT_LIB_PATH)/android
 LOCAL_MODULE = GLibThread
-LOCAL_SRC_FILES := libgthread-2.0.so
-LOCAL_EXPORT_C_INCLUDES = $(PROJECT_LIB_PATH)/android/glib-master \
-                          $(PROJECT_LIB_PATH)/android/glib-master/android
+LOCAL_SRC_FILES := libgthread-2.40.2.so
+LOCAL_EXPORT_C_INCLUDES = $(PROJECT_LIB_PATH)/android/glib-2.40.2 \
+                          $(PROJECT_LIB_PATH)/android/glib-2.40.2/glib
 
 include $(PREBUILT_SHARED_LIBRARY)
 
 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-#include TinyDtls
+#Build TinyDtls
 
 include $(CLEAR_VARS)
 include $(DTLS_LIB)/Android.mk
@@ -72,6 +73,7 @@ LOCAL_MODULE = CACommon
 LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
 
 LOCAL_SHARED_LIBRARIES = Glib GLibThread
+
 LOCAL_CFLAGS = -D__ANDROID__ $(DEBUG_FLAG)
 
 LOCAL_C_INCLUDES = $(PROJECT_COMMON_INC_PATH)
@@ -133,11 +135,13 @@ LOCAL_SRC_FILES   = \
                                        camessagehandler.c canetworkconfigurator.c caprotocolmessage.c \
                                        caretransmission.c caqueueingthread.c \
                                        $(ADAPTER_UTILS)/caadapternetdtls.c $(ADAPTER_UTILS)/caadapterutils.c \
-                                       $(ADAPTER_UTILS)/camsgparser.c $(EDR_ADAPTER_PATH)/caedradapter.c \
+                                       $(ADAPTER_UTILS)/camsgparser.c \
                                        $(LE_ADAPTER_PATH)/caleadapter.c $(LE_ADAPTER_PATH)/caleclient.c \
                                        $(LE_ADAPTER_PATH)/caleserver.c $(LE_ADAPTER_PATH)/caleutils.c \
                                        $(LE_ADAPTER_PATH)/calenwmonitor.c \
-                                       $(EDR_ADAPTER_PATH)/caedrcore.c \
+                                       bt_edr_adapter/caedradapter.c $(EDR_ADAPTER_PATH)/caedrutils.c \
+                                       $(EDR_ADAPTER_PATH)/caedrclient.c $(EDR_ADAPTER_PATH)/caedrserver.c \
+                                       $(EDR_ADAPTER_PATH)/caedrnwmonitor.c \
                                        wifi_adapter/cawifiadapter.c $(WIFI_ADAPTER_PATH)/cawifiserver.c \
                                        $(WIFI_ADAPTER_PATH)/cawificlient.c $(WIFI_ADAPTER_PATH)/cawifinwmonitor.c \
 
index b0036a8..6756615 100644 (file)
@@ -81,8 +81,8 @@ libtiny_lib_dir = $(PROJECT_LIB_PATH)/extlibs/tinydtls
 LDFLAGS := -L$(libcoap_build_dir) -L$(libtiny_lib_dir)
 LDLIBS := -lcoap -ltinydtls
 else
-LDFLAGS := -L$(libcoap_build_dir)
-LDLIBS := -lcoap
+LDFLAGS := -L$(libcoap_build_dir) 
+LDLIBS := -lcoap 
 
 endif
 BUILD_FLAG.debug = $(DEFINE_FLAG) $(DEBUG_FLAG)
index 1f85a67..ce670a7 100644 (file)
@@ -15,6 +15,11 @@ env.AppendUnique(CPPPATH = [
        ca_common_path + 'inc/',
        ])
 
+temp = env['CPPPATH']
+header = ' '
+for item in temp:
+       header = header + ' -I' + item
+       
 ######################################################################
 # Source files and Target(s)
 ######################################################################
@@ -26,8 +31,9 @@ ca_common_src = [
        ]
        
 if ca_os == 'arduino':
+       env.Command(env.get('BUILD_DIR') + 'logger.c.o', None, '$CXX -o ' + env.get('BUILD_DIR') + 'logger.c.o' + ' $LINKFLAGS  $CCFLAGS  $CXXFLAGS ' + header + ' ' + ca_common_src_path + 'logger.c')
        platform_src = [
-               ca_common_src_path + 'logger.cpp',
+               env.get('BUILD_DIR') + 'logger.c.o',
        ]
 else:
        platform_src = [
index b049fa5..53ae94d 100644 (file)
@@ -158,7 +158,7 @@ void OICLogBuffer(LogLevel level, const char *tag, const uint8_t *buffer, uint16
  * @param tag    - Module name
  * @param format - variadic log string
  */
-void OICLogv(LogLevel level, const char *tag, const int16_t lineNum, const char *format, ...);
+void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, PROGMEM const char *format, ...);
 #endif
 
 #ifdef TB_LOG
@@ -176,6 +176,8 @@ void OICLogv(LogLevel level, const char *tag, const int16_t lineNum, const char
 #define OIC_LOG_SHUTDOWN()
 #define OIC_LOG(level, tag, logStr) OICLog((level), PCF(tag), __LINE__, PCF(logStr))
 #define OIC_LOG_V(level, tag, ...)
+// To enable OIC_LOG_V, uncomment the below
+//#define OIC_LOG_V(level, tag, format, ...)  OICLogv((level), PCF(tag), __LINE__, PCF(format), __VA_ARGS__)
 #else
 #define OIC_LOG_CONFIG(ctx)    OICLogConfig((ctx))
 #define OIC_LOG_SHUTDOWN()     OICLogShutdown()
index 5f7848f..8e58cd8 100644 (file)
 #include "string.h"
 #include "oic_logger.h"
 #include "oic_console_logger.h"
-#ifdef ARDUINO
-#include "Arduino.h"
-#include <avr/pgmspace.h>
-#endif
 
 #ifndef __TIZEN__
 static oic_log_ctx_t *logCtx = 0;
@@ -53,6 +49,7 @@ static const char *LEVEL[] __attribute__ ((unused)) =
 {   "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
 #elif defined ARDUINO
 #include <stdarg.h>
+#include "Arduino.h"
 
 PROGMEM const char level0[] = "DEBUG";
 PROGMEM const char level1[] = "INFO";
@@ -194,7 +191,8 @@ void OICLogBuffer(LogLevel level, const char *tag, const uint8_t *buffer, uint16
     }
 }
 #endif //__TIZEN__
-#else
+#endif //ARDUINO
+#ifdef ARDUINO
 /**
  * Initialize the serial logger for Arduino
  * Only defined for Arduino
@@ -213,30 +211,27 @@ void OICLogInit()
  * @param tag    - Module name
  * @param logStr - log string
  */
-void OICLogString(LogLevel level, PROGMEM const char *tag, const char *logStr)
-{
-    if (!logStr || !tag)
-    {
-        return;
-    }
-
-    char buffer[LINE_BUFFER_SIZE];
-
-    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
-    Serial.print(buffer);
-
-    char c;
-    Serial.print(F(": "));
-    while ((c = pgm_read_byte(tag)))
-    {
-        Serial.write(c);
-        tag++;
-    }
-    Serial.print(F(": "));
-
-    Serial.println(logStr);
-}
-
+/*
+ void OCLogString(LogLevel level, PROGMEM const char * tag, const char * logStr) {
+ if (!logStr || !tag) {
+ return;
+ }
+
+ char buffer[LINE_BUFFER_SIZE] = {0};
+ strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+ Serial.print(buffer);
+
+ char c;
+ Serial.print(F(": "));
+ while ((c = pgm_read_byte(tag))) {
+ Serial.write(c);
+ tag++;
+ }
+ Serial.print(F(": "));
+
+ Serial.println(logStr);
+ }
+ */
 /**
  * Output the contents of the specified buffer (in hex) with the specified priority level.
  *
@@ -245,36 +240,31 @@ void OICLogString(LogLevel level, PROGMEM const char *tag, const char *logStr)
  * @param buffer     - pointer to buffer of bytes
  * @param bufferSize - max number of byte in buffer
  */
-void OICLogBuffer(LogLevel level, PROGMEM const char *tag, const uint8_t *buffer,
-                  uint16_t bufferSize)
-{
-    if (!buffer || !tag || (bufferSize == 0))
-    {
-        return;
-    }
-
-    char lineBuffer[LINE_BUFFER_SIZE] =
-    {   0};
-    uint8_t lineIndex = 0;
-    for (uint8_t i = 0; i < bufferSize; i++)
-    {
-        // Format the buffer data into a line
-        sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
-        // Output 16 values per line
-        if (((i + 1) % 16) == 0)
-        {
-            OICLogString(level, tag, lineBuffer);
-            memset(lineBuffer, 0, sizeof lineBuffer);
-            lineIndex = 0;
-        }
-    }
-    // Output last values in the line, if any
-    if (bufferSize % 16)
-    {
-        OICLogString(level, tag, lineBuffer);
-    }
-}
 
+/*
+ void OCLogBuffer(LogLevel level, PROGMEM const char * tag, const uint8_t * buffer, uint16_t bufferSize) {
+ if (!buffer || !tag || (bufferSize == 0)) {
+ return;
+ }
+
+ char lineBuffer[LINE_BUFFER_SIZE] = {0};
+ uint8_t lineIndex = 0;
+ for (uint8_t i = 0; i < bufferSize; i++) {
+ // Format the buffer data into a line
+ sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
+ // Output 16 values per line
+ if (((i+1)%16) == 0) {
+ OCLogString(level, tag, lineBuffer);
+ memset(lineBuffer, 0, sizeof lineBuffer);
+ lineIndex = 0;
+ }
+ }
+ // Output last values in the line, if any
+ if (bufferSize % 16) {
+ OCLogString(level, tag, lineBuffer);
+ }
+ }
+ */
 /**
  * Output a log string with the specified priority level.
  * Only defined for Arduino.  Uses PROGMEM strings
@@ -283,18 +273,15 @@ void OICLogBuffer(LogLevel level, PROGMEM const char *tag, const uint8_t *buffer
  * @param tag    - Module name
  * @param logStr - log string
  */
-void OICLog(LogLevel level, PROGMEM const char *tag, PROGMEM const char *logStr)
+void OICLog(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, PROGMEM const char *logStr)
 {
     if (!logStr || !tag)
     {
         return;
     }
-
-    char buffer[LINE_BUFFER_SIZE];
-
-    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
+    char buffer[LINE_BUFFER_SIZE] = {0};
+    strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
     Serial.print(buffer);
-
     char c;
     Serial.print(F(": "));
     while ((c = pgm_read_byte(tag)))
@@ -303,7 +290,8 @@ void OICLog(LogLevel level, PROGMEM const char *tag, PROGMEM const char *logStr)
         tag++;
     }
     Serial.print(F(": "));
-
+    Serial.print(lineNum);
+    Serial.print(F(": "));
     while ((c = pgm_read_byte(logStr)))
     {
         Serial.write(c);
@@ -320,28 +308,28 @@ void OICLog(LogLevel level, PROGMEM const char *tag, PROGMEM const char *logStr)
  * @param tag    - Module name
  * @param format - variadic log string
  */
-void OICLogv(LogLevel level, PROGMEM const char *tag, const char *format, ...)
+void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, PROGMEM const char *format, ...)
 {
     char buffer[LINE_BUFFER_SIZE];
     va_list ap;
     va_start(ap, format);
-
-    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
+    strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
     Serial.print(buffer);
 
     char c;
     Serial.print(F(": "));
-
-    while ((c = pgm_read_byte(tag)))
-    {
-        Serial.write(c);
-        tag++;
-    }
+    while ((c = pgm_read_byte(tag))) {
+     Serial.write(c);
+     tag++;
+     }
+    Serial.print(F(": "));
+    Serial.print(lineNum);
     Serial.print(F(": "));
 
-    vsnprintf(buffer, sizeof(buffer), format, ap);
-    for (char *p = &buffer[0]; *p; p++) // emulate cooked mode for newlines
+    vsnprintf_P(buffer, sizeof(buffer), format, ap);
+    for (char *p = &buffer[0]; *p; p++)
     {
+        // emulate cooked mode for newlines
         if (*p == '\n')
         {
             Serial.write('\r');
@@ -359,23 +347,23 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const char *format, ...)
  * @param tag    - Module name
  * @param format - variadic log string
  */
-void OICLogv(LogLevel level, PROGMEM const char *tag, const __FlashStringHelper *format, ...)
+void OICLogv(LogLevel level, const char *tag, const __FlashStringHelper *format, ...)
 {
     char buffer[LINE_BUFFER_SIZE];
     va_list ap;
     va_start(ap, format);
+    // strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+    // Serial.print(buffer);
 
-    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
-    Serial.print(buffer);
-
-    char c;
+    Serial.print(LEVEL[level]);
+    // char c;
     Serial.print(F(": "));
 
-    while ((c = pgm_read_byte(tag)))
-    {
-        Serial.write(c);
-        tag++;
-    }
+    /*while ((c = pgm_read_byte(tag))) {
+     Serial.write(c);
+     tag++;
+     }*/
+    Serial.print(tag);
     Serial.print(F(": "));
 
 #ifdef __AVR__
@@ -383,13 +371,16 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const __FlashStringHelper
 #else
     vsnprintf(buffer, sizeof(buffer), (const char *)format, ap); // for the rest of the world
 #endif
-    for (char *p = &buffer[0]; *p; p++) // emulate cooked mode for newlines
+    for (char *p = &buffer[0]; *p; p++)
     {
+        // emulate cooked mode for newlines
         if (*p == '\n')
         {
-            Serial.write('\r');
+            // Serial.write('\r');
+            Serial.print('\r');
         }
-        Serial.write(*p);
+        //Serial.write(*p);
+        Serial.print(p);
     }
     Serial.println();
     va_end(ap);
diff --git a/resource/csdk/connectivity/common/src/logger.cpp b/resource/csdk/connectivity/common/src/logger.cpp
deleted file mode 100644 (file)
index 799d81b..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-//******************************************************************
-//
-// Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-#include "logger.h"
-#include "string.h"
-
-static const uint16_t LINE_BUFFER_SIZE = (16 * 2) + 16 +
-        1; // Show 16 bytes, 2 chars/byte, spaces between bytes, null termination
-
-// Convert LogLevel to platform-specific severity level.  Store in PROGMEM on Arduino
-#ifdef __ANDROID__
-static android_LogPriority LEVEL[] =
-{   ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
-
-#elif defined __linux__
-#include <dlog/dlog.h>
-#define LOG_TAG "CA"
-#define FONT_COLOR_RESET    "\033[0m"
-#define FONT_COLOR_RED      "\033[31m"
-#define FONT_COLOR_YELLOW   "\033[33m"
-#define FONT_COLOR_GREEN    "\033[32m"
-
-//#elif defined __linux__
-static const char *LEVEL[] =
-{   "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
-static const char *LEVEL[] __attribute__((unused)) =
-{   "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
-#elif defined ARDUINO
-#include <stdarg.h>
-#include "Arduino.h"
-
-PROGMEM const char level0[] = "DEBUG";
-PROGMEM const char level1[] = "INFO";
-PROGMEM const char level2[] = "WARNING";
-PROGMEM const char level3[] = "ERROR";
-PROGMEM const char level4[] = "FATAL";
-
-PROGMEM const char * const LEVEL[]  = {level0, level1, level2, level3, level4};
-
-//    static void OCLogString(LogLevel level, PROGMEM const char * tag, PROGMEM const char * logStr);
-#endif
-
-#if defined(__ANDROID__) || defined(__linux__) || defined(__TIZEN__)
-/**
- * Output a variable argument list log string with the specified priority level.
- * Only defined for Linux and Android
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param format - variadic log string
- */
-void OICLogv(LogLevel level, const char *tag, const char *format, ...)
-{
-    if (!format || !tag)
-    {
-        return;
-    }
-    char buffer[MAX_LOG_V_BUFFER_SIZE];
-    memset(buffer, 0, sizeof buffer);
-    va_list args;
-    va_start(args, format);
-    vsnprintf(buffer, sizeof buffer - 1, format, args);
-    va_end(args);
-    OICLog(level, tag, buffer);
-}
-
-/**
- * Output a log string with the specified priority level.
- * Only defined for Linux and Android
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param logStr - log string
- */
-void OICLog(LogLevel level, const char *tag, const char *logStr)
-{
-    if (!logStr || !tag)
-    {
-        return;
-    }
-
-#ifdef __ANDROID__
-    __android_log_write(LEVEL[level], tag, logStr);
-#else //#elif __TIZEN__
-    LOGD(logStr);
-    /*#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG tag
-#endif
-    if(level == DEBUG || level == INFO){
-        LOGD(logStr);
-    }else if(level == WARNING){
-        LOGW(logStr);
-    }else if(level == ERROR || level == FATAL){
-        LOGE(logStr);
-    }*/
-    //#elif defined __linux__
-    printf("%s: %s: %s\n", LEVEL[level], tag, logStr);
-#endif
-}
-
-/**
- * Output the contents of the specified buffer (in hex) with the specified priority level.
- *
- * @param level      - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag        - Module name
- * @param buffer     - pointer to buffer of bytes
- * @param bufferSize - max number of byte in buffer
- */
-/*
- void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint16_t bufferSize) {
- if (!buffer || !tag || (bufferSize == 0)) {
- return;
- }
-
- char lineBuffer[LINE_BUFFER_SIZE];
- memset(lineBuffer, 0, sizeof lineBuffer);
- int lineIndex = 0;
- int i;
- for (i = 0; i < bufferSize; i++) {
- // Format the buffer data into a line
- sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
- // Output 16 values per line
- if (((i+1)%16) == 0) {
- OCLog(level, tag, lineBuffer);
- memset(lineBuffer, 0, sizeof lineBuffer);
- lineIndex = 0;
- }
- }
- // Output last values in the line, if any
- if (bufferSize % 16) {
- OCLog(level, tag, lineBuffer);
- }
- }
- */
-
-#endif
-
-#ifdef ARDUINO
-/**
- * Initialize the serial logger for Arduino
- * Only defined for Arduino
- */
-void OICLogInit()
-{
-    Serial.begin(115200);
-}
-
-/**
- * Output a log string with the specified priority level.
- * Only defined for Arduino.  Only uses PROGMEM strings
- * for the tag parameter
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param logStr - log string
- */
-/*
- void OCLogString(LogLevel level, PROGMEM const char * tag, const char * logStr) {
- if (!logStr || !tag) {
- return;
- }
-
- char buffer[LINE_BUFFER_SIZE] = {0};
- strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
- Serial.print(buffer);
-
- char c;
- Serial.print(F(": "));
- while ((c = pgm_read_byte(tag))) {
- Serial.write(c);
- tag++;
- }
- Serial.print(F(": "));
-
- Serial.println(logStr);
- }
- */
-/**
- * Output the contents of the specified buffer (in hex) with the specified priority level.
- *
- * @param level      - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag        - Module name
- * @param buffer     - pointer to buffer of bytes
- * @param bufferSize - max number of byte in buffer
- */
-
-/*
- void OCLogBuffer(LogLevel level, PROGMEM const char * tag, const uint8_t * buffer, uint16_t bufferSize) {
- if (!buffer || !tag || (bufferSize == 0)) {
- return;
- }
-
- char lineBuffer[LINE_BUFFER_SIZE] = {0};
- uint8_t lineIndex = 0;
- for (uint8_t i = 0; i < bufferSize; i++) {
- // Format the buffer data into a line
- sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
- // Output 16 values per line
- if (((i+1)%16) == 0) {
- OCLogString(level, tag, lineBuffer);
- memset(lineBuffer, 0, sizeof lineBuffer);
- lineIndex = 0;
- }
- }
- // Output last values in the line, if any
- if (bufferSize % 16) {
- OCLogString(level, tag, lineBuffer);
- }
- }
- */
-/**
- * Output a log string with the specified priority level.
- * Only defined for Arduino.  Uses PROGMEM strings
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param logStr - log string
- */
-void OICLog(LogLevel level, PROGMEM const char *tag, const int16_t lineNum, PROGMEM const char *logStr)
-{
-    if (!logStr || !tag)
-    {
-        return;
-    }
-    char buffer[LINE_BUFFER_SIZE] = {0};
-    strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
-    Serial.print(buffer);
-    char c;
-    Serial.print(F(": "));
-    while ((c = pgm_read_byte(tag)))
-    {
-        Serial.write(c);
-        tag++;
-    }
-    Serial.print(F(": "));
-    Serial.print(lineNum);
-    Serial.print(F(": "));
-    while ((c = pgm_read_byte(logStr))) {
-     Serial.write(c);
-     logStr++;
-     }
-    Serial.println();
-}
-
-/**
- * Output a variable argument list log string with the specified priority level.
- * Only defined for Arduino as depicted below.
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param format - variadic log string
- */
-void OICLogv(LogLevel level, const char *tag, const int16_t lineNum, const char *format, ...)
-{
-    char buffer[LINE_BUFFER_SIZE];
-    va_list ap;
-    va_start(ap, format);
-    //strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
-    //Serial.print(buffer);
-
-    Serial.print(LEVEL[level]);
-    //char c;
-    Serial.print(F(": "));
-    /*while ((c = pgm_read_byte(tag))) {
-     Serial.write(c);
-     tag++;
-     }*/
-    Serial.print(tag);
-    Serial.print(F(": "));
-    Serial.print(lineNum);
-    Serial.print(F(": "));
-    vsnprintf(buffer, sizeof(buffer), format, ap);
-    for (char *p = &buffer[0]; *p; p++)
-    {
-        // emulate cooked mode for newlines
-        if (*p == '\n')
-        {
-            //Serial.write('\r');
-            Serial.print('\r');
-        }
-        //Serial.write(*p);
-        Serial.print(*p);
-    }
-    Serial.println();
-    va_end(ap);
-}
-/**
- * Output a variable argument list log string with the specified priority level.
- * Only defined for Arduino as depicted below.
- *
- * @param level  - DEBUG, INFO, WARNING, ERROR, FATAL
- * @param tag    - Module name
- * @param format - variadic log string
- */
-void OICLogv(LogLevel level, const char *tag, const __FlashStringHelper *format, ...)
-{
-    Serial.print("OCLOGV : ");
-    char buffer[LINE_BUFFER_SIZE];
-    va_list ap;
-    va_start(ap, format);
-    // strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
-    // Serial.print(buffer);
-
-    Serial.print(LEVEL[level]);
-    // char c;
-    Serial.print(F(": "));
-
-    /*while ((c = pgm_read_byte(tag))) {
-     Serial.write(c);
-     tag++;
-     }*/
-    Serial.print(tag);
-    Serial.print(F(": "));
-
-#ifdef __AVR__
-    vsnprintf_P(buffer, sizeof(buffer), (const char *)format, ap); // progmem for AVR
-#else
-    vsnprintf(buffer, sizeof(buffer), (const char *)format, ap); // for the rest of the world
-#endif
-    for (char *p = &buffer[0]; *p; p++)
-    {
-        // emulate cooked mode for newlines
-        if (*p == '\n')
-        {
-            // Serial.write('\r');
-            Serial.print('\r');
-        }
-        //Serial.write(*p);
-        Serial.print(p);
-    }
-    Serial.println();
-    va_end(ap);
-}
-#endif
-
index 69bd384..f1425e8 100644 (file)
@@ -40,7 +40,7 @@ u_arraylist_t *u_arraylist_create()
 
     if (!(list->data = (void *) OICMalloc(list->size * sizeof(void *))))
     {
-        OIC_LOG_V(DEBUG, TAG, "Out of memory");
+        OIC_LOG(DEBUG, TAG, "Out of memory");
         OICFree(list);
         return NULL;
     }
@@ -133,7 +133,7 @@ uint32_t u_arraylist_length(const u_arraylist_t *list)
 {
     if (NULL == list)
     {
-        OIC_LOG_V(DEBUG, TAG, "Invalid Parameter");
+        OIC_LOG(DEBUG, TAG, "Invalid Parameter");
         return 0;
     }
     return list->length;
similarity index 66%
rename from resource/csdk/connectivity/inc/caedrcore.h
rename to resource/csdk/connectivity/inc/caedrclient.h
index 562d74d..6a39313 100644 (file)
@@ -37,27 +37,9 @@ extern "C"
 {
 #endif
 
-typedef struct connected_state {
-    char address[CA_MACADDR_SIZE];
-    uint32_t state;
-} state_t;
+void CAEDRJniSetContext(jobject context);
 
-/**
- * @enum CAAdapterServerType_t
- * @brief Enum for defining different server types.
- */
-typedef enum
-{
-    CA_UNICAST_SERVER = 0,      /**< Unicast Server */
-    CA_MULTICAST_SERVER,        /**< Multicast Server */
-    CA_SECURED_UNICAST_SERVER   /**< Secured Unicast Server */
-} CAAdapterServerType_t;
-
-typedef void (*CAPacketReceiveCallback)(const char *address, const char *data);
-
-void CAEDRClientJNISetContext(JNIEnv *env, jobject context);
-
-void CAEDRCreateJniInterfaceObject();
+void CAEDRCreateJNIInterfaceObject(jobject context);
 
 void CAEDRInitialize(u_thread_pool_t handle);
 
@@ -69,16 +51,6 @@ int32_t CAEDRSendUnicastMessage(const char *address, const char *data, uint32_t
 
 int32_t CAEDRSendMulticastMessage(const char *data, uint32_t dataLen);
 
-int32_t CAEDRStartUnicastServer(const char *address, bool isSecured);
-
-int32_t CAEDRStartMulticastServer(bool isSecured);
-
-int32_t CAEDRStopUnicastServer(int32_t serverID);
-
-int32_t CAEDRStopMulticastServer(int32_t serverID);
-
-void CAEDRSetCallback(CAPacketReceiveCallback callback);
-
 CAResult_t CAEDRGetInterfaceInfo(char **address);
 
 void CAEDRGetLocalAddress(char** address);
@@ -92,32 +64,11 @@ int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char *data, uint32_t da
  */
 void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uint32_t id);
 
-int CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type);
-
-jobject CAEDRNativeListen(JNIEnv *env);
-
-void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject);
-
 void CAEDRNativeConnect(JNIEnv *env, const char* address, uint32_t id);
 
 void CAEDRNativeSocketClose(JNIEnv *env, const char* address, uint32_t id);
 
 /**
- * BT Common Method : JNI
- */
-jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj);
-
-jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv *env);
-
-jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env);
-
-jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env);
-
-jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env);
-
-jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice);
-
-/**
  * BT State List
  */
 void CAEDRNativeCreateDeviceStateList();
@@ -155,6 +106,7 @@ uint32_t CAEDRGetSocketListLength();
 
 void CAEDRReorderingDeviceSocketList(uint32_t index);
 
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
index ad211d0..a92236e 100644 (file)
@@ -38,6 +38,23 @@ extern "C"
 #define OIC_EDR_SERVICE_ID "12341234-1C25-481F-9DFB-59193D238280"
 #endif //OIC_EDR_SERVICE_ID
 
+
+typedef struct connected_state {
+    char address[CA_MACADDR_SIZE];
+    uint32_t state;
+} state_t;
+
+/**
+ * @enum CAAdapterServerType_t
+ * @brief Enum for defining different server types.
+ */
+typedef enum
+{
+    CA_UNICAST_SERVER = 0,      /**< Unicast Server */
+    CA_MULTICAST_SERVER,        /**< Multicast Server */
+    CA_SECURED_UNICAST_SERVER   /**< Secured Unicast Server */
+} CAAdapterServerType_t;
+
 /**
  * @struct CAEDRData
  * @brief Structure to maintain the information of data in message queue.
@@ -131,7 +148,7 @@ void CAEDRClientUnsetCallbacks(void);
  * @brief Used to initialize the EDR client module where mutex is initialized
  * @return NONE
  */
-void CAEDRInitializeClient();
+void CAEDRInitializeClient(u_thread_pool_t handle);
 
 /**
  * @brief Destroys the Device list and mutex.
@@ -191,7 +208,7 @@ CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info);
  * @retval #CA_STATUS_FAILED Operation failed
  *
  */
-CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD);
+CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD, u_thread_pool_t handle);
 
 /**
  * @brief  Stop RFCOMM server
diff --git a/resource/csdk/connectivity/inc/caedrserver.h b/resource/csdk/connectivity/inc/caedrserver.h
new file mode 100644 (file)
index 0000000..e6cc732
--- /dev/null
@@ -0,0 +1,112 @@
+/******************************************************************
+ *
+ * Copyright 2014 Samsung Electronics All Rights Reserved.
+ *
+ *
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************/
+
+/**
+ * @file caedrcore.h
+ * @brief This file contains the APIs for BT EDR communications.
+ */
+#ifndef __CA_EDRCORE_H_
+#define __CA_EDRCORE_H_
+
+#include <stdbool.h>
+
+#include "cacommon.h"
+#include "uthreadpool.h"
+#include "jni.h"
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef void (*CAPacketReceiveCallback)(const char *address, const char *data);
+
+
+//getting jvm
+void CAEDRServerJniInit(JNIEnv *env, JavaVM *jvm);
+
+void CAEDRServerInitialize(u_thread_pool_t handle);
+
+void CAEDRServerTerminate();
+
+int32_t CAEDRStartUnicastServer(const char *address, bool isSecured);
+
+int32_t CAEDRStartMulticastServer(bool isSecured);
+
+int32_t CAEDRStopUnicastServer(int32_t serverID);
+
+int32_t CAEDRStopMulticastServer(int32_t serverID);
+
+/**
+ * EDR Method
+ */
+uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type);
+
+jobject CAEDRNativeListen(JNIEnv *env);
+
+void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject);
+
+void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id);
+
+/**
+ * BT State List
+ */
+void CAEDRServerNativeCreateDeviceStateList();
+
+void CAEDRServerUpdateDeviceState(uint32_t state, const char* address);
+
+void CAEDRServerNativeAddDeviceStateToList(state_t* state);
+
+jboolean CAEDRServerNativeIsDeviceInList(const char *remoteAddress);
+
+void CAEDRServerNativeRemoveAllDeviceState();
+
+void CAEDRServerNativeRemoveDevice(const char* remoteAddress);
+
+jboolean CAEDRServerIsConnectedDevice(const char* remoteAddress);
+
+void CAEDRServerReorderingDeviceList(uint32_t index);
+
+/**
+ * Bluetooth Socket Object List
+ */
+void CAEDRServerNativeCreateDeviceSocketList();
+
+void CAEDRServerNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket);
+
+jboolean CAEDRServerNativeIsDeviceSocketInList(JNIEnv *env, const char *remoteAddress);
+
+void CAEDRServerNativeRemoveAllDeviceSocket(JNIEnv *env);
+
+void CAEDRServerNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket);
+
+jobject CAEDRServerNativeGetDeviceSocket(uint32_t idx);
+
+uint32_t CAEDRServerGetSocketListLength();
+
+void CAEDRServerReorderingDeviceSocketList(uint32_t index);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/resource/csdk/connectivity/inc/caedrutils.h b/resource/csdk/connectivity/inc/caedrutils.h
new file mode 100644 (file)
index 0000000..2c868db
--- /dev/null
@@ -0,0 +1,54 @@
+/******************************************************************
+*
+* Copyright 2014 Samsung Electronics All Rights Reserved.
+*
+*
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************/
+
+/**
+* @file caedrutils.h
+* @brief This file contains the APIs for BT communications.
+*/
+#ifndef __CA_EDRUTILES_H_
+#define __CA_EDRUTILES_H_
+
+#include "cacommon.h"
+#include "uthreadpool.h"
+#include "uarraylist.h"
+#include "jni.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj);
+
+jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv *env);
+
+jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env);
+
+jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env);
+
+jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env);
+
+jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
index bb3b9fb..727f011 100644 (file)
@@ -1,6 +1,6 @@
-diff -rupN RBL_nRF8001_old/RBL_nRF8001.cpp RBL_nRF8001_new/RBL_nRF8001.cpp
---- RBL_nRF8001_old/RBL_nRF8001.cpp    2015-01-06 15:38:21.000000000 +0530
-+++ RBL_nRF8001_new/RBL_nRF8001.cpp    2015-01-06 15:39:20.000000000 +0530
+diff -rupN RBL_nRF8001_old/RBL_nRF8001.cpp RBL_nRF8001/RBL_nRF8001.cpp
+--- RBL_nRF8001_old/RBL_nRF8001.cpp    2015-01-13 12:25:32.000000000 +0530
++++ RBL_nRF8001/RBL_nRF8001.cpp        2015-01-13 12:40:41.740244741 +0530
 @@ -22,7 +22,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOU
  #endif
  
@@ -31,6 +31,32 @@ diff -rupN RBL_nRF8001_old/RBL_nRF8001.cpp RBL_nRF8001_new/RBL_nRF8001.cpp
      aci_state.aci_setup_info.num_setup_msgs     = NB_SETUP_MESSAGES;
  
      /*
+@@ -159,7 +162,7 @@ void ble_begin()
+ static volatile byte ack = 0;
+ void ble_write(unsigned char data)
+-{         
++{
+     if(tx_buffer_len == MAX_TX_BUFF)
+     {
+             return;
+@@ -199,13 +202,13 @@ unsigned char ble_connected()
+ }
+ void ble_set_name(char *name)
+-{       
++{
+     unsigned char len=0;
+-    
++
+     len = strlen(name);
+     if(len > 10)
+     {
+-        Serial.print("the new name is too long");        
++        Serial.print("the new name is too long");
+     }
+     else
+     {
 @@ -236,6 +239,10 @@ void ble_reset(uint8_t reset_pin)
  void ble_disconnect(void)
  {
@@ -83,7 +109,7 @@ diff -rupN RBL_nRF8001_old/RBL_nRF8001.cpp RBL_nRF8001_new/RBL_nRF8001.cpp
                  break;
  
              case ACI_EVT_CONNECTED:
-@@ -471,3 +505,7 @@ void ble_do_events()
+@@ -471,3 +505,12 @@ void ble_do_events()
  #endif
  }
  
@@ -91,23 +117,20 @@ diff -rupN RBL_nRF8001_old/RBL_nRF8001.cpp RBL_nRF8001_new/RBL_nRF8001.cpp
 +{
 +    return gLeAddress;
 +}
-diff -rupN RBL_nRF8001_old/RBL_nRF8001.h RBL_nRF8001_new/RBL_nRF8001.h
---- RBL_nRF8001_old/RBL_nRF8001.h      2015-01-06 15:38:21.000000000 +0530
-+++ RBL_nRF8001_new/RBL_nRF8001.h      2015-01-06 14:48:20.000000000 +0530
-@@ -48,6 +48,7 @@ void ble_set_pins(uint8_t reqn, uint8_t
++
++void ble_radio_reset()
++{
++    lib_aci_radio_reset();
++}
+diff -rupN RBL_nRF8001_old/RBL_nRF8001.h RBL_nRF8001/RBL_nRF8001.h
+--- RBL_nRF8001_old/RBL_nRF8001.h      2015-01-13 12:25:32.000000000 +0530
++++ RBL_nRF8001/RBL_nRF8001.h  2015-01-13 12:40:41.740244741 +0530
+@@ -48,6 +48,8 @@ void ble_set_pins(uint8_t reqn, uint8_t
  unsigned char ble_busy();
  void ble_reset(uint8_t reset_pin);
  void ble_disconnect(void);
 +unsigned char* ble_getAddress();
++void ble_radio_reset();
  
  #endif
  
-Binary files RBL_nRF8001_old/SI/Untitled Project.IAB and RBL_nRF8001_new/SI/Untitled Project.IAB differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.IAD and RBL_nRF8001_new/SI/Untitled Project.IAD differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.IMB and RBL_nRF8001_new/SI/Untitled Project.IMB differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.IMD and RBL_nRF8001_new/SI/Untitled Project.IMD differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.PFI and RBL_nRF8001_new/SI/Untitled Project.PFI differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.PO and RBL_nRF8001_new/SI/Untitled Project.PO differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.PR and RBL_nRF8001_new/SI/Untitled Project.PR differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.PRI and RBL_nRF8001_new/SI/Untitled Project.PRI differ
-Binary files RBL_nRF8001_old/SI/Untitled Project.PS and RBL_nRF8001_new/SI/Untitled Project.PS differ
index 8673c4d..5983522 100644 (file)
@@ -638,6 +638,8 @@ void request_handler(const CARemoteEndpoint_t *object, const CARequestInfo_t *re
     printf(object->addressInfo.IP.port);
     printf("data: ");
     printf(requestInfo->info.payload);
+    printf("Type: ");
+    printf(requestInfo->info.type);
 
     if (requestInfo->info.options)
     {
@@ -663,6 +665,8 @@ void response_handler(const CARemoteEndpoint_t *object, const CAResponseInfo_t *
     printf((object != NULL) ? object->resourceUri : "");
     printf("data: ");
     printf((responseInfo != NULL) ? responseInfo->info.payload : "");
+    printf("Type: ");
+    printf(responseInfo->info.type);
     printf("res result=");
     printf(responseInfo->result);
 }
index bcfb7ca..d11b2cf 100644 (file)
@@ -18,6 +18,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
  *
  */
 
+
+////////////////////////////////////////////////////////////
+//
+// This file can be used internal purpose only
+// Do NOT use this file to test.
+//
+////////////////////////////////////////////////////////////
+
 #ifdef __ARDUINO_BLE__
 #include <logger.h>
 
index d02950b..172d830 100644 (file)
@@ -401,7 +401,8 @@ void find_resource()
     printf("ex) /a/light\n");
     printf("reference uri : ");
 
-    gets(buf);
+    if(gets(buf) == NULL)
+        return;
 
     // create token
     CAToken_t token = NULL;
@@ -454,7 +455,8 @@ void send_request()
     }
 
     printf("Do you want to send secure request ?.... enter (0/1): ");
-    gets(secureRequest);
+    if( gets(secureRequest) == NULL)
+        return;
     if ('1' == secureRequest[0])
     {
         printf("Enter the URI like below....\n");
@@ -468,7 +470,8 @@ void send_request()
     }
 
     char uri[MAX_BUF_LEN] = {'\0'};
-    gets(uri);
+    if( gets(uri) == NULL)
+        return ;
 
     // create remote endpoint
     CARemoteEndpoint_t *endpoint = NULL;
@@ -489,7 +492,8 @@ void send_request()
     printf("0:CON, 1:NON\n");
     printf("select message type : ");
 
-    gets(buf);
+    if( gets(buf) == NULL)
+        return ;
 
     CAMessageType_t msgType = (buf[0] == '0' || buf[0] == '1') ? buf[0] - '0' : 0;
 
@@ -616,7 +620,8 @@ void send_request_all()
     printf("10:11:12:13:45:45/resource_uri ( for BT )\n");
     printf("uri : ");
 
-    gets(buf);
+    if( gets(buf) == NULL)
+        return ;
 
     // create remote endpoint
     CARemoteEndpoint_t *endpoint = NULL;
@@ -763,7 +768,8 @@ void send_notification()
     printf("10:11:12:13:45:45/resource_uri ( for BT )\n");
     printf("uri : ");
 
-    gets(buf);
+    if( gets(buf) == NULL)
+        return ;
 
     // create remote endpoint
     CARemoteEndpoint_t *endpoint = NULL;
@@ -819,7 +825,8 @@ void select_network()
     printf("select : ");
 
     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
-    gets(buf);
+    if( gets(buf) == NULL)
+        return;
 
     int number = buf[0] - '0';
 
@@ -852,7 +859,8 @@ void unselect_network()
     printf("select : ");
 
     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
-    gets(buf);
+    if( gets(buf) == NULL)
+        return ;
 
     int number = buf[0] - '0';
 
@@ -897,7 +905,8 @@ char get_menu()
 
     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
 
-    gets(buf);
+    if( gets(buf) == NULL)
+        return 'q';
 
     return buf[0];
 }
@@ -1229,7 +1238,8 @@ CAResult_t get_network_type()
     printf("select : ");
 
     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
-    gets(buf);
+    if( gets(buf) == NULL)
+        return CA_NOT_SUPPORTED ;
 
     int number = buf[0] - '0';
 
index 616383d..71e09ea 100644 (file)
@@ -190,6 +190,12 @@ int main()
 
     process();
 
+    if (gLastRequestToken != NULL)
+    {
+        CADestroyToken(gLastRequestToken);
+    }
+    gLastRequestToken = NULL;
+
     CATerminate();
 #ifdef __WITH_DTLS__
     clearDtlsCredentialInfo();
@@ -406,6 +412,11 @@ void find_resource()
     {
         printf("find resource to %s URI\n", buf);
 
+        if (gLastRequestToken != NULL)
+        {
+            CADestroyToken(gLastRequestToken);
+        }
+
         gLastRequestToken = token;
     }
 
@@ -518,6 +529,11 @@ void send_request()
         CADestroyToken(token);
     }
 
+    if (requestData.payload != NULL)
+    {
+        free(requestData.payload);
+    }
+
     // destroy remote endpoint
     CADestroyRemoteEndpoint(endpoint);
     printf("=============================================\n");
@@ -656,6 +672,12 @@ void advertise_resource()
 
     CAAdvertiseResource(buf, token, headerOpt, (uint8_t)optionNum);
 
+    // delete token
+    if (token != NULL)
+    {
+        CADestroyToken(token);
+    }
+
     free(headerOpt);
 
 }
@@ -833,13 +855,11 @@ void get_network_info()
 {
     int index;
 
-    CALocalConnectivity_t *tempInfo;
+    CALocalConnectivity_t *tempInfo = NULL;
     uint32_t tempSize = 0;
 
-    tempInfo = (CALocalConnectivity_t *) malloc(sizeof(CALocalConnectivity_t));
-
     CAGetNetworkInformation(&tempInfo, &tempSize);
-    if (!tempSize)
+    if (tempInfo == NULL || tempSize <= 0)
     {
         printf("network not connected\n");
         return;
@@ -847,31 +867,27 @@ void get_network_info()
 
     printf("################## Network Information #######################\n");
     printf("network info total size is %d\n\n", tempSize);
+
     for (index = 0; index < tempSize; index++)
     {
-        if (tempInfo == NULL)
-        {
-            break;
-        }
-
-        printf("Type: %d\n", tempInfo->type);
-        printf("Address: %s\n", tempInfo->addressInfo.IP.ipAddress);
-        printf("Port: %d\n", tempInfo->addressInfo.IP.port);
-        printf("Secured: %d\n\n", tempInfo->isSecured);
+        printf("Type: %d\n", tempInfo[index].type);
+        printf("Address: %s\n", tempInfo[index].addressInfo.IP.ipAddress);
+        printf("Port: %d\n", tempInfo[index].addressInfo.IP.port);
+        printf("Secured: %d\n\n", tempInfo[index].isSecured);
 
-        if (CA_TRUE == tempInfo->isSecured)
+        if (CA_TRUE == tempInfo[index].isSecured)
         {
-            gLocalSecurePort = tempInfo->addressInfo.IP.port;
+            gLocalSecurePort = tempInfo[index].addressInfo.IP.port;
         }
         else
         {
-            gLocalUnicastPort = tempInfo->addressInfo.IP.port;
+            gLocalUnicastPort = tempInfo[index].addressInfo.IP.port;
         }
-
-        tempInfo++;
     }
 
-    //free(tempInfo);
+    // free
+    free(tempInfo);
+
     printf("##############################################################");
 }
 
@@ -1181,6 +1197,7 @@ CAResult_t get_network_type()
     }
 
     printf("\n=============================================\n");
-    return CA_STATUS_OK;
+
+    return CA_STATUS_FAILED;
 }
 
index 796fd18..64d29a6 100644 (file)
 *
 ******************************************************************/
 
+//***************************************************************
+//
+// This file is for internal test only.
+// Do NOT use this file to test CA on Tizen.
+//
+//***************************************************************
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
index a7a278e..7ccba06 100644 (file)
@@ -34,7 +34,7 @@ CALocalConnectivity_t *CAAdapterCreateLocalEndpoint(CAConnectivityType_t type,
                                   OICMalloc(sizeof(CALocalConnectivity_t));
     if (NULL == info)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
         return NULL;
     }
     memset(info, 0, sizeof(CALocalConnectivity_t));
@@ -70,7 +70,7 @@ CALocalConnectivity_t *CAAdapterCopyLocalEndpoint(CALocalConnectivity_t *connect
                                   OICMalloc(sizeof(CALocalConnectivity_t));
     if (NULL == info)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
         return NULL;
     }
     memset(info, 0, sizeof(CALocalConnectivity_t));
@@ -117,7 +117,7 @@ CARemoteEndpoint_t *CAAdapterCreateRemoteEndpoint(CAConnectivityType_t type,
                                OICMalloc(sizeof(CARemoteEndpoint_t));
     if (NULL == info)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
         return NULL;
     }
     memset(info, 0, sizeof(CARemoteEndpoint_t));
@@ -158,7 +158,7 @@ CARemoteEndpoint_t *CAAdapterCopyRemoteEndpoint(const CARemoteEndpoint_t *remote
                                OICMalloc(sizeof(CARemoteEndpoint_t));
     if (NULL == info)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Memory allocation failed !");
         return NULL;
     }
     memset(info, 0, sizeof(CARemoteEndpoint_t));
@@ -228,7 +228,7 @@ bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2,
     char *ipAdrs1 = OICStrdup(ipAddress1);
     if (!ipAdrs1)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
         return false;
     }
 
@@ -251,7 +251,7 @@ bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2,
     char *ipAdrs2 = OICStrdup(ipAddress2);
     if (!ipAdrs2)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
         OICFree(ipAdrs1);
         return false;
     }
@@ -275,7 +275,7 @@ bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2,
     char *nMask = OICStrdup(netMask);
     if (!nMask)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Failed to get dup string!");
         OICFree(ipAdrs1);
         OICFree(ipAdrs2);
         return false;
@@ -303,7 +303,7 @@ bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2,
 
     if (ip1TokenCount < 3 || ip2TokenCount < 3 || maskTokenCount < 3)
     {
-        OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG, "Address or mask is invalid!");
+        OIC_LOG(ERROR, CA_ADAPTER_UTILS_TAG, "Address or mask is invalid!");
         return false;
     }
 
index 587e501..b9835d3 100644 (file)
@@ -46,7 +46,7 @@ CAResult_t CAGenerateHeader(char *header, uint32_t length)
 {
     OIC_LOG(DEBUG, CA_MSG_PARSER_TAG, "IN");
 
-    VERIFY_NON_NULL(header, NULL, "header is NULL");
+    VERIFY_NON_NULL(header, CA_MSG_PARSER_TAG, "header is NULL");
 
     memset(header, 0x0, sizeof(char) * 2);
 
@@ -63,7 +63,7 @@ uint32_t CAParseHeader(const char *header)
 {
     OIC_LOG(DEBUG, CA_MSG_PARSER_TAG, "IN");
 
-    VERIFY_NON_NULL(header, NULL, "header is NULL");
+    VERIFY_NON_NULL(header, CA_MSG_PARSER_TAG, "header is NULL");
     uint32_t dataLen = 0;
 
     char localHeader[CA_HEADER_LENGTH];
diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedradapter.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedradapter.c
deleted file mode 100644 (file)
index ecc6fac..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/******************************************************************
- *
- * Copyright 2014 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "caedradapter.h"
-#include "logger.h"
-
-#define TAG PCF("CA")
-
-static CANetworkPacketReceivedCallback gEDRReceivedCallback = NULL;
-static u_thread_pool_t gThreadPoolHandle = NULL;
-
-CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
-        CANetworkPacketReceivedCallback reqRespCallback, CANetworkChangeCallback netCallback,
-        u_thread_pool_t handle)
-{
-    gEDRReceivedCallback = reqRespCallback;
-
-    return CA_STATUS_OK;
-}
-
-CAResult_t CAStartEDR()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAStartEDR");
-
-    return CA_STATUS_OK;
-}
-
-CAResult_t CAStartEDRListeningServer()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAStartEDRListeningServer");
-
-    return CA_STATUS_OK;
-}
-
-CAResult_t CAStartEDRDiscoveryServer()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAStartEDRDiscoveryServer");
-
-    return CA_STATUS_OK;
-}
-
-uint32_t CASendEDRUnicastData(const CARemoteEndpoint_t* endpoint, void* data, uint32_t dataLen)
-{
-    OIC_LOG_V(DEBUG, TAG, "CASendEDRUnicastData");
-
-    return 0;
-}
-
-uint32_t CASendEDRMulticastData(void* data, uint32_t dataLen)
-{
-    OIC_LOG_V(DEBUG, TAG, "CASendEDRMulticastData");
-
-    return 0;
-}
-
-CAResult_t CAGetEDRInterfaceInformation(CALocalConnectivity_t** info, uint32_t* size)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAGetEDRInterfaceInformation");
-
-    return CA_STATUS_OK;
-}
-
-CAResult_t CAReadEDRData()
-{
-    OIC_LOG_V(DEBUG, TAG, "Read EDR Data");
-
-    return CA_STATUS_OK;
-}
-
-CAResult_t CAStopEDR()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAStopEDR");
-
-    return CA_STATUS_OK;
-}
-
-void CATerminateEDR()
-{
-    OIC_LOG_V(DEBUG, TAG, "CATerminateEDR");
-}
@@ -2,13 +2,17 @@
 #include <string.h>
 #include <jni.h>
 
-#include "caedrcore.h"
+#include "caedrinterface.h"
+#include "caedrutils.h"
+#include "caedrclient.h"
+#include "caleserver.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "uthreadpool.h" /* for thread pool */
 #include "umutex.h"
 #include "uarraylist.h"
 #include "caadapterutils.h"
+#include "com_iotivity_jar_CALeInterface.h"
 
 //#define DEBUG_MODE
 #define TAG PCF("CA_EDR_CLIENT")
@@ -21,12 +25,11 @@ static const char *CLASSPATH_BT_UUID = "java/util/UUID";
 static const uint32_t STATE_CONNECTED = 1;
 static const uint32_t STATE_DISCONNECTED = 0;
 
-static const uint32_t MAX_PDU_BUFFER = 1400;
+static const uint32_t MAX_PDU_BUFFER = 1024;
 
 static u_arraylist_t *gdeviceStateList = NULL;
 static u_arraylist_t *gdeviceObjectList = NULL;
 
-static CAPacketReceiveCallback gPacketReceiveCallback = NULL;
 static u_thread_pool_t gThreadPoolHandle = NULL;
 
 static JavaVM *g_jvm;
@@ -93,19 +96,73 @@ typedef struct
     bool *stopFlag;
 } CAAdapterAcceptThreadContext_t;
 
+// temp method
 
-static void CAReceiveHandler(void *data)
+CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+void CAEDRTerminateClient()
 {
     OIC_LOG(DEBUG, TAG, "IN");
-    // Input validation
-    VERIFY_NON_NULL_VOID(data, TAG, "Invalid thread context");
+    CAEDRTerminate();
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+CAResult_t CAEDRManagerReadData(void)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_NOT_SUPPORTED;
+}
+
+CAResult_t CAEDRClientSendUnicastData(const char *remoteAddress, const char *serviceUUID,
+                                      void *data, uint32_t dataLength, uint32_t *sentLength)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+    CAEDRSendUnicastMessage(remoteAddress, (const char*) data, dataLength);
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+
+CAResult_t CAEDRClientSendMulticastData(const char *serviceUUID, void *data,
+                                        uint32_t dataLength, uint32_t *sentLength)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+    CAEDRSendMulticastMessage((const char*) data, dataLength);
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+void CAEDRClientUnsetCallbacks(void)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+}
+
+void CAEDRClientDisconnectAll(void)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+}
+
+CAResult_t CAEDRGetAdapterEnableState(CABool_t *state)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
 
     jboolean isAttached = FALSE;
     JNIEnv* env;
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRGetAdapterEnableState - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
 
         if(res != JNI_OK)
@@ -115,43 +172,36 @@ static void CAReceiveHandler(void *data)
         }
         isAttached = TRUE;
     }
-
-    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)data;
-
-    while (TRUE != *(ctx->stopFlag))
+    jboolean ret = CAEDRNativeIsEnableBTAdapter(env);
+    if(ret)
     {
-        uint32_t idx;
-
-        // if new socket object is added in socket list after below logic is ran.
-        // new socket will be started to read after next while loop
-        uint32_t length = CAEDRGetSocketListLength();
-        for(idx = 0 ; idx > length ; idx++)
-        {
-            CAEDRNativeReadData(env, idx, ctx->type);
-        }
+        *state = CA_TRUE;
+    }
+    else
+    {
+        *state = CA_FALSE;
     }
 
     if(isAttached)
         (*g_jvm)->DetachCurrentThread(g_jvm);
 
-    if(ctx)
-        OICFree(ctx);
-
-    OIC_LOG(DEBUG, TAG, "OUT");
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
 }
 
-static void CAAcceptHandler(void *data)
-{
-    int status;
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//FIXME getting context
 
-    OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread start");
+void CAEDRJniSetContext(jobject context)
+{
+    OIC_LOG_V(DEBUG, TAG, "caedrSetObject");
 
     jboolean isAttached = FALSE;
     JNIEnv* env;
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
 
         if(res != JNI_OK)
@@ -162,90 +212,62 @@ static void CAAcceptHandler(void *data)
         isAttached = TRUE;
     }
 
-    jobject jni_obj_BTSeverSocket = CAEDRNativeListen(env);
-    if(!jni_obj_BTSeverSocket) {
-        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: jni_obj_BTSeverSocket is null");
+    gContext = (*env)->NewGlobalRef(env, context);
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+}
 
-        if(isAttached)
-            (*g_jvm)->DetachCurrentThread(g_jvm);
+void CAEDRCreateJNIInterfaceObject(jobject context)
+{
+    JNIEnv* env;
+    OIC_LOG_V(DEBUG, TAG, "[EDRCore] CAEDRCreateJNIInterfaceObject");
 
+    if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get JNIEnv pointer");
         return;
     }
 
-    CAAdapterAcceptThreadContext_t *ctx = (CAAdapterAcceptThreadContext_t *)data;
-
-    while (TRUE != *(ctx->stopFlag))
+    //getApplicationContext
+    jclass contextClass = (*env)->FindClass(env, "android/content/Context");
+    if (contextClass == 0)
     {
-        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread running");
-        CAEDRNativeAccept(env, jni_obj_BTSeverSocket);
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get context object class");
+        return;
     }
 
-    if(isAttached)
-        (*g_jvm)->DetachCurrentThread(g_jvm);
-
-    if(ctx)
-        OICFree(ctx);
-
-    OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread finish");
+    jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass,
+            "getApplicationContext", "()Landroid/content/Context;");
+    if (getApplicationContextMethod == 0)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get getApplicationContext method");
+        return;
+    }
 
-    return;
-}
+    jobject gApplicationContext = (*env)->CallObjectMethod(env, context, getApplicationContextMethod);
+    OIC_LOG_V(DEBUG, TAG, "[WIFICore] Saving Android application context object %p", gApplicationContext);
 
-////////////////////////////////////////////////////////////////////////////////////////////////////
-//FIXME getting context
-void CAEDRClientJNISetContext(JNIEnv *env, jobject context)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRClientJNISetContext");
+   //Create WiFiInterface instance
+    jclass WiFiJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
+    if (!WiFiJniInterface)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface class");
+        return;
+    }
 
-    if(context == NULL)
+    jmethodID WiFiInterfaceConstructorMethod = (*env)->GetMethodID(env,
+            WiFiJniInterface, "<init>", "(Landroid/content/Context;)V");
+    if (!WiFiInterfaceConstructorMethod)
     {
-        OIC_LOG_V(DEBUG, TAG, "context is null");
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface constructor method");
         return;
     }
 
-    gContext = (*env)->NewGlobalRef(env, context);
-}
+    (*env)->NewObject(env, WiFiJniInterface, WiFiInterfaceConstructorMethod, gApplicationContext);
+    OIC_LOG_V(DEBUG, TAG, "[EDRCore] Create CAWiFiInterface instance");
+    OIC_LOG_V(DEBUG, TAG, "[EDRCore] NewObject Success");
 
-void CAEDRCreateJniInterfaceObject()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRCreateJniInterfaceObject");
-
-//    jboolean isAttached = FALSE;
-//    JNIEnv* env;
-//    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
-//    if(res != JNI_OK)
-//    {
-//        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
-//        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
-//
-//        if(res != JNI_OK)
-//        {
-//            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
-//            return;
-//        }
-//        isAttached = TRUE;
-//    }
-//
-//    jclass LeJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
-//    if (!LeJniInterface)
-//    {
-//        OIC_LOG_V(DEBUG, TAG, "Could not get CAEDRInterface class");
-//        return;
-//    }
-//
-//    jmethodID LeInterfaceConstructorMethod =
-//            (*env)->GetMethodID(env, LeJniInterface, "<init>", "(Landroid/content/Context;)V");
-//    if (!LeInterfaceConstructorMethod)
-//    {
-//        OIC_LOG_V(DEBUG, TAG, "Could not get CAEDRInterface constructor method");
-//        return;
-//    }
-//
-//    (*env)->NewObject(env, LeJniInterface, LeInterfaceConstructorMethod, gContext);
-//    OIC_LOG_V(DEBUG, TAG, "Create CAEDRInterface instance");
-//
-//    if(isAttached)
-//        (*g_jvm)->DetachCurrentThread(g_jvm);
 }
 
 static void CAEDRDestroyMutex()
@@ -328,7 +350,7 @@ void CAEDRInitialize(u_thread_pool_t handle)
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
 
         if(res != JNI_OK)
@@ -339,29 +361,20 @@ void CAEDRInitialize(u_thread_pool_t handle)
         isAttached = TRUE;
     }
 
+    jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
+    if(jni_address)
+    {
+        const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
+        OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
+    }
+
     CAEDRNativeCreateDeviceStateList();
     CAEDRNativeCreateDeviceSocketList();
 
     if(isAttached)
         (*g_jvm)->DetachCurrentThread(g_jvm);
 
-//    CAEDRCreateJniInterfaceObject(); /* create java CAEDRInterface instance*/
-
-    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
-                                               OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
-    if (!ctx)
-    {
-        OIC_LOG(ERROR, TAG, "Out of memory!");
-        return;
-    }
-
-    ctx->stopFlag = &gStopAccept;
-    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAAcceptHandler, (void *)ctx))
-    {
-        OIC_LOG(ERROR, TAG, "Failed to create read thread!");
-        OICFree((void *)ctx);
-        return;
-    }
+//    CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
 
     OIC_LOG(DEBUG, TAG, "OUT");
 }
@@ -375,7 +388,7 @@ void CAEDRTerminate()
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRTerminate - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
 
         if(res != JNI_OK)
@@ -396,10 +409,6 @@ void CAEDRTerminate()
     // delete mutex
     CAEDRDestroyMutex();
 
-    if(gContext)
-    {
-        (*env)->DeleteGlobalRef(env, gContext);
-    }
     CAEDRNativeRemoveAllDeviceState();
     CAEDRNativeRemoveAllDeviceSocket(env);
 }
@@ -408,6 +417,8 @@ void CAEDRCoreJniInit(JNIEnv *env, JavaVM* jvm)
 {
     OIC_LOG_V(DEBUG, TAG, "CAEdrClientJniInit");
     g_jvm = jvm;
+
+    CAEDRServerJniInit(env, jvm);
 }
 
 int32_t CAEDRSendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
@@ -427,7 +438,7 @@ int32_t CAEDRSendMulticastMessage(const char* data, uint32_t dataLen)
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRSendMulticastMessage - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
 
         if(res != JNI_OK)
@@ -440,120 +451,16 @@ int32_t CAEDRSendMulticastMessage(const char* data, uint32_t dataLen)
 
     CAEDRSendMulticastMessageImpl(env, data, dataLen);
 
-    if(isAttached)
-        (*g_jvm)->DetachCurrentThread(g_jvm);
-
-    return 1;
-}
-
-int32_t CAEDRStartUnicastServer(const char* address, bool isSecured)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRStartUnicastServer(%s)", address);
-
-    u_mutex_lock(gMutexUnicastServer);
-
-    /**
-      * The task to listen for data from unicast is added to the thread pool.
-      * This is a blocking call is made where we try to receive some data..
-      * We will keep waiting until some data is received.
-      * This task will be terminated when thread pool is freed on stopping the adapters.
-      * Thread context will be freed by thread on exit.
-      */
-    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
-                                           OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
-    if (!ctx)
-    {
-        OIC_LOG(ERROR, TAG, "Out of memory!");
-        u_mutex_unlock(gMutexUnicastServer);
-        return CA_MEMORY_ALLOC_FAILED;
-    }
-
-    // FIXME
-    isSecured = FALSE;
-    ctx->stopFlag = &gStopUnicast;
-    ctx->type = isSecured ? CA_SECURED_UNICAST_SERVER : CA_UNICAST_SERVER;
-    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
-    {
-        OIC_LOG(ERROR, TAG, "Failed to create read thread!");
-        u_mutex_unlock(gMutexUnicastServer);
-        OICFree((void *)ctx);
-        return CA_STATUS_FAILED;
-    }
-    u_mutex_unlock(gMutexUnicastServer);
-
-    OIC_LOG(DEBUG, TAG, "OUT");
-    return CA_STATUS_OK;
-}
+    OIC_LOG_V(DEBUG, TAG, "sent data");
 
-int32_t CAEDRStartMulticastServer(bool isSecured)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRStartMulticastServer");
-
-    u_mutex_lock(gMutexMulticastServer);
-
-    /**
-      * The task to listen to data from multicast socket is added to the thread pool.
-      * This is a blocking call is made where we try to receive some data.
-      * We will keep waiting until some data is received.
-      * This task will be terminated when thread pool is freed on stopping the adapters.
-      * Thread context will be freed by thread on exit.
-      */
-    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
-                                           OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
-    if (!ctx)
-    {
-        OIC_LOG(ERROR, TAG, "Out of memory!");
-        u_mutex_unlock(gMutexMulticastServer);
-
-        return CA_MEMORY_ALLOC_FAILED;
-    }
-
-    ctx->stopFlag = &gStopMulticast;
-    ctx->type = CA_MULTICAST_SERVER;
-
-    gStopMulticast = FALSE;
-    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
+    if(isAttached)
     {
-        OIC_LOG(ERROR, TAG, "thread_pool_add_task failed!");
-
-        gStopMulticast = TRUE;
-        u_mutex_unlock(gMutexMulticastServer);
-
-        return CA_STATUS_FAILED;
+        OIC_LOG_V(DEBUG, TAG, "DetachCurrentThread");
+//        (*g_jvm)->DetachCurrentThread(g_jvm);
     }
-    u_mutex_unlock(gMutexMulticastServer);
-
-    OIC_LOG(DEBUG, TAG, "OUT");
-    return CA_STATUS_OK;
-}
-
-int32_t CAEDRStopUnicastServer(int32_t serverID)
-{
-    OIC_LOG(DEBUG, TAG, "CAEDRStopUnicastServer");
-
-    u_mutex_lock(gMutexUnicastServer);
-    gStopUnicast = TRUE;
-    u_mutex_unlock(gMutexUnicastServer);
-
-    return 0;
-}
-
-int32_t CAEDRStopMulticastServer(int32_t serverID)
-{
-    OIC_LOG(DEBUG, TAG, "CAEDRStopMulticastServer");
 
-    u_mutex_lock(gMutexMulticastServer);
-    gStopMulticast = true;
-    u_mutex_unlock(gMutexMulticastServer);
-
-    OIC_LOG_V(INFO, TAG, "Multicast server stopped");
-
-    return 0;
-}
-
-void CAEDRSetCallback(CAPacketReceiveCallback callback)
-{
-    gPacketReceiveCallback = callback;
+    OIC_LOG_V(DEBUG, TAG, "OUT - CAEDRSendMulticastMessage");
+    return 1;
 }
 
 CAResult_t CAEDRGetInterfaceInfo(char **address)
@@ -569,7 +476,7 @@ void CAEDRGetLocalAddress(char** address)
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRGetLocalAddress - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
         if(res != JNI_OK)
         {
@@ -605,7 +512,7 @@ int32_t CAEDRSendUnicastMessageImpl(const char* address, const char* data, uint3
     jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
     if(res != JNI_OK)
     {
-        OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
+        OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessageImpl - Could not get JNIEnv pointer");
         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
         if(res != JNI_OK)
         {
@@ -636,6 +543,7 @@ int32_t CAEDRSendUnicastMessageImpl(const char* address, const char* data, uint3
     jsize i;
     for( i = 0 ; i < length ; i++ )
     {
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] start to check device");
         // get name, address from BT device
         jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
 
@@ -673,15 +581,6 @@ int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t da
 {
     OIC_LOG_V(DEBUG, TAG, "CASendMulticastMessageImpl, send to, data: %s, %d", data, dataLen);
 
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] set byteArray for data");
-    if(gSendBuffer)
-    {
-        (*env)->DeleteGlobalRef(env, gSendBuffer);
-    }
-    jbyteArray jni_arr = (*env)->NewByteArray(env, dataLen);
-    (*env)->SetByteArrayRegion(env, jni_arr, 0, dataLen, (jbyte*)data);
-    gSendBuffer = (jbyteArray)(*env)->NewGlobalRef(env, jni_arr);
-
     // get bonded device list
     jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
     if(!jni_arrayPairedDevices)
@@ -763,14 +662,14 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
             }
             OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData: Get MethodID for i/o stream..%d", id);
 
-            jobject jni_socket = CAEDRNativeGetDeviceSocket(id);
-            if(!jni_socket)
+            jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
+            if(!jni_obj_socket)
             {
                 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_socket is not available");
                 return;
             }
 
-            jobject jni_obj_outputStream = (*env)->CallObjectMethod(env, jni_socket, jni_mid_getOutputStream);
+            jobject jni_obj_outputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getOutputStream);
             if(!jni_obj_outputStream)
             {
                 OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_obj_outputStream is null");
@@ -793,10 +692,12 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
                 return;
             }
 
-//          jbyte buf[BUFSIZE] = "aaaaaaaaaaassssssssssa";
+//            const char* tmpData = "HelloWorldHelloWorld..";
+//            size_t nread = 20;
+//            jbyteArray jni_arr = (*env)->NewByteArray(env, nread);
+//            (*env)->SetByteArrayRegion(env, jni_arr, 0, nread, (jbyte*)tmpData);
 
             jbyteArray jbuf;
-//          size_t nread = 20;
             int length = strlen(data);
             jbuf = (*env)->NewByteArray(env, length);
             (*env)->SetByteArrayRegion(env, jbuf, 0, length, (jbyte*)data);
@@ -812,6 +713,12 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
             }
 
             OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Success");
+
+            // remove socket to list
+            CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
+
+            // update state
+            CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
         }
         else
         {
@@ -820,9 +727,6 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
             OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: error!!");
             return;
         }
-
-        // close socket after data was sent
-        CAEDRNativeSocketClose(env, address, id);
     }
     else
     {
@@ -830,213 +734,6 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
     }
 }
 
-int CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type)
-{
-    if(!((*env)->ExceptionCheck(env)))
-    {
-        // check whether this socket object is connected or not.
-        jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
-        if(!jni_obj_socket)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: jni_socket is not available");
-            return -1;
-        }
-
-        jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket);
-        const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL);
-        if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: it is not connected yet..");
-            return -1;
-        }
-
-        // start to read through InputStream
-        jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
-        jmethodID jni_mid_getInputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getInputStream", "()Ljava/io/InputStream;");
-        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData:  get InputStream..%d", id);
-
-        jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getInputStream);
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData:  ready inputStream..");
-
-        jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
-        jmethodID jni_mid_read = (*env)->GetMethodID(env, jni_cid_InputStream, "read", "([BII)I");
-
-        jbyteArray jbuf = (*env)->NewByteArray(env, MAX_PDU_BUFFER);
-        jlong nread;
-        while ((nread = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_read, jbuf, (jint)0, MAX_PDU_BUFFER)) != -1)
-        {
-            if((*env)->ExceptionCheck(env))
-            {
-                OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: read Error!!!");
-                (*env)->ExceptionDescribe(env);
-                (*env)->ExceptionClear(env);
-                return -1;
-            }
-
-            jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: read %s", buf);
-            if (buf == NULL)
-            {
-                return -1;
-            }
-
-            switch (type)
-            {
-                case CA_UNICAST_SERVER:
-                case CA_MULTICAST_SERVER:
-                    // Notify data to upper layer
-                    if (gPacketReceiveCallback)
-                    {
-//                            gPacketReceiveCallback(srcIPAddress, srcPort, recvBuffer, recvLen, false);
-                    }
-                    break;
-#ifdef __WITH_DTLS__
-                case CA_SECURED_UNICAST_SERVER:
-                    break;
-#endif //__WITH_DTLS__
-                default:
-                    // Should never occur
-                    OIC_LOG_V(DEBUG, TAG, "Invalid server type");
-                    return -1;
-            }
-
-            (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
-            break;
-        }
-    }
-    else
-    {
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: env error!!");
-        return -1;
-    }
-
-    return 0;
-}
-
-jobject CAEDRNativeListen(JNIEnv *env)
-{
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen");
-
-    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
-        return NULL;
-    }
-
-    // get BTadpater
-    jmethodID jni_mid_getDefaultAdapter =(*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
-        return NULL;
-    }
-
-    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
-    if(!jni_obj_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTAdapter is null");
-        return NULL;
-    }
-
-    // get listen method ID
-    jmethodID jni_mid_listen = (*env)->GetMethodID(env, jni_cid_BTAdapter,
-            "listenUsingInsecureRfcommWithServiceRecord","(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;");
-    if(!jni_mid_listen)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
-        return NULL;
-    }
-    // listenUsingInsecureRfcommWithServiceRecord  / listenUsingRfcommWithServiceRecord
-    // setting UUID
-    jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
-    if(!jni_cid_uuid)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;");
-    if(!jni_mid_fromString)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_fromString is null");
-        return NULL;
-    }
-
-//  jstring uuid = (*env)->NewStringUTF(env, "0000111f-0000-1000-8000-00805f9b8033");
-    jstring jni_uuid = (*env)->NewStringUTF(env, "00000000-0000-0000-0000-0000cdab0000");
-    jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
-    if(!jni_obj_uuid)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_uuid is null");
-        return NULL;
-    }
-
-    // create socket
-    jstring jni_name = (*env)->NewStringUTF(env, "BluetoothTestSecure");
-    jobject jni_obj_BTSeverSocket = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_listen, jni_name, jni_obj_uuid);
-    if(!jni_obj_BTSeverSocket)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTSeverSocket is null");
-        return NULL;
-    }
-
-    gServerSocketObject = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
-
-    return jni_obj_BTSeverSocket;
-}
-
-void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
-{
-    if(severSocketObject != NULL)
-    {
-        jclass jni_cid_BTServerSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothServerSocket");
-        if(!jni_cid_BTServerSocket)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_cid_BTServerSocket is null");
-            return;
-        }
-
-        jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "accept", "()Landroid/bluetooth/BluetoothSocket;");
-        if(!jni_mid_accept)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_mid_accept is null");
-            return;
-        }
-
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: initiating accept...");
-
-        jobject jni_obj_BTSocket = NULL;
-        jni_obj_BTSocket = (*env)->CallObjectMethod(env, severSocketObject, jni_mid_accept);
-        if(!jni_obj_BTSocket)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_obj_BTSocket is null");
-            return;
-        }
-
-        // get remote address
-        jstring j_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_BTSocket);
-
-        const char* address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
-        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btAccept: address is %s", address);
-
-        // set socket to list
-        jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
-        CAEDRNativeAddDeviceSocketToList(env, jni_socket);
-
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: Accepted!!");
-
-        // update state
-        CAEDRUpdateDeviceState(STATE_CONNECTED, address);
-    }
-    else
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: severSocket is close previously");
-    }
-}
-
 void CAEDRNativeConnect(JNIEnv *env, const char* address, uint32_t id)
 {
     OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect..");
@@ -1207,234 +904,6 @@ void CAEDRNativeSocketClose(JNIEnv *env, const char* address, uint32_t id)
     OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
 }
 
-/**
- * BT common
- */
-
-// get address from bluetooth socket
-jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj)
-{
-    jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
-    if(!jni_cid_BTSocket)
-    {
-        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_cid_BTSocket is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTSocket, "getRemoteDevice",
-         "()Landroid/bluetooth/BluetoothDevice;");
-    if(!jni_mid_getRemoteDevice)
-    {
-        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_mid_getRemoteDevice is null");
-        return NULL;
-    }
-
-    jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, bluetoothSocketObj, jni_mid_getRemoteDevice);
-    if(!jni_obj_remoteBTDevice)
-    {
-        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_obj_remoteBTDevice is null");
-        return NULL;
-    }
-
-    jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
-    jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
-
-    jstring j_str_address = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, j_mid_getAddress);
-    if(j_str_address)
-    {
-        const char * address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
-        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: ~~ remote device address is %s", address);
-//      (*env)->ReleaseStringUTFChars(env, j_str_address, address);
-    } else {
-        return NULL;
-    }
-    return j_str_address;
-}
-
-jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
-{
-    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_cid_BTAdapter is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getDefaultAdapter =
-            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
-    if(!jni_mid_getDefaultAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getDefaultAdapter is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getAddress", METHODID_STRINGNONPARAM);
-    if(!jni_mid_getAddress)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getAddress is null");
-        return NULL;
-    }
-
-    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
-    if(!jni_obj_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_obj_BTAdapter is null");
-        return NULL;
-    }
-
-    jstring jni_str_address = (jstring)(*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getAddress);
-    if(!jni_str_address)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_str_address is null");
-        return NULL;
-    }
-
-    return jni_str_address;
-}
-
-jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
-{
-    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_cid_BTAdapter is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getDefaultAdapter =
-            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
-
-    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
-    if(!jni_obj_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: bluetooth adapter is null");
-        return NULL;
-    }
-
-    // Get a list of currently paired devices
-    jmethodID jni_mid_getBondedDevices = (*env)->GetMethodID(env, jni_cid_BTAdapter,
-            "getBondedDevices", "()Ljava/util/Set;");
-    if(!jni_mid_getBondedDevices)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_getBondedDevicesr is null");
-        return NULL;
-    }
-
-    jobject jni_obj_setPairedDevices = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getBondedDevices);
-    if(!jni_obj_setPairedDevices)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_obj_setPairedDevices is null");
-        return NULL;
-    }
-
-    // Convert the set to an object array
-    // object[] array = Set<BluetoothDevice>.toArray();
-    jclass jni_cid_Set = (*env)->FindClass(env,  "java/util/Set");
-    jmethodID jni_mid_toArray = (*env)->GetMethodID(env, jni_cid_Set, "toArray", "()[Ljava/lang/Object;");
-
-    if(!jni_mid_toArray)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_toArray is null");
-        return NULL;
-    }
-
-    jobjectArray jni_arrayPairedDevices = (jobjectArray)((*env)->CallObjectMethod(env,
-            jni_obj_setPairedDevices, jni_mid_toArray));
-    if(!jni_arrayPairedDevices)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_arrayPairedDevices is null");
-        return NULL;
-    }
-
-    return jni_arrayPairedDevices;
-}
-
-jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
-{
-    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBTStateOnInfo: jni_cid_BTAdapter is null");
-        return -1;
-    }
-
-    jfieldID jni_fid_stateon = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
-    if (jni_fid_stateon == 0)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] get_field_state is 0");
-        return -1;
-    }
-    jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
-
-    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] bluetooth STATE_ON state integer value : %d", jni_int_val);
-
-    return jni_int_val;
-}
-
-jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
-{
-    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
-    if(!jni_cid_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_BTAdapter: jni_cid_BTAdapter is null");
-        return FALSE;
-    }
-
-    jmethodID jni_mid_getDefaultAdapter =
-            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
-    if(!jni_mid_getDefaultAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getDefaultAdapter is null");
-        return FALSE;
-    }
-
-    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
-    if(!jni_obj_BTAdapter)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_BTAdapter is null");
-        return FALSE;
-    }
-
-    // isEnable()
-    jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled",
-            "()Z");
-    if(!jni_mid_isEnable)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_isEnable is null");
-        return FALSE;
-    }
-
-    jboolean jni_isEnable = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_isEnable);
-    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] adapter state is %d", jni_isEnable);
-
-    return jni_isEnable;
-}
-
-jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
-{
-    jclass jni_cid_device_list = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
-    if(!jni_cid_device_list)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_device_list is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_device_list, "getAddress",
-            "()Ljava/lang/String;");
-    if(!jni_mid_getAddress)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getAddress is null");
-        return NULL;
-    }
-
-    jstring jni_address = (jstring)(*env)->CallObjectMethod(env, bluetoothDevice, jni_mid_getAddress);
-    if(!jni_address)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_address is null");
-        return NULL;
-    }
-    return jni_address;
-}
 
 /**
  * BT State List
@@ -1476,11 +945,11 @@ void CAEDRNativeAddDeviceStateToList(state_t* state)
         return;
     }
 
-    if(!CAEDRNativeIsDeviceInList(state->address)) {
+    if(CAEDRNativeIsDeviceInList(state->address)) {
         CAEDRNativeRemoveDevice(state->address); // delete previous state for update new state
-        u_arraylist_add(gdeviceStateList, state);          // update new state
-        OIC_LOG_V(DEBUG, TAG, "Set State to Connected State List");
     }
+    u_arraylist_add(gdeviceStateList, state);          // update new state
+    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
 }
 
 jboolean CAEDRNativeIsDeviceInList(const char* remoteAddress){
@@ -1539,7 +1008,7 @@ void CAEDRNativeRemoveAllDeviceState()
 
 void CAEDRNativeRemoveDevice(const char* remoteAddress)
 {
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDevice");
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceforStateList");
 
     if(!gdeviceStateList)
     {
@@ -1559,20 +1028,19 @@ void CAEDRNativeRemoveDevice(const char* remoteAddress)
 
         if(!strcmp(state->address, remoteAddress))
         {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove object : %s", remoteAddress);
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove state : %s", remoteAddress);
             OICFree(state);
 
             CAEDRReorderingDeviceList(index);
             break;
         }
     }
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
     return;
 }
 
 jboolean CAEDRIsConnectedDevice(const char* remoteAddress)
 {
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDevice");
+    OIC_LOG_V(DEBUG, TAG, "CAEDRIsConnectedDevice");
 
     if(!gdeviceStateList)
     {
@@ -1597,7 +1065,6 @@ jboolean CAEDRIsConnectedDevice(const char* remoteAddress)
             return state->state;
         }
     }
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
     return FALSE;
 }
 
@@ -1665,7 +1132,7 @@ void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
     {
         jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
         u_arraylist_add(gdeviceObjectList, gDeviceSocker);
-        OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
+        OIC_LOG_V(DEBUG, TAG, "Set Socket Object to Array");
     }
 
     u_mutex_unlock(gMutexSocketListManager);
@@ -1844,3 +1311,11 @@ void CAEDRReorderingDeviceSocketList(uint32_t index)
     gdeviceObjectList->size--;
     gdeviceObjectList->length--;
 }
+
+void CAEDRInitializeClient(u_thread_pool_t handle)
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+    CAEDRInitialize(handle);
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c
new file mode 100644 (file)
index 0000000..967c085
--- /dev/null
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <string.h>
+#include <jni.h>
+
+#include "caedrinterface.h"
+#include "logger.h"
+#include "oic_malloc.h"
+#include "uthreadpool.h" /* for thread pool */
+#include "umutex.h"
+#include "uarraylist.h"
+#include "caadapterutils.h"
+
+//#define DEBUG_MODE
+#define TAG PCF("CA_EDR_MONITOR")
+
+// temp method
+
+CAResult_t CAEDRInitializeNetworkMonitor()
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+void CAEDRSetNetworkChangeCallback(
+    CAEDRNetworkStatusCallback networkChangeCallback)
+{
+
+}
+
+void CAEDRTerminateNetworkMonitor(void)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+}
+
+CAResult_t CAEDRStartNetworkMonitor()
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+CAResult_t CAEDRStopNetworkMonitor()
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+CAResult_t CAEDRClientSetCallbacks(void)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c
new file mode 100644 (file)
index 0000000..c203698
--- /dev/null
@@ -0,0 +1,1194 @@
+#include <stdio.h>
+#include <string.h>
+#include <jni.h>
+
+#include "caedrinterface.h"
+#include "caedrutils.h"
+#include "caedrserver.h"
+#include "logger.h"
+#include "oic_malloc.h"
+#include "uthreadpool.h" /* for thread pool */
+#include "umutex.h"
+#include "uarraylist.h"
+#include "caadapterutils.h"
+
+//#define DEBUG_MODE
+#define TAG PCF("CA_EDR_SERVER")
+
+static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
+static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
+static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
+static const char *CLASSPATH_BT_UUID = "java/util/UUID";
+
+static const uint32_t STATE_CONNECTED = 1;
+static const uint32_t STATE_DISCONNECTED = 0;
+
+static const uint32_t MAX_PDU_BUFFER = 1024;
+
+static u_arraylist_t *gdeviceStateList = NULL;
+static u_arraylist_t *gdeviceObjectList = NULL;
+
+static u_thread_pool_t gThreadPoolHandle = NULL;
+
+static JavaVM *g_jvm;
+static jobject gContext;
+
+static jbyteArray gSendBuffer;
+
+/**
+ * @var gMutexSocketListManager
+ * @brief Mutex to synchronize socket list update
+ */
+static u_mutex gMutexSocketListManager;
+
+// server socket instance
+static jobject gServerSocketObject = NULL;
+
+/**
+ * @var gMutexUnicastServer
+ * @brief Mutex to synchronize unicast server
+ */
+static u_mutex gMutexUnicastServer = NULL;
+
+/**
+ * @var gStopUnicast
+ * @brief Flag to control the Receive Unicast Data Thread
+ */
+static bool gStopUnicast = FALSE;
+
+/**
+ * @var gMutexMulticastServer
+ * @brief Mutex to synchronize secure multicast server
+ */
+static u_mutex gMutexMulticastServer = NULL;
+
+/**
+ * @var gStopMulticast
+ * @brief Flag to control the Receive Multicast Data Thread
+ */
+static bool gStopMulticast = FALSE;
+
+/**
+ * @var gStopAccept
+ * @brief Flag to control the Accept Thread
+ */
+static bool gStopAccept = FALSE;
+
+typedef struct send_data {
+    char* address;
+    char* data;
+    uint32_t id;
+} data_t;
+
+/**
+ @brief Thread context information for unicast, multicast and secured unicast server
+ */
+typedef struct
+{
+    bool *stopFlag;
+    CAAdapterServerType_t type;
+} CAAdapterReceiveThreadContext_t;
+
+typedef struct
+{
+    bool *stopFlag;
+} CAAdapterAcceptThreadContext_t;
+
+// callback instance
+
+/**
+ * @var gEDRNetworkChangeCallback
+ * @brief Maintains the callback to be notified when data received from remote Bluetooth device
+ */
+static CAEDRDataReceivedCallback gEDRPacketReceivedCallback = NULL;
+
+static void CAReceiveHandler(void *data)
+{
+    OIC_LOG_V(DEBUG, TAG, "start CAReceiveHandler..");
+    OIC_LOG(DEBUG, TAG, "IN");
+    // Input validation
+    VERIFY_NON_NULL_VOID(data, TAG, "Invalid thread context");
+
+    jboolean isAttached = FALSE;
+    JNIEnv* env;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
+    if(res != JNI_OK)
+    {
+        OIC_LOG_V(DEBUG, TAG, "CAReceiveHandler - Could not get JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if(res != JNI_OK)
+        {
+            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
+            return;
+        }
+        isAttached = TRUE;
+    }
+
+    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)data;
+
+    while (TRUE != *(ctx->stopFlag))
+    {
+        uint32_t idx;
+
+        // if new socket object is added in socket list after below logic is ran.
+        // new socket will be started to read after next while loop
+        uint32_t length = CAEDRServerGetSocketListLength();
+        if(0 == length)
+        {
+            OIC_LOG_V(DEBUG, TAG, "socket list is empty");
+            sleep(1);
+        }
+
+//        for(idx = 0 ; idx < length ; idx++)
+//        {
+//            OIC_LOG_V(DEBUG, TAG, "start CAEDRNativeReadData");
+            CAEDRNativeReadData(env, idx, ctx->type);
+//        }
+    }
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+
+    if(ctx)
+        OICFree(ctx);
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+static void CAAcceptHandler(void *data)
+{
+    int status;
+
+    OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread start");
+
+    jboolean isAttached = FALSE;
+    JNIEnv* env;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
+    if(res != JNI_OK)
+    {
+        OIC_LOG_V(DEBUG, TAG, "CAAcceptHandler - Could not get JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if(res != JNI_OK)
+        {
+            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
+            return;
+        }
+        isAttached = TRUE;
+    }
+
+    jobject jni_obj_BTSeverSocket = CAEDRNativeListen(env);
+    if(!jni_obj_BTSeverSocket) {
+        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: jni_obj_BTSeverSocket is null");
+
+        if(isAttached)
+            (*g_jvm)->DetachCurrentThread(g_jvm);
+
+        return;
+    }
+
+    CAAdapterAcceptThreadContext_t *ctx = (CAAdapterAcceptThreadContext_t *)data;
+
+    while (TRUE != *(ctx->stopFlag))
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread running");
+        CAEDRNativeAccept(env, jni_obj_BTSeverSocket);
+    }
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+
+    if(ctx)
+        OICFree(ctx);
+
+    OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread finish");
+
+    return;
+}
+
+
+// adapter common method
+
+CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD, u_thread_pool_t handle)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+    CAEDRServerInitialize(handle);
+    // FIXME
+    CAEDRStartUnicastServer(NULL, FALSE);
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+CAResult_t CAEDRServerStop(const int32_t serverFD)
+{
+    OIC_LOG_V(DEBUG, TAG, "IN");
+    CAEDRStopUnicastServer(-1);
+    CAEDRStopMulticastServer(-1);
+    CAEDRServerTerminate();
+    OIC_LOG_V(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+void CAEDRSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceivedCallback)
+{
+    gEDRPacketReceivedCallback = packetReceivedCallback;
+}
+
+/**
+ * Destroy Mutex
+ */
+static void CAEDRServerDestroyMutex()
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    if (gMutexUnicastServer)
+    {
+        u_mutex_free(gMutexUnicastServer);
+        gMutexUnicastServer = NULL;
+    }
+
+#ifdef __WITH_DTLS__
+
+#endif
+
+    if (gMutexMulticastServer)
+    {
+        u_mutex_free(gMutexMulticastServer);
+        gMutexMulticastServer = NULL;
+    }
+
+    if(gMutexSocketListManager)
+    {
+        u_mutex_free(gMutexSocketListManager);
+        gMutexSocketListManager = NULL;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+
+/*
+ * Create Mutex
+ */
+static CAResult_t CAEDRServerCreateMutex()
+{
+    OIC_LOG(DEBUG, TAG, "IN");
+
+    gMutexUnicastServer = u_mutex_new();
+    if (!gMutexUnicastServer)
+    {
+        OIC_LOG(ERROR, TAG, "Failed to created mutex!");
+        return CA_STATUS_FAILED;
+    }
+
+#ifdef __WITH_DTLS__
+
+#endif
+
+    gMutexMulticastServer = u_mutex_new();
+    if (!gMutexMulticastServer)
+    {
+        OIC_LOG(ERROR, TAG, "Failed to created mutex!");
+
+        CAEDRServerDestroyMutex();
+        return CA_STATUS_FAILED;
+    }
+
+    gMutexSocketListManager = u_mutex_new();
+    if (!gMutexSocketListManager)
+    {
+        OIC_LOG(ERROR, TAG, "Failed to created mutex!");
+
+        CAEDRServerDestroyMutex();
+        return CA_STATUS_FAILED;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+void CAEDRServerJniInit(JNIEnv *env, JavaVM* jvm)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRServerJniInit");
+    g_jvm = jvm;
+}
+
+void CAEDRServerInitialize(u_thread_pool_t handle)
+{
+    OIC_LOG(DEBUG, TAG, "CAEDRServerInitialize");
+
+    gThreadPoolHandle = handle;
+
+    // init mutex
+    CAEDRServerCreateMutex();
+
+    jboolean isAttached = FALSE;
+    JNIEnv* env;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
+    if(res != JNI_OK)
+    {
+        OIC_LOG_V(DEBUG, TAG, "CAEDRServerInitialize - Could not get JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if(res != JNI_OK)
+        {
+            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
+            return;
+        }
+        isAttached = TRUE;
+    }
+
+    jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
+    if(jni_address)
+    {
+        const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
+        OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
+    }
+
+    CAEDRServerNativeCreateDeviceStateList();
+    CAEDRServerNativeCreateDeviceSocketList();
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+
+//    CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
+
+    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
+                                               OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
+    if (!ctx)
+    {
+        OIC_LOG(ERROR, TAG, "Out of memory!");
+        return;
+    }
+
+    ctx->stopFlag = &gStopAccept;
+    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAAcceptHandler, (void *)ctx))
+    {
+        OIC_LOG(ERROR, TAG, "Failed to create read thread!");
+        OICFree((void *)ctx);
+        return;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+void CAEDRServerTerminate()
+{
+    OIC_LOG(DEBUG, TAG, "CAEDRServerTerminate");
+
+    jboolean isAttached = FALSE;
+    JNIEnv* env;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
+    if(res != JNI_OK)
+    {
+        OIC_LOG_V(DEBUG, TAG, "CAEDRServerTerminate - Could not get JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if(res != JNI_OK)
+        {
+            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
+            return;
+        }
+        isAttached = TRUE;
+    }
+
+    gStopAccept = TRUE;
+    gStopMulticast = TRUE;
+    gStopUnicast = TRUE;
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+
+    // delete mutex
+    CAEDRServerDestroyMutex();
+
+    CAEDRServerNativeRemoveAllDeviceState();
+    CAEDRServerNativeRemoveAllDeviceSocket(env);
+}
+
+int32_t CAEDRStartUnicastServer(const char* address, bool isSecured)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRStartUnicastServer(%s)", address);
+
+    u_mutex_lock(gMutexUnicastServer);
+
+    /**
+      * The task to listen for data from unicast is added to the thread pool.
+      * This is a blocking call is made where we try to receive some data..
+      * We will keep waiting until some data is received.
+      * This task will be terminated when thread pool is freed on stopping the adapters.
+      * Thread context will be freed by thread on exit.
+      */
+    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
+                                           OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
+    if (!ctx)
+    {
+        OIC_LOG(ERROR, TAG, "Out of memory!");
+        u_mutex_unlock(gMutexUnicastServer);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    ctx->stopFlag = &gStopUnicast;
+    ctx->type = isSecured ? CA_SECURED_UNICAST_SERVER : CA_UNICAST_SERVER;
+    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
+    {
+        OIC_LOG(ERROR, TAG, "Failed to create read thread!");
+        u_mutex_unlock(gMutexUnicastServer);
+        OICFree((void *)ctx);
+        return CA_STATUS_FAILED;
+    }
+    u_mutex_unlock(gMutexUnicastServer);
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+int32_t CAEDRStartMulticastServer(bool isSecured)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRStartMulticastServer");
+
+    u_mutex_lock(gMutexMulticastServer);
+
+    /**
+      * The task to listen to data from multicast socket is added to the thread pool.
+      * This is a blocking call is made where we try to receive some data.
+      * We will keep waiting until some data is received.
+      * This task will be terminated when thread pool is freed on stopping the adapters.
+      * Thread context will be freed by thread on exit.
+      */
+    CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
+                                           OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
+    if (!ctx)
+    {
+        OIC_LOG(ERROR, TAG, "Out of memory!");
+        u_mutex_unlock(gMutexMulticastServer);
+
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    ctx->stopFlag = &gStopMulticast;
+    ctx->type = CA_MULTICAST_SERVER;
+
+    gStopMulticast = FALSE;
+    if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
+    {
+        OIC_LOG(ERROR, TAG, "thread_pool_add_task failed!");
+
+        gStopMulticast = TRUE;
+        u_mutex_unlock(gMutexMulticastServer);
+
+        return CA_STATUS_FAILED;
+    }
+    u_mutex_unlock(gMutexMulticastServer);
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+    return CA_STATUS_OK;
+}
+
+int32_t CAEDRStopUnicastServer(int32_t serverID)
+{
+    OIC_LOG(DEBUG, TAG, "CAEDRStopUnicastServer");
+
+    u_mutex_lock(gMutexUnicastServer);
+    gStopUnicast = TRUE;
+    u_mutex_unlock(gMutexUnicastServer);
+
+    return 0;
+}
+
+int32_t CAEDRStopMulticastServer(int32_t serverID)
+{
+    OIC_LOG(DEBUG, TAG, "CAEDRStopMulticastServer");
+
+    u_mutex_lock(gMutexMulticastServer);
+    gStopMulticast = true;
+    u_mutex_unlock(gMutexMulticastServer);
+
+    OIC_LOG_V(INFO, TAG, "Multicast server stopped");
+
+    return 0;
+}
+
+uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type)
+{
+    if(!((*env)->ExceptionCheck(env)))
+    {
+        // check whether this socket object is connected or not.
+        jobject jni_obj_socket = CAEDRServerNativeGetDeviceSocket(id);
+        if(!jni_obj_socket)
+        {
+            return -1;
+        }
+
+        jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket);
+        const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL);
+        if(STATE_DISCONNECTED == CAEDRServerIsConnectedDevice(address))
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: it is not connected yet..");
+            return -1;
+        }
+
+        // start to read through InputStream
+        jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
+        jmethodID jni_mid_getInputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getInputStream", "()Ljava/io/InputStream;");
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData:  get InputStream..%d, %s", id, address);
+
+        if(!jni_obj_socket)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore..");
+            return -1;
+        }
+
+        jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getInputStream);
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData:  ready inputStream..");
+
+        jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
+        jmethodID jni_mid_read = (*env)->GetMethodID(env, jni_cid_InputStream, "read", "([BII)I");
+
+        jbyteArray jbuf = (*env)->NewByteArray(env, MAX_PDU_BUFFER);
+        jlong nread;
+
+        if(!jni_obj_socket)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore...");
+            return -1;
+        }
+
+        while ((nread = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_read, jbuf, (jint)0, MAX_PDU_BUFFER)) != -1)
+        {
+            if((*env)->ExceptionCheck(env))
+            {
+                OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: read Error!!!");
+                (*env)->ExceptionDescribe(env);
+                (*env)->ExceptionClear(env);
+                return -1;
+            }
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: reading");
+            jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
+            jint length = strlen((char*)buf);
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: read %s", buf);
+            if (buf == NULL)
+            {
+                return -1;
+            }
+
+            switch (type)
+            {
+                case CA_UNICAST_SERVER:
+                case CA_MULTICAST_SERVER:
+                    // Notify data to upper layer
+                    if (gEDRPacketReceivedCallback)
+                    {
+                        uint32_t sentLength = 0;
+                        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] data will be sent to callback routine: %s, %d", buf, length);
+                        gEDRPacketReceivedCallback(address, (void*)buf, length, &sentLength);
+                    }
+                    break;
+#ifdef __WITH_DTLS__
+                case CA_SECURED_UNICAST_SERVER:
+                    break;
+#endif //__WITH_DTLS__
+                default:
+                    // Should never occur
+                    OIC_LOG_V(DEBUG, TAG, "Invalid server type");
+                    return -1;
+            }
+            (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
+
+            // close socket after data was sent
+            CAEDRNativeServerSocketClose(env, address, id);
+            break;
+        }
+    }
+    else
+    {
+        (*env)->ExceptionDescribe(env);
+        (*env)->ExceptionClear(env);
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: env error!!");
+        return -1;
+    }
+
+    return 0;
+}
+
+jobject CAEDRNativeListen(JNIEnv *env)
+{
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen");
+
+    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
+        return NULL;
+    }
+
+    // get BTadpater
+    jmethodID jni_mid_getDefaultAdapter =(*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
+        return NULL;
+    }
+
+    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
+    if(!jni_obj_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTAdapter is null");
+        return NULL;
+    }
+
+    // get listen method ID
+    jmethodID jni_mid_listen = (*env)->GetMethodID(env, jni_cid_BTAdapter,
+            "listenUsingInsecureRfcommWithServiceRecord","(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;");
+    if(!jni_mid_listen)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
+        return NULL;
+    }
+    // listenUsingInsecureRfcommWithServiceRecord  / listenUsingRfcommWithServiceRecord
+    // setting UUID
+    jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
+    if(!jni_cid_uuid)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;");
+    if(!jni_mid_fromString)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_fromString is null");
+        return NULL;
+    }
+
+//  jstring uuid = (*env)->NewStringUTF(env, "0000111f-0000-1000-8000-00805f9b8033");
+    jstring jni_uuid = (*env)->NewStringUTF(env, "00000000-0000-0000-0000-0000cdab0000");
+    jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
+    if(!jni_obj_uuid)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_uuid is null");
+        return NULL;
+    }
+
+    // create socket
+    jstring jni_name = (*env)->NewStringUTF(env, "BluetoothTestSecure");
+    jobject jni_obj_BTSeverSocket = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_listen, jni_name, jni_obj_uuid);
+    if(!jni_obj_BTSeverSocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTSeverSocket is null");
+        return NULL;
+    }
+
+    gServerSocketObject = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
+
+    return jni_obj_BTSeverSocket;
+}
+
+void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
+{
+    if(severSocketObject != NULL)
+    {
+        jclass jni_cid_BTServerSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothServerSocket");
+        if(!jni_cid_BTServerSocket)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_cid_BTServerSocket is null");
+            return;
+        }
+
+        jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "accept", "()Landroid/bluetooth/BluetoothSocket;");
+        if(!jni_mid_accept)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_mid_accept is null");
+            return;
+        }
+
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: initiating accept...");
+
+        jobject jni_obj_BTSocket = NULL;
+        jni_obj_BTSocket = (*env)->CallObjectMethod(env, severSocketObject, jni_mid_accept);
+        if(!jni_obj_BTSocket)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_obj_BTSocket is null");
+            return;
+        }
+
+        // get remote address
+        jstring j_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_BTSocket);
+
+        const char* address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btAccept: address is %s", address);
+
+        // set socket to list
+        jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
+        CAEDRServerNativeAddDeviceSocketToList(env, jni_socket);
+
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: Accepted!!");
+
+        // update state
+        CAEDRServerUpdateDeviceState(STATE_CONNECTED, address);
+    }
+    else
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: severSocket is close previously");
+    }
+}
+
+void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id)
+{
+
+    jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
+    if(!jni_cid_BTSocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
+        return;
+    }
+
+    jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
+    if(!jni_mid_close)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_mid_close is null");
+        return;
+    }
+
+    jobject jni_obj_socket = CAEDRServerNativeGetDeviceSocket(id);
+    if(!jni_obj_socket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_obj_socket is not available");
+        return;
+    }
+
+    (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close);
+
+    if((*env)->ExceptionCheck(env))
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!");
+        (*env)->ExceptionDescribe(env);
+        (*env)->ExceptionClear(env);
+        return;
+    }
+
+    // remove socket to list
+    CAEDRServerNativeRemoveDeviceSocket(env, jni_obj_socket);
+
+    // update state
+    CAEDRServerUpdateDeviceState(STATE_DISCONNECTED, address);
+
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
+}
+
+/**
+ * BT State List
+ */
+void CAEDRServerNativeCreateDeviceStateList()
+{
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
+
+    // create new object array
+    if (gdeviceStateList == NULL)
+    {
+        OIC_LOG_V(DEBUG, TAG, "Create device list");
+
+        gdeviceStateList = u_arraylist_create();
+    }
+}
+
+void CAEDRServerUpdateDeviceState(uint32_t state, const char* address)
+{
+    state_t *newstate = (state_t*) OICMalloc( sizeof(state_t) );
+    memset(newstate->address, 0, strlen(newstate->address));
+    strcpy(newstate->address, address);
+    newstate->state = state;
+
+    CAEDRServerNativeAddDeviceStateToList(newstate);
+}
+
+void CAEDRServerNativeAddDeviceStateToList(state_t* state)
+{
+    if(!state)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] device is null");
+        return;
+    }
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdevice_list is null");
+        return;
+    }
+
+    if(!CAEDRServerNativeIsDeviceInList(state->address)) {
+        CAEDRServerNativeRemoveDevice(state->address); // delete previous state for update new state
+        u_arraylist_add(gdeviceStateList, state);          // update new state
+        OIC_LOG_V(DEBUG, TAG, "Set State to Connected State List");
+    }
+}
+
+jboolean CAEDRServerNativeIsDeviceInList(const char* remoteAddress){
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            return TRUE;
+        }
+
+        if(!strcmp(remoteAddress, state->address))
+        {
+            OIC_LOG_V(DEBUG, TAG, "the device is already set");
+            return TRUE;
+        }
+        else
+        {
+            continue;
+        }
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "there are no the device in list.");
+    return FALSE;
+}
+
+void CAEDRServerNativeRemoveAllDeviceState()
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveAllDevices");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            continue;
+        }
+        OICFree(state);
+    }
+
+    OICFree(gdeviceStateList);
+    gdeviceStateList = NULL;
+    return;
+}
+
+void CAEDRServerNativeRemoveDevice(const char* remoteAddress)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDevice");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            continue;
+        }
+
+        if(!strcmp(state->address, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove object : %s", remoteAddress);
+            OICFree(state);
+
+            CAEDRServerReorderingDeviceList(index);
+            break;
+        }
+    }
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
+    return;
+}
+
+jboolean CAEDRServerIsConnectedDevice(const char* remoteAddress)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRServerIsConnectedDevice");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return FALSE;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            continue;
+        }
+
+        if(!strcmp(state->address, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] check whether it is connected or not");
+
+            return state->state;
+        }
+    }
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
+    return FALSE;
+}
+
+void CAEDRServerReorderingDeviceList(uint32_t index)
+{
+    if (index >= gdeviceStateList->length)
+    {
+        return;
+    }
+
+    if (index < gdeviceStateList->length - 1)
+    {
+        memmove(&gdeviceStateList->data[index], &gdeviceStateList->data[index + 1],
+                (gdeviceStateList->length - index - 1) * sizeof(void *));
+    }
+
+    gdeviceStateList->size--;
+    gdeviceStateList->length--;
+}
+
+/**
+ * Device Socket Object List
+ */
+void CAEDRServerNativeCreateDeviceSocketList()
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRServerNativeCreateDeviceSocketList");
+
+    // create new object array
+    if (gdeviceObjectList == NULL)
+    {
+        OIC_LOG_V(DEBUG, TAG, "Create Device object list");
+
+        gdeviceObjectList = u_arraylist_create();
+    }
+}
+
+void CAEDRServerNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRServerNativeAddDeviceSocketToList");
+
+    if(!deviceSocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] Device is null");
+        return;
+    }
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
+    if(!jni_remoteAddress)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
+        return;
+    }
+
+    u_mutex_lock(gMutexSocketListManager);
+
+    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
+
+    if(!CAEDRServerNativeIsDeviceSocketInList(env, remoteAddress))
+    {
+        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
+        u_arraylist_add(gdeviceObjectList, gDeviceSocker);
+        OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
+    }
+
+    u_mutex_unlock(gMutexSocketListManager);
+}
+
+jboolean CAEDRServerNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsDeviceObjInList");
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            return TRUE;
+        }
+
+        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        if(!jni_setAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
+            return TRUE;
+        }
+
+        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
+
+        if(!strcmp(remoteAddress, setAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "the device is already set");
+            return TRUE;
+        }
+        else
+        {
+            continue;
+        }
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "there are no the Device obejct in list. we can add");
+    return FALSE;
+}
+
+void CAEDRServerNativeRemoveAllDeviceSocket(JNIEnv *env)
+{
+    OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDeviceObjsList");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            return;
+        }
+        (*env)->DeleteGlobalRef(env, jarrayObj);
+    }
+
+    OICFree(gdeviceObjectList);
+    gdeviceObjectList = NULL;
+    return;
+}
+
+void CAEDRServerNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRServerNativeRemoveDeviceSocket");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    u_mutex_lock(gMutexSocketListManager);
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            continue;
+        }
+
+        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        if(!jni_setAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
+            continue;
+        }
+        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
+
+        jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
+        if(!jni_remoteAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
+            continue;
+        }
+        const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
+
+        if(!strcmp(setAddress, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
+            (*env)->DeleteGlobalRef(env, jarrayObj);
+
+            CAEDRServerReorderingDeviceSocketList(index);
+            break;
+        }
+    }
+    u_mutex_unlock(gMutexSocketListManager);
+
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
+    return;
+}
+
+jobject CAEDRServerNativeGetDeviceSocket(uint32_t idx)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRServerNativeGetDeviceSocket");
+
+    if(idx < 0)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] index is not available");
+        return NULL;
+    }
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return NULL;
+    }
+
+    jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, idx);
+    if(!jarrayObj)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is not available");
+        return NULL;
+    }
+    return jarrayObj;
+}
+
+uint32_t CAEDRServerGetSocketListLength()
+{
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return 0;
+    }
+
+    uint32_t length = u_arraylist_length(gdeviceObjectList);
+
+    return length;
+}
+
+void CAEDRServerReorderingDeviceSocketList(uint32_t index)
+{
+    if (index >= gdeviceObjectList->length)
+    {
+        return;
+    }
+
+    if (index < gdeviceObjectList->length - 1)
+    {
+        memmove(&gdeviceObjectList->data[index], &gdeviceObjectList->data[index + 1],
+                (gdeviceObjectList->length - index - 1) * sizeof(void *));
+    }
+
+    gdeviceObjectList->size--;
+    gdeviceObjectList->length--;
+}
+
+void CAEDRServerSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceivedCallback)
+{
+    gEDRPacketReceivedCallback = packetReceivedCallback;
+}
+
+
diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c
new file mode 100644 (file)
index 0000000..06cd0fb
--- /dev/null
@@ -0,0 +1,248 @@
+#include <jni.h>
+#include <stdio.h>
+#include <android/log.h>
+#include "caedrutils.h"
+#include "logger.h"
+#include "oic_malloc.h"
+#include "uthreadpool.h"
+#include "uarraylist.h"
+
+#define TAG PCF("CA_EDR_UTILS")
+
+static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
+static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
+static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
+
+/**
+ * BT common
+ */
+
+// get address from bluetooth socket
+jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj)
+{
+    if(!bluetoothSocketObj)
+    {
+        return NULL;
+    }
+
+    jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
+    if(!jni_cid_BTSocket)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_cid_BTSocket is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTSocket, "getRemoteDevice",
+         "()Landroid/bluetooth/BluetoothDevice;");
+    if(!jni_mid_getRemoteDevice)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_mid_getRemoteDevice is null");
+        return NULL;
+    }
+
+    jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, bluetoothSocketObj, jni_mid_getRemoteDevice);
+    if(!jni_obj_remoteBTDevice)
+    {
+        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_obj_remoteBTDevice is null");
+        return NULL;
+    }
+
+    jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
+    jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
+
+    jstring j_str_address = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, j_mid_getAddress);
+    if(j_str_address)
+    {
+        const char * address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
+        OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: ~~ remote device address is %s", address);
+//      (*env)->ReleaseStringUTFChars(env, j_str_address, address);
+    } else {
+        return NULL;
+    }
+    return j_str_address;
+}
+
+jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
+{
+    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_cid_BTAdapter is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_getDefaultAdapter =
+            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
+    if(!jni_mid_getDefaultAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getDefaultAdapter is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getAddress", METHODID_STRINGNONPARAM);
+    if(!jni_mid_getAddress)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getAddress is null");
+        return NULL;
+    }
+
+    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
+    if(!jni_obj_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_obj_BTAdapter is null");
+        return NULL;
+    }
+
+    jstring jni_str_address = (jstring)(*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getAddress);
+    if(!jni_str_address)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_str_address is null");
+        return NULL;
+    }
+
+    return jni_str_address;
+}
+
+jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
+{
+    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_cid_BTAdapter is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_getDefaultAdapter =
+            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
+
+    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
+    if(!jni_obj_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: bluetooth adapter is null");
+        return NULL;
+    }
+
+    // Get a list of currently paired devices
+    jmethodID jni_mid_getBondedDevices = (*env)->GetMethodID(env, jni_cid_BTAdapter,
+            "getBondedDevices", "()Ljava/util/Set;");
+    if(!jni_mid_getBondedDevices)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_getBondedDevicesr is null");
+        return NULL;
+    }
+
+    jobject jni_obj_setPairedDevices = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getBondedDevices);
+    if(!jni_obj_setPairedDevices)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_obj_setPairedDevices is null");
+        return NULL;
+    }
+
+    // Convert the set to an object array
+    // object[] array = Set<BluetoothDevice>.toArray();
+    jclass jni_cid_Set = (*env)->FindClass(env,  "java/util/Set");
+    jmethodID jni_mid_toArray = (*env)->GetMethodID(env, jni_cid_Set, "toArray", "()[Ljava/lang/Object;");
+
+    if(!jni_mid_toArray)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_toArray is null");
+        return NULL;
+    }
+
+    jobjectArray jni_arrayPairedDevices = (jobjectArray)((*env)->CallObjectMethod(env,
+            jni_obj_setPairedDevices, jni_mid_toArray));
+    if(!jni_arrayPairedDevices)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_arrayPairedDevices is null");
+        return NULL;
+    }
+
+    return jni_arrayPairedDevices;
+}
+
+jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
+{
+    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] getBTStateOnInfo: jni_cid_BTAdapter is null");
+        return -1;
+    }
+
+    jfieldID jni_fid_stateon = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
+    if (jni_fid_stateon == 0)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] get_field_state is 0");
+        return -1;
+    }
+    jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
+
+    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] bluetooth STATE_ON state integer value : %d", jni_int_val);
+
+    return jni_int_val;
+}
+
+jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
+{
+    jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
+    if(!jni_cid_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_BTAdapter: jni_cid_BTAdapter is null");
+        return FALSE;
+    }
+
+    jmethodID jni_mid_getDefaultAdapter =
+            (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
+    if(!jni_mid_getDefaultAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getDefaultAdapter is null");
+        return FALSE;
+    }
+
+    jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
+    if(!jni_obj_BTAdapter)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_BTAdapter is null");
+        return FALSE;
+    }
+
+    // isEnable()
+    jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled",
+            "()Z");
+    if(!jni_mid_isEnable)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_isEnable is null");
+        return FALSE;
+    }
+
+    jboolean jni_isEnable = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_isEnable);
+    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] adapter state is %d", jni_isEnable);
+
+    return jni_isEnable;
+}
+
+jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
+{
+    jclass jni_cid_device_list = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
+    if(!jni_cid_device_list)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_device_list is null");
+        return NULL;
+    }
+
+    jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_device_list, "getAddress",
+            "()Ljava/lang/String;");
+    if(!jni_mid_getAddress)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getAddress is null");
+        return NULL;
+    }
+
+    jstring jni_address = (jstring)(*env)->CallObjectMethod(env, bluetoothDevice, jni_mid_getAddress);
+    if(!jni_address)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_address is null");
+        return NULL;
+    }
+    return jni_address;
+}
index 9fc9a76..e0d17d3 100644 (file)
@@ -135,6 +135,8 @@ static void CAFreeEDRData(CAEDRData *edrData);
  */
 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
 
+static void CAEDRDataDestroyer(void *data, uint32_t size);
+
 CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
                            CANetworkPacketReceivedCallback packetReceivedCallback,
                            CANetworkChangeCallback networkStateChangeCallback,
@@ -166,7 +168,7 @@ CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
 
     CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
     CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
-    CAEDRInitializeClient();
+    CAEDRInitializeClient(handle);
 
     CAConnectivityHandler_t handler;
     handler.startAdapter = CAStartEDR;
@@ -415,7 +417,7 @@ CAResult_t CAStartServer(void)
         return CA_STATUS_OK;
     }
 
-    if (CA_STATUS_OK != (err = CAEDRServerStart(OIC_EDR_SERVICE_ID, &gServerId)))
+    if (CA_STATUS_OK != (err = CAEDRServerStart(OIC_EDR_SERVICE_ID, &gServerId, gEDRThreadPool)))
     {
         OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
                   err);
@@ -459,7 +461,7 @@ CAResult_t CAEDRInitializeSendHandler(void)
     }
 
     if (CA_STATUS_OK != CAQueueingThreadInitialize(gSendQueueHandle, gEDRThreadPool,
-            CAAdapterDataSendHandler, NULL))
+            CAAdapterDataSendHandler, CAEDRDataDestroyer))
     {
         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
         return CA_STATUS_FAILED;
@@ -485,7 +487,7 @@ CAResult_t CAEDRInitializeReceiveHandler(void)
     }
 
     if (CA_STATUS_OK != CAQueueingThreadInitialize(gRecvQueueHandle, gEDRThreadPool,
-            CAAdapterDataReceiverHandler, NULL))
+            CAAdapterDataReceiverHandler, CAEDRDataDestroyer))
     {
         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
         return CA_STATUS_FAILED;
@@ -615,7 +617,7 @@ void CAAdapterDataSendHandler(void *context)
     }
 
     // Free message
-    CAFreeEDRData(message);
+    //CAFreeEDRData(message);
 
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
 }
@@ -635,7 +637,7 @@ CAResult_t CAEDRClientSendData(const char *remoteAddress, const char *serviceUUI
     }
     else
     {
-        OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data");
+        OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
         if (CA_STATUS_OK != CAEDRClientSendMulticastData(serviceUUID, data,
                 dataLength, sentLength))
         {
@@ -647,7 +649,7 @@ CAResult_t CAEDRClientSendData(const char *remoteAddress, const char *serviceUUI
 }
 void CAAdapterDataReceiverHandler(void *context)
 {
-    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
+    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
 
 
     CAEDRData *message = (CAEDRData *) context;
@@ -702,7 +704,7 @@ void CAAdapterDataReceiverHandler(void *context)
         memcpy(defragData + recvDataLen, message->data, message->dataLen);
         recvDataLen += message->dataLen ;
     }
-    CAFreeEDRData(message);
+    //CAFreeEDRData(message);
     if (totalDataLen == recvDataLen)
     {
         OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
@@ -713,7 +715,7 @@ void CAAdapterDataReceiverHandler(void *context)
         isHeaderAvailable = CA_FALSE;
     }
 
-    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
+    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
 }
 
 CAResult_t CAAdapterStartQueue()
@@ -980,3 +982,9 @@ void CAFreeEDRData(CAEDRData *edrData)
     OICFree(edrData);
 }
 
+void CAEDRDataDestroyer(void *data, uint32_t size)
+{
+    CAEDRData *edrdata = (CAEDRData *) data;
+
+    CAFreeEDRData(edrdata);
+}
index 8db3611..14a340f 100644 (file)
@@ -499,7 +499,7 @@ void CAEDRManagerTerminateMutex(void)
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
 }
 
-void CAEDRInitializeClient()
+void CAEDRInitializeClient(u_thread_pool_t handle)
 {
     OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
     CAEDRManagerInitializeMutex();
index 2355008..a21f274 100644 (file)
@@ -37,7 +37,7 @@
 
 static int32_t gMaxPendingConnections = 10;
 
-CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD)
+CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD, u_thread_pool_t handle)
 {
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
 
index 1b020eb..ca78b4d 100644 (file)
@@ -234,7 +234,11 @@ CAResult_t CAGetLEInterfaceInformation(CALocalConnectivity_t** info, uint32_t* s
     int32_t netInfoSize = 1;
 
     netInfo = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t) * netInfoSize);
-    VERIFY_NON_NULL_RET(netInfo, TAG, "malloc failed", CA_MEMORY_ALLOC_FAILED);
+    if(NULL == netInfo)
+    {
+        OIC_LOG_V(ERROR, TAG, "Invalid input..");
+        return CA_MEMORY_ALLOC_FAILED;
+    }
     memset(netInfo, 0, sizeof(CALocalConnectivity_t) * netInfoSize);
 
     char *macAddress = NULL;
index 622a995..3e1cc9d 100644 (file)
@@ -5,7 +5,6 @@
 #include "calecore.h"
 #include "caleserver.h"
 #include "caleutils.h"
-#include "caedrcore.h"
 
 #include "logger.h"
 #include "oic_malloc.h"
index 9e75510..60b8620 100644 (file)
@@ -923,10 +923,6 @@ int32_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, const
             }
             const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
 
-            if(jarrayObj == NULL) {
-                OIC_LOG(DEBUG, TAG, "jarrayObj is null");
-            }
-
             if(!strcmp(setAddress, address))
             {
                 OIC_LOG(DEBUG, TAG, "device address matched");
@@ -1288,8 +1284,8 @@ Java_com_iotivity_jar_CALeInterface_CALeGattServerCharacteristicWriteRequestCall
     jbyte *jni_byte_requestData = (char*)(*env)->GetByteArrayElements(env, data, &isCopy);
 
     char* requestData = NULL;
-    requestData = (char*) OICMalloc (sizeof(char) * length);
-    memset(requestData, 0, sizeof(char) * length);
+    requestData = (char*) OICMalloc (length + 1);
+    memset(requestData, 0, length + 1);
     strncpy(requestData, (char*)jni_byte_requestData, length);
     requestData[length] = '\0';
     (*env)->ReleaseByteArrayElements(env, data, jni_byte_requestData, JNI_ABORT);
index 346dd34..7bdb25c 100644 (file)
@@ -53,7 +53,7 @@ CAResult_t CAInitializeBle()
 CAResult_t CATerminateBle()
 {
     OIC_LOG(DEBUG, TAG, "IN");
-    ble_disconnect();
+    ble_radio_reset();
     OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 
index 1ef8aae..e29b18b 100644 (file)
@@ -223,6 +223,7 @@ CAResult_t CAInitBleAdapterMutex();
 *
 */
 void CATermiateBleAdapterMutex();
+static void CALEDataDestroyer(void *data, uint32_t size);
 
 CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
                           CANetworkPacketReceivedCallback reqRespCallback,
@@ -844,7 +845,7 @@ CAResult_t CAInitBleServerSenderQueue()
     }
 
     if (CA_STATUS_OK != CAQueueingThreadInitialize(gSendQueueHandle, gBleAdapterThreadPool,
-            CABLEServerSendDataThread, NULL))
+            CABLEServerSendDataThread, CALEDataDestroyer))
     {
         OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
         OICFree(gSendQueueHandle);
@@ -883,7 +884,7 @@ CAResult_t CAInitBleClientSenderQueue()
     }
 
     if (CA_STATUS_OK != CAQueueingThreadInitialize(gBLEClientSendQueueHandle, gBleAdapterThreadPool,
-            CABLEClientSendDataThread, NULL))
+            CABLEClientSendDataThread, CALEDataDestroyer))
     {
         OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
         OICFree(gBLEClientSendQueueHandle);
@@ -923,7 +924,7 @@ CAResult_t CAInitBleServerReceiverQueue()
     }
 
     if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleServerReceiverQueue, gBleAdapterThreadPool,
-            CABLEServerDataReceiverHandler, NULL))
+            CABLEServerDataReceiverHandler, CALEDataDestroyer))
     {
         OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
         OICFree(gCABleServerReceiverQueue);
@@ -1079,18 +1080,21 @@ void CABLEServerDataReceiverHandler(void *threadData)
             char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
             VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "header is NULL");
 
+            memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH);
             memcpy(header, bleData->data, CA_HEADER_LENGTH);
             totalDataLen = CAParseHeader(header);
+
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "data received in the first packet [%d] bytes", bleData->dataLen);
-            defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
+
+            defragData = (char *) OICMalloc(sizeof(char) * totalDataLen + 1);
             if (NULL == defragData)
             {
                 OIC_LOG(ERROR, CALEADAPTER_TAG, "defragData is NULL!");
                 OICFree(header);
                 return;
             }
-
+            memset(defragData, 0x0, sizeof(char) * totalDataLen + 1);
             OICFree(header);
 
             remoteAddress = bleData->remoteEndpoint->addressInfo.LE.leMacAddress;
@@ -1112,7 +1116,6 @@ void CABLEServerDataReceiverHandler(void *threadData)
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength  [%d] recveived Datalen [%d]",
                       totalDataLen, recvDataLen);
         }
-        CAFreeBLEData(bleData);
         if (totalDataLen == recvDataLen)
         {
             u_mutex_lock(gBleAdapterReqRespCbMutex);
@@ -1127,14 +1130,19 @@ void CABLEServerDataReceiverHandler(void *threadData)
             recvDataLen = 0;
             totalDataLen = 0;
             isHeaderAvailable = false;
+            remoteEndpoint = NULL;
+            defragData = NULL;
             u_mutex_unlock(gBleAdapterReqRespCbMutex);
         }
 
         if (false == gDataReceiverHandlerState)
         {
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
+            recvDataLen = 0;
+            totalDataLen = 0;
+            isHeaderAvailable = false;
             OICFree(defragData);
-            OICFree(remoteEndpoint);
+            CAAdapterFreeRemoteEndpoint(remoteEndpoint);
             u_mutex_unlock(gBleClientReceiveDataMutex);
             return;
         }
@@ -1209,7 +1217,6 @@ void CABLEClientDataReceiverHandler(void *threadData)
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength  [%d] recveived Datalen [%d]",
                       totalDataLen, recvDataLen);
         }
-        CAFreeBLEData(bleData);
         if (totalDataLen == recvDataLen)
         {
             u_mutex_lock(gBleAdapterReqRespCbMutex);
@@ -1224,6 +1231,8 @@ void CABLEClientDataReceiverHandler(void *threadData)
             recvDataLen = 0;
             totalDataLen = 0;
             isHeaderAvailable = false;
+            remoteEndpoint = NULL;
+            defragData = NULL;
             u_mutex_unlock(gBleAdapterReqRespCbMutex);
         }
 
@@ -1231,7 +1240,7 @@ void CABLEClientDataReceiverHandler(void *threadData)
         {
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
             OICFree(defragData);
-            OICFree(remoteEndpoint);
+            CAAdapterFreeRemoteEndpoint(remoteEndpoint);
             u_mutex_unlock(gBleClientReceiveDataMutex);
             return;
         }
@@ -1253,7 +1262,7 @@ void CABLEServerSendDataThread(void *threadData)
     char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
     VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
 
-    char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH);
+    char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH + 1);
     if (NULL == dataSegment)
     {
         OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
@@ -1262,7 +1271,7 @@ void CABLEServerSendDataThread(void *threadData)
     }
 
     memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
-    memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen );
+    memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH + 1 );
 
     CAResult_t result = CAGenerateHeader(header, bleData->dataLen);
     if (CA_STATUS_OK != result )
@@ -1275,6 +1284,7 @@ void CABLEServerSendDataThread(void *threadData)
 
     memcpy(dataSegment, header, CA_HEADER_LENGTH);
     OICFree(header);
+
     int32_t length = 0;
     if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
     {
@@ -1312,8 +1322,7 @@ void CABLEServerSendDataThread(void *threadData)
                      bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
     }
 
-    OICFree(bleData->remoteEndpoint);
-    OICFree(bleData);
+    OICFree(dataSegment);
     u_mutex_unlock(gBleServerSendDataMutex); // TODO: this mutex required  ?
 
     OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
@@ -1355,6 +1364,7 @@ void CABLEClientSendDataThread(void *threadData)
     }
     memcpy(dataSegment, header, CA_HEADER_LENGTH);
     OICFree(header);
+
     int32_t length = 0;
     if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
     {
@@ -1420,8 +1430,7 @@ void CABLEClientSendDataThread(void *threadData)
         }
     }
 
-    OICFree(bleData->remoteEndpoint);
-    OICFree(bleData);
+    OICFree(dataSegment);
     u_mutex_unlock(gBleClientSendDataMutex);
 
     OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
@@ -1439,13 +1448,14 @@ CABLEData *CACreateBLEData(const CARemoteEndpoint_t *remoteEndpoint, void *data,
     }
 
     bleData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
-    bleData->data = (void *)OICMalloc(dataLength);
+    bleData->data = (void *)OICMalloc(dataLength + 1);
     if (NULL == bleData->data)
     {
         OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
         CAFreeBLEData(bleData);
         return NULL;
     }
+    memset(bleData->data, 0x0, dataLength+1);
     memcpy(bleData->data, data, dataLength);
     bleData->dataLen = dataLength;
 
@@ -1462,6 +1472,14 @@ void CAFreeBLEData(CABLEData *bleData)
     OICFree(bleData);
 }
 
+void CALEDataDestroyer(void *data, uint32_t size)
+{
+    CABLEData *ledata = (CABLEData *) data;
+
+    CAFreeBLEData(ledata);
+}
+
+
 CAResult_t CABLEClientSendData(const CARemoteEndpoint_t *remoteEndpoint,
                                void *data,
                                uint32_t dataLen)
@@ -1565,14 +1583,12 @@ CAResult_t CABLEServerReceivedData(const char *remoteAddress, const char *servic
         return CA_MEMORY_ALLOC_FAILED;
     }
 
+    CAAdapterFreeRemoteEndpoint(remoteEndpoint);
     // Add message to send queue
     CAQueueingThreadAddData(gCABleServerReceiverQueue, bleData, sizeof(CABLEData));
 
     *sentLength = dataLength;
 
-    OICFree(data);
-    data = NULL;
-
     OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
     return CA_STATUS_OK;
 }
@@ -1609,14 +1625,12 @@ CAResult_t CABLEClientReceivedData(const char *remoteAddress, const char *servic
         return CA_MEMORY_ALLOC_FAILED;
     }
 
+    CAAdapterFreeRemoteEndpoint(remoteEndpoint);
     // Add message to send queue
     CAQueueingThreadAddData(gCABleClientReceiverQueue, bleData, sizeof(CABLEData));
 
     *sentLength = dataLength;
 
-    OICFree(data);
-    data = NULL;
-
     OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
     return CA_STATUS_OK;
 }
index 60467fa..e91c927 100644 (file)
@@ -73,7 +73,7 @@ CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
     CAResult_t result = CALEInitializeNetworkMonitor();
     if (CA_STATUS_OK != result)
     {
-        OIC_LOG_V(ERROR, TAG, "error");
+        OIC_LOG(ERROR, TAG, "error");
         return CA_STATUS_FAILED;
     }
 
@@ -120,7 +120,7 @@ CAResult_t CAStartLEListeningServer()
     CAResult_t result = CAInitializeBle();
     if (CA_STATUS_OK != result)
     {
-        OIC_LOG_V(ERROR, TAG, "error");
+        OIC_LOG(ERROR, TAG, "error");
         return CA_STATUS_FAILED;
     }
 
@@ -323,7 +323,7 @@ CAResult_t CAStopBleGattServer()
     CAResult_t result = CATerminateBle();
     if (CA_STATUS_OK != result)
     {
-        OIC_LOG_V(ERROR, TAG, "error");
+        OIC_LOG(ERROR, TAG, "error");
         return CA_STATUS_FAILED;
     }
     return CA_STATUS_OK;
index d6cb338..2c3ec75 100644 (file)
@@ -193,6 +193,8 @@ void CABleGattCharacteristicChangedCb(bt_gatt_attribute_h characteristic,
 
     u_mutex_unlock(gBleReqRespClientCbMutex);
 
+    OICFree(data);
+
     OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "OUT");
     return;
 }
@@ -1669,7 +1671,8 @@ CAResult_t  CAUpdateCharacteristicsToGattServer(const char *remoteAddress,
         OICFree(value);
         return CA_STATUS_FAILED;
     }
-    // OICFree(value);
+
+    OICFree(value);
 
     OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "OUT");
     return CA_STATUS_OK;
index 8a317fe..8fe2764 100644 (file)
@@ -692,6 +692,7 @@ void CABleGattRemoteCharacteristicWriteCb(char *charPath,
 
     u_mutex_unlock(gBleReqRespCbMutex);
 
+    OICFree(data);
     OIC_LOG(DEBUG, TZ_BLE_SERVER_TAG, "OUT");
 }
 
@@ -814,8 +815,8 @@ CAResult_t CAUpdateCharacteristicsInGattServer(const char *charValue,
         u_mutex_unlock(gBleCharacteristicMutex);
         return CA_STATUS_FAILED;
     }
-    OICFree(data);
 
+    OICFree(data);
     u_mutex_unlock(gBleCharacteristicMutex);
 
     OIC_LOG(ERROR, TZ_BLE_SERVER_TAG, "OUT");
index b9dfd81..446d4bd 100644 (file)
@@ -136,7 +136,7 @@ CAResult_t CASendRequest(const CARemoteEndpoint_t *object, CARequestInfo_t *requ
 CAResult_t CASendRequestToAll(const CAGroupEndpoint_t *object,
                               const CARequestInfo_t *requestInfo)
 {
-    OIC_LOG_V(DEBUG, TAG, "CASendRequestToAll");
+    OIC_LOG(DEBUG, TAG, "CASendRequestToAll");
 
     return CADetachRequestToAllMessage(object, requestInfo);
 }
index b7671ef..898e5b4 100644 (file)
@@ -36,7 +36,7 @@
 
 #define TAG "CAIFCNT_ST"
 
-#define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG_V(DEBUG, TAG, "Out of memory");\
+#define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG(DEBUG, TAG, "Out of memory");\
     goto memory_error_exit;} }
 
 #define CA_CONNECTIVITY_TYPE_NUM   4
@@ -82,7 +82,7 @@ static void CARegisterCallback(CAConnectivityHandler_t handler, CAConnectivityTy
     OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data, 
+static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data,
     uint32_t dataLen)
 {
     OIC_LOG(DEBUG, TAG, "IN");
@@ -266,7 +266,7 @@ CAResult_t CAGetNetworkInfo(CALocalConnectivity_t **info, uint32_t *size)
     *info = resInfo;
     *size = resSize;
 
-    OIC_LOG_V(DEBUG, TAG, "OUT");
+    OIC_LOG(DEBUG, TAG, "OUT");
 
     return res;
 
@@ -286,7 +286,7 @@ CAResult_t CASendUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uin
 
     if (endpoint == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "RemoteEndpoint is NULL");
+        OIC_LOG(DEBUG, TAG, "RemoteEndpoint is NULL");
         return CA_STATUS_INVALID_PARAM;
     }
 
@@ -437,7 +437,7 @@ CAResult_t CAStartDiscoveryServerAdapters()
 
         if (index == -1)
         {
-            OIC_LOG_V(DEBUG, TAG, "unknown connectivity type!");
+            OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
             continue;
         }
 
@@ -494,7 +494,7 @@ CAResult_t CAReadData()
 
         if (-1 == index)
         {
-            OIC_LOG_V(DEBUG, TAG, "unknown connectivity type!");
+            OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
             continue;
         }
 
index e6a37a2..9bf9854 100644 (file)
@@ -43,7 +43,7 @@
 #define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG_V(DEBUG, TAG, "memory error"); \
 goto memory_error_exit;} }
 
-#define MAX_THREAD_POOL_SIZE    10
+#define MAX_THREAD_POOL_SIZE    20
 
 typedef enum
 {
@@ -53,9 +53,9 @@ typedef enum
 typedef struct
 {
     CASendDataType_t type;
-    const CARemoteEndpoint_t *remoteEndpoint;
-    const CARequestInfo_t *requestInfo;
-    const CAResponseInfo_t *responseInfo;
+    CARemoteEndpoint_t *remoteEndpoint;
+    CARequestInfo_t *requestInfo;
+    CAResponseInfo_t *responseInfo;
     CAHeaderOption_t *options;
     uint8_t numOptions;
 } CAData_t;
@@ -153,7 +153,7 @@ static void CAReceiveThreadProcess(void *threadData)
 {
     // Currently not supported
        // This will be enabled when RI supports multi threading
-#if 0 
+#if 0
     CAData_t *data = (CAData_t *) threadData;
 
     if (data == NULL)
index 563e47f..78996e6 100644 (file)
@@ -37,7 +37,7 @@
 
 #define TAG "CAMH_ST"
 
-#define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG_V(DEBUG, TAG, "Out of memory");\
+#define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG(DEBUG, TAG, "Out of memory");\
     goto memory_error_exit;} }
 
 #define MAX_THREAD_POOL_SIZE    10
@@ -51,9 +51,9 @@ typedef enum
 typedef struct
 {
     CASendDataType_t type;
-    const CARemoteEndpoint_t *remoteEndpoint;
-    const CARequestInfo_t *requestInfo;
-    const CAResponseInfo_t *responseInfo;
+    CARemoteEndpoint_t *remoteEndpoint;
+    CARequestInfo_t *requestInfo;
+    CAResponseInfo_t *responseInfo;
     CAHeaderOption_t *options;
     uint8_t numOptions;
 } CAData_t;
@@ -83,14 +83,14 @@ static void CAProcessData(CAData_t *data)
 
         if (data->requestInfo != NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "reqInfo avlbl");
+            OIC_LOG(DEBUG, TAG, "reqInfo avlbl");
 
             pdu = (coap_pdu_t *) CAGeneratePdu(data->remoteEndpoint->resourceUri,
                                                data->requestInfo->method, data->requestInfo->info);
         }
         else if (data->responseInfo != NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "resInfo avlbl");
+            OIC_LOG(DEBUG, TAG, "resInfo avlbl");
 
             pdu = (coap_pdu_t *) CAGeneratePdu(data->remoteEndpoint->resourceUri,
                                                data->responseInfo->result, data->responseInfo->info);
index 60c19b6..51b409a 100644 (file)
@@ -51,6 +51,7 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
     switch (ConnectivityType)
     {
         case CA_ETHERNET:
+        {
 
 #ifndef ETHERNET_ADAPTER
             OIC_LOG_V(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
@@ -62,9 +63,11 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
             {
                 u_arraylist_add(gSelectedNetworkList, &NETWORK_ETHERNET);
             }
+        }
             break;
 
         case CA_WIFI:
+        {
 
 #ifndef WIFI_ADAPTER
             OIC_LOG_V(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
@@ -76,9 +79,11 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
             {
                 u_arraylist_add(gSelectedNetworkList, &NETWORK_WIFI);
             }
+        }
             break;
 
         case CA_EDR:
+        {
 
 #ifndef EDR_ADAPTER
             OIC_LOG_V(DEBUG, TAG, "Add network type(EDR) - Not Supported");
@@ -90,9 +95,11 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
             {
                 u_arraylist_add(gSelectedNetworkList, &NETWORK_EDR);
             }
+        }
             break;
 
         case CA_LE:
+        {
 
 #ifndef LE_ADAPTER
             OIC_LOG_V(DEBUG, TAG, "Add network type(LE) - Not Supported");
@@ -104,6 +111,7 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
             {
                 u_arraylist_add(gSelectedNetworkList, &NETWORK_LE);
             }
+        }
             break;
 
     }
@@ -192,10 +200,11 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
 
             // stop selected interface adapter
             CAStopAdapter(connType);
+            return CA_STATUS_OK;
         }
     }
 
-    return CA_STATUS_OK;
+    return CA_STATUS_FAILED;
 }
 
 u_arraylist_t *CAGetSelectedNetworkList()
index 919f403..1679c27 100644 (file)
@@ -52,10 +52,10 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
         case CA_ETHERNET:
 
 #ifdef ETHERNET_ADAPTER
-            OIC_LOG_V(DEBUG, TAG, "Add network type(ETHERNET)");
+            OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET)");
             u_arraylist_add(gSelectedNetworkList, &NETWORK_ETHERNET);
 #else
-            OIC_LOG_V(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
+            OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
             return CA_NOT_SUPPORTED;
 #endif /* ETHERNET_ADAPTER */
 
@@ -64,10 +64,10 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
         case CA_WIFI:
 
 #ifdef WIFI_ADAPTER
-            OIC_LOG_V(DEBUG, TAG, "Add network type(WIFI)");
+            OIC_LOG(DEBUG, TAG, "Add network type(WIFI)");
             u_arraylist_add(gSelectedNetworkList, &NETWORK_WIFI);
 #else
-            OIC_LOG_V(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
+            OIC_LOG(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
             return CA_NOT_SUPPORTED;
 #endif /* WIFI_ADAPTER */
 
@@ -76,10 +76,10 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
         case CA_EDR:
 
 #ifdef EDR_ADAPTER
-            OIC_LOG_V(DEBUG, TAG, "Add network type(EDR)");
+            OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
             u_arraylist_add(gSelectedNetworkList, &NETWORK_EDR);
 #else
-            OIC_LOG_V(DEBUG, TAG, "Add network type(EDR) - Not Supported");
+            OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
             return CA_NOT_SUPPORTED;
 #endif /* EDR_ADAPTER */
 
@@ -88,10 +88,10 @@ CAResult_t CAAddNetworkType(uint32_t ConnectivityType)
         case CA_LE:
 
 #ifdef LE_ADAPTER
-            OIC_LOG_V(DEBUG, TAG, "Add network type(LE)");
+            OIC_LOG(DEBUG, TAG, "Add network type(LE)");
             u_arraylist_add(gSelectedNetworkList, &NETWORK_LE);
 #else
-            OIC_LOG_V(DEBUG, TAG, "Add network type(LE) - Not Supported");
+            OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
             return CA_NOT_SUPPORTED;
 #endif /* LE_ADAPTER */
 
@@ -112,7 +112,7 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
     CAConnectivityType_t connType;
     if (gSelectedNetworkList == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "Selected network not found");
+        OIC_LOG(DEBUG, TAG, "Selected network not found");
 
         return CA_STATUS_FAILED;
     }
@@ -135,11 +135,11 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
                 case CA_ETHERNET:
 
 #ifndef ETHERNET_ADAPTER
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(ETHERNET) - Not Supported");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(ETHERNET) - Not Supported");
                     return CA_NOT_SUPPORTED;
 #else
 
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(ETHERNET)");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(ETHERNET)");
                     u_arraylist_remove(gSelectedNetworkList, index);
 #endif /* ETHERNET_ADAPTER */
                     break;
@@ -147,10 +147,10 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
                 case CA_WIFI:
 
 #ifndef WIFI_ADAPTER
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(WIFI) - Not Supported");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(WIFI) - Not Supported");
                     return CA_NOT_SUPPORTED;
 #else
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(WIFI)");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(WIFI)");
                     u_arraylist_remove(gSelectedNetworkList, index);
 #endif /* WIFI_ADAPTER */
 
@@ -159,10 +159,10 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
                 case CA_EDR:
 
 #ifndef EDR_ADAPTER
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
                     return CA_NOT_SUPPORTED;
 #else
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(EDR)");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(EDR)");
                     u_arraylist_remove(gSelectedNetworkList, index);
 #endif /* EDR_ADAPTER */
 
@@ -171,10 +171,10 @@ CAResult_t CARemoveNetworkType(uint32_t ConnectivityType)
                 case CA_LE:
 
 #ifndef LE_ADAPTER
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(LE) - Not Supported");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(LE) - Not Supported");
                     return CA_NOT_SUPPORTED;
 #else
-                    OIC_LOG_V(DEBUG, TAG, "Remove network type(LE)");
+                    OIC_LOG(DEBUG, TAG, "Remove network type(LE)");
                     u_arraylist_remove(gSelectedNetworkList, index);
 #endif /* LE_ADAPTER */
 
@@ -201,7 +201,7 @@ CAResult_t CAGetNetworkInformationInternal(CALocalConnectivity_t **info, uint32_
 
 CAResult_t CATerminateNetworkType()
 {
-    OIC_LOG_V(DEBUG, TAG, "CATerminateNetworkType()");
+    OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
     if(gSelectedNetworkList != NULL)
     {
         u_arraylist_free(&gSelectedNetworkList);
index 015273e..5221549 100644 (file)
@@ -21,7 +21,7 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
-\r
+#include <time.h>\r
 \r
 #include "caprotocolmessage.h"\r
 #include "logger.h"\r
@@ -34,8 +34,7 @@
 #define CA_BUFSIZE 128\r
 #define CA_COAP_MESSAGE_CON 0\r
 \r
-#include <time.h>\r
-\r
+static int32_t SEED = 0;\r
 \r
 uint32_t CAGetRequestInfoFromPdu(const coap_pdu_t *pdu, CARequestInfo_t *outReqInfo,\r
                                  char *outUri)\r
@@ -88,8 +87,7 @@ coap_pdu_t *CAGeneratePdu(const char *uri, const uint32_t code, const CAInfo_t i
 \r
     uint32_t uriLength = length + coapHeaderLength + 1;\r
     coapUri = (char *) OICMalloc(uriLength);\r
-\r
-    if (coapUri == NULL)\r
+    if (NULL == coapUri)\r
     {\r
         OIC_LOG(DEBUG, TAG, "CAGeneratePdu, Memory allocation failed !");\r
         return NULL;\r
@@ -98,17 +96,16 @@ coap_pdu_t *CAGeneratePdu(const char *uri, const uint32_t code, const CAInfo_t i
 \r
     if (NULL != coapUri)\r
     {\r
-        memcpy(coapUri, "coap://[::]/", coapHeaderLength);\r
-        memcpy(coapUri + coapHeaderLength, uri, length);\r
+        strcat(coapUri, "coap://[::]/");\r
+        strcat(coapUri, uri);\r
 \r
         // parsing options in URI\r
         CAParseURI(coapUri, &optlist);\r
+        OICFree(coapUri);\r
+        coapUri = NULL;\r
 \r
         // parsing options in HeadOption\r
         CAParseHeadOption(code, info, &optlist);\r
-\r
-        OICFree(coapUri);\r
-        coapUri = NULL;\r
     }\r
 \r
     if (NULL != info.payload) // payload is include in request / response\r
@@ -566,10 +563,21 @@ CAResult_t CAGenerateTokenInternal(CAToken_t *token)
     }\r
     memset(temp, 0, sizeof(char) * (CA_MAX_TOKEN_LEN + 1));\r
 \r
+    if (SEED == 0)\r
+    {\r
+        SEED = time(NULL);\r
+        if (SEED == -1)\r
+        {\r
+            OIC_LOG(DEBUG, TAG, "Failed to Create Seed!");\r
+            SEED = 0;\r
+            OICFree(temp);\r
+            return CA_STATUS_FAILED;\r
+        }\r
+        srand(SEED);\r
+    }\r
+\r
     // set random byte\r
     uint32_t index;\r
-\r
-    srand(time(NULL));\r
     for (index = 0; index < CA_MAX_TOKEN_LEN; index++)\r
     {\r
         // use valid characters\r
index 7fcbba3..fc6b2d1 100644 (file)
@@ -99,16 +99,18 @@ static void CAQueueingThreadBaseRoutine(void *threadValue)
         u_queue_message_t *message = u_queue_get_element(thread->dataQueue);
 
         // free
-        if (thread->destroy != NULL)
-        {
-            thread->destroy(message->msg, message->size);
+        if(message != NULL) {
+            if (thread->destroy != NULL)
+            {
+                thread->destroy(message->msg, message->size);
+            }
+            else
+            {
+                OICFree(message->msg);
+            }
+
+            OICFree(message);
         }
-        else
-        {
-            OICFree(message->msg);
-        }
-
-        OICFree(message);
     }
 
     u_cond_signal(thread->threadCond);
index aa11425..6807623 100644 (file)
@@ -36,7 +36,7 @@ CARemoteEndpoint_t *CACloneRemoteEndpoint(const CARemoteEndpoint_t *rep)
     CARemoteEndpoint_t *clone = (CARemoteEndpoint_t *) OICMalloc(sizeof(CARemoteEndpoint_t));
     if (clone == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACloneRemoteEndpoint Out of memory");
+        OIC_LOG(DEBUG, TAG, "CACloneRemoteEndpoint Out of memory");
         return NULL;
     }
     memset(clone, 0, sizeof(CARemoteEndpoint_t));
@@ -50,7 +50,7 @@ CARemoteEndpoint_t *CACloneRemoteEndpoint(const CARemoteEndpoint_t *rep)
         temp = (char *) OICMalloc(sizeof(char) * (len + 1));
         if (temp == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneRemoteEndpoint Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneRemoteEndpoint Out of memory");
 
             CADestroyRemoteEndpointInternal(clone);
 
@@ -156,14 +156,14 @@ CARemoteEndpoint_t *CACreateRemoteEndpointUriInternal(const CAURI_t uri,
 
     if (len <= 0)
     {
-        OIC_LOG_V(DEBUG, TAG, "uri length is 0!");
+        OIC_LOG(DEBUG, TAG, "uri length is 0!");
         return NULL;
     }
 
     cloneUri = (char *) OICMalloc(sizeof(char) * (len + 1));
     if (cloneUri == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACreateRemoteEndpointUriInternal Out of memory");
+        OIC_LOG(DEBUG, TAG, "CACreateRemoteEndpointUriInternal Out of memory");
         return NULL;
     }
     memset(cloneUri, 0, sizeof(char) * (len + 1));
@@ -200,7 +200,7 @@ CARemoteEndpoint_t *CACreateRemoteEndpointUriInternal(const CAURI_t uri,
     int resType = getCAAddress(pAddress, &address);
     if (resType == -1)
     {
-        OIC_LOG_V(DEBUG, TAG, "address parse error");
+        OIC_LOG(DEBUG, TAG, "address parse error");
 
         OICFree(cloneUri);
         return NULL;
@@ -212,7 +212,7 @@ CARemoteEndpoint_t *CACreateRemoteEndpointUriInternal(const CAURI_t uri,
     CARemoteEndpoint_t *remoteEndpoint = CACreateRemoteEndpointInternal(resourceUri, address, connectivityType);
     if (remoteEndpoint == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "create remote endpoint fail");
+        OIC_LOG(DEBUG, TAG, "create remote endpoint fail");
 
         OICFree(cloneUri);
         return NULL;
@@ -233,7 +233,7 @@ CARemoteEndpoint_t *CACreateRemoteEndpointInternal(const CAURI_t resourceUri,
 
     if (resourceUri == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "uri is null value");
+        OIC_LOG(DEBUG, TAG, "uri is null value");
         return NULL;
     }
 
@@ -242,7 +242,7 @@ CARemoteEndpoint_t *CACreateRemoteEndpointInternal(const CAURI_t resourceUri,
 
     if (rep == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACreateRemoteEndpointInternal of memory");
+        OIC_LOG(DEBUG, TAG, "CACreateRemoteEndpointInternal of memory");
         return NULL;
     }
     memset(rep, 0, sizeof(CARemoteEndpoint_t));
@@ -253,7 +253,7 @@ CARemoteEndpoint_t *CACreateRemoteEndpointInternal(const CAURI_t resourceUri,
     temp = (char *) OICMalloc(sizeof(char) * (len + 1));
     if (temp == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACreateRemoteEndpointInternal Out of memory");
+        OIC_LOG(DEBUG, TAG, "CACreateRemoteEndpointInternal Out of memory");
 
         CADestroyRemoteEndpointInternal(rep);
 
@@ -286,7 +286,7 @@ CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep)
     CARequestInfo_t *clone = (CARequestInfo_t *) OICMalloc(sizeof(CARequestInfo_t));
     if (clone == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACloneRequestInfo Out of memory");
+        OIC_LOG(DEBUG, TAG, "CACloneRequestInfo Out of memory");
         return NULL;
     }
     memset(clone, 0, sizeof(CARequestInfo_t));
@@ -300,7 +300,7 @@ CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep)
         temp = (char *) OICMalloc(sizeof(char) * (len + 1));
         if (temp == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneRequestInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneRequestInfo Out of memory");
 
             CADestroyRequestInfoInternal(clone);
 
@@ -319,7 +319,7 @@ CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep)
         clone->info.options = (CAHeaderOption_t *) OICMalloc(sizeof(CAHeaderOption_t));
         if (clone->info.options == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneRequestInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneRequestInfo Out of memory");
             OICFree(clone->info.token);
             OICFree(clone);
             return NULL;
@@ -336,7 +336,7 @@ CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep)
         temp = (char *) OICMalloc(sizeof(char) * (len + 1));
         if (temp == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneRequestInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneRequestInfo Out of memory");
 
             CADestroyRequestInfoInternal(clone);
 
@@ -364,7 +364,7 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
     CAResponseInfo_t *clone = (CAResponseInfo_t *) OICMalloc(sizeof(CAResponseInfo_t));
     if (clone == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "CACloneResponseInfo Out of memory");
+        OIC_LOG(DEBUG, TAG, "CACloneResponseInfo Out of memory");
         return NULL;
     }
     memset(clone, 0, sizeof(CAResponseInfo_t));
@@ -378,7 +378,7 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
         temp = (char *) OICMalloc(sizeof(char) * (len + 1));
         if (temp == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneResponseInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneResponseInfo Out of memory");
 
             CADestroyResponseInfoInternal(clone);
 
@@ -397,7 +397,7 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
         clone->info.options = (CAHeaderOption_t *) OICMalloc(sizeof(CAHeaderOption_t));
         if (clone->info.options == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneResponseInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneResponseInfo Out of memory");
             OICFree(clone->info.token);
             OICFree(clone);
             return NULL;
@@ -414,7 +414,7 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
         temp = (char *) OICMalloc(sizeof(char) * (len + 1));
         if (temp == NULL)
         {
-            OIC_LOG_V(DEBUG, TAG, "CACloneResponseInfo Out of memory");
+            OIC_LOG(DEBUG, TAG, "CACloneResponseInfo Out of memory");
 
             CADestroyResponseInfoInternal(clone);
 
index a5d49f4..776e9be 100644 (file)
@@ -151,7 +151,7 @@ void CARetransmissionBaseRoutine(void *threadValue)
 
     if (context == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "error");
+        OIC_LOG(DEBUG, TAG, "error");
         return;
     }
 
@@ -172,7 +172,7 @@ CAResult_t CARetransmissionInitialize(CARetransmission_t *context,
     OIC_LOG(DEBUG, TAG, "IN");
     if (context == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "error");
+        OIC_LOG(DEBUG, TAG, "error");
         return CA_STATUS_FAILED;
     }
 
@@ -292,7 +292,7 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
     OIC_LOG(DEBUG, TAG, "IN");
     if (context == NULL || endpoint == NULL || pdu == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "error");
+        OIC_LOG(DEBUG, TAG, "error");
         return CA_STATUS_INVALID_PARAM;
     }
 
@@ -360,7 +360,7 @@ CAResult_t CARetransmissionStop(CARetransmission_t *context)
     OIC_LOG(DEBUG, TAG, "IN");
     if (context == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "error");
+        OIC_LOG(DEBUG, TAG, "error");
         return CA_STATUS_FAILED;
     }
 
@@ -375,7 +375,7 @@ CAResult_t CARetransmissionDestroy(CARetransmission_t *context)
     OIC_LOG(DEBUG, TAG, "IN");
     if (context == NULL)
     {
-        OIC_LOG_V(DEBUG, TAG, "error");
+        OIC_LOG(DEBUG, TAG, "error");
         return CA_STATUS_FAILED;
     }
 
index a31dbb7..f88766e 100644 (file)
@@ -13,8 +13,8 @@ src_dir = './src/ethernet_adapter/'
 #Source files to build common for all platforms
 if target_os == 'arduino':
        env.AppendUnique(CA_SRC=[src_dir+'caethernetadapter_singlethread.c'])
+       env.AppendUnique(CPPPATH=[src_dir+'arduino/'])
 else:
-        env.AppendUnique(CPPPATH=[src_dir+'arduino/'])
         env.AppendUnique(CA_SRC=[src_dir+'caethernetadapter.c'])
 
 #Source files to build in Linux platform
index 82ce84d..517bee9 100644 (file)
  * @def CA_PORT
  * @brief Port to listen for incoming data
  */
-#define CA_PORT   5683
+#define CA_PORT   5298
 
 /**
- * @def CA_PORT
- * @brief Port to listen for incoming data
+ * @def CA_SECURE_PORT
+ * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
  */
 #define CA_SECURE_PORT   5684
 
 /**
  * @def CA_MCAST_PORT
- * @brief Multicast Port Number
+ * @brief Multicast port number as defined in COAP Specification, RFC-7252.
  */
-#define CA_MCAST_PORT   5298
+#define CA_MCAST_PORT   5683
 
 /**
  * @def CA_MULTICAST_IP
- * @brief Multicast IP Address
+ * @brief Multicast IP Address as defined in COAP Specification, RFC-7252.
  */
 #define CA_MULTICAST_IP "224.0.1.187"
 
-
 typedef struct
 {
     CARemoteEndpoint_t *remoteEndpoint;
index a3d6fb0..a8849ea 100644 (file)
 
 /**
  * @def CA_PORT
- * @brief Port to listen for incoming data. Port 5683 is as per COAP RFC.
+ * @brief Unicast port number (to listen for incoming data on unicast server).
+ * Note :- Actual port number may differ based on result of bind() operation.
  */
-#define CA_PORT   5683
+#define CA_PORT   5298
 
-#define CA_MCAST_PORT   5298
+/**
+ * @def CA_SECURE_PORT
+ * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
+ */
+#define CA_SECURE_PORT   5684
+
+/**
+ * @def CA_MCAST_PORT
+ * @brief Multicast port number as defined in COAP Specification, RFC-7252.
+ */
+#define CA_MCAST_PORT   5683
 
 /**
  * @def CA_MULTICAST_IP
@@ -100,7 +111,7 @@ void CAEthernetNotifyNetworkChange(const char *address, const int16_t port,
     CALocalConnectivity_t *localEndpoint = CAAdapterCreateLocalEndpoint(CA_ETHERNET, address);
     if (!localEndpoint)
     {
-        OIC_LOG_V(ERROR, ETHERNET_ADAPTER_TAG, "Out of memory!");
+        OIC_LOG(ERROR, ETHERNET_ADAPTER_TAG, "Out of memory!");
         return;
     }
     localEndpoint->addressInfo.IP.port = port;
@@ -293,7 +304,7 @@ CAResult_t CAStartEthernetListeningServer()
     int32_t serverFD = 1;
     if (gIsMulticastServerStarted == true)
     {
-        OIC_LOG_V(ERROR, ETHERNET_ADAPTER_TAG, "Already Started!");
+        OIC_LOG(ERROR, ETHERNET_ADAPTER_TAG, "Already Started!");
         return CA_SERVER_STARTED_ALREADY;
     }
 
@@ -301,7 +312,7 @@ CAResult_t CAStartEthernetListeningServer()
     bool retVal = CAEthernetIsConnected();
     if (false == retVal)
     {
-        OIC_LOG_V(ERROR, ETHERNET_ADAPTER_TAG,
+        OIC_LOG(ERROR, ETHERNET_ADAPTER_TAG,
                   "No ethernet");
         return CA_ADAPTER_NOT_ENABLED;
     }
@@ -335,7 +346,7 @@ uint32_t CASendEthernetUnicastData(const CARemoteEndpoint_t *remoteEndpoint, voi
     VERIFY_NON_NULL_RET(data, ETHERNET_ADAPTER_TAG, "data", dataSize);
     if (dataLength == 0)
     {
-        OIC_LOG_V(ERROR, ETHERNET_ADAPTER_TAG, "Invalid length");
+        OIC_LOG(ERROR, ETHERNET_ADAPTER_TAG, "Invalid length");
         return dataSize;
     }
 
@@ -353,7 +364,7 @@ uint32_t CASendEthernetMulticastData(void *data, uint32_t dataLength)
     VERIFY_NON_NULL_RET(data, ETHERNET_ADAPTER_TAG, "data", dataSize);
     if (dataLength == 0)
     {
-        OIC_LOG_V(ERROR, ETHERNET_ADAPTER_TAG, "Invalid length");
+        OIC_LOG(ERROR, ETHERNET_ADAPTER_TAG, "Invalid length");
         return dataSize;
     }
 
index 42004bd..400d746 100644 (file)
@@ -235,6 +235,11 @@ static void CAReceiveHandler(void *data)
         if (!CAAdapterIsSameSubnet(gMulticastServerInterface, srcIPAddress, netMask))
         {
             OIC_LOG(DEBUG, ETHERNET_SERVER_TAG, "Packet received from different subnet, Ignore!");
+            if (NULL != netMask)
+            {
+                OICFree(netMask);
+            }
+            netMask = NULL;
             continue;
         }
 
index b9a1127..bbd1a01 100644 (file)
@@ -271,7 +271,6 @@ void CAWiFiGetInterfaceInformation(char **interfaceName, char **ipAddress, char
     char buf[1024] =  { 0, };
     struct ifconf ifc;
     struct ifreq* ifr;
-    struct ifreq* item;
     int32_t sck;
     int32_t interfaces;
     int32_t i;
@@ -502,7 +501,6 @@ JNIEXPORT void JNICALL Java_com_iotivity_jar_CAWiFiInterface_CAWiFiStateEnabled
     OIC_LOG_V(DEBUG, WIFI_MONITOR_TAG, "[WiFiCore] CAWiFiStateEnabled");
 
     CASendNetworkChangeCallback(currNetworkStatus);
-    return;
 }
 
 
@@ -515,6 +513,5 @@ JNIEXPORT void JNICALL Java_com_iotivity_jar_CAWiFiInterface_CAWiFiStateDisabled
     OIC_LOG_V(DEBUG, WIFI_MONITOR_TAG, "[WiFiCore] CAWiFiStateDisabled");
 
     CASendNetworkChangeCallback(currNetworkStatus);
-    return;
 }
 
index cd69ec6..2802975 100644 (file)
@@ -552,6 +552,7 @@ CAResult_t CAWiFiStartUnicastServer(const char *localAddress, int16_t *port,
                 &gUnicastServerSocketFD))
         {
             OIC_LOG_V(ERROR, WIFI_SERVER_TAG, "Failed to start unicast server!");
+            close(gUnicastServerSocketFD);
             gUnicastServerSocketFD = -1;
             u_mutex_unlock(gMutexUnicastServer);
             return CA_STATUS_FAILED;
index 9f7db93..8351e8c 100644 (file)
 
 /**
  * @def CA_PORT
- * @brief Port to listen for incoming data. port 5683 is as per COAP RFC.
+ * @brief Unicast port number (to listen for incoming data on unicast server).
+ * Note :- Actual port number may differ based on result of bind() operation.
  */
-#define CA_PORT   5683
+#define CA_PORT   5298
 
 /**
  * @def CA_SECURE_PORT
- * @brief Secure port to listen for incoming data
+ * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
  */
 #define CA_SECURE_PORT   5684
 
 /**
  * @def CA_MCAST_PORT
- * @brief Multicast Port Number
+ * @brief Multicast port number as defined in COAP Specification, RFC-7252.
  */
-#define CA_MCAST_PORT   5298
+#define CA_MCAST_PORT   5683
 
 /**
  * @def CA_MULTICAST_IP
- * @brief Multicast IP Address
+ * @brief Multicast IP Address as defined in COAP Specification, RFC-7252.
  */
 #define CA_MULTICAST_IP "224.0.1.187"
 
-
 typedef struct
 {
     CARemoteEndpoint_t *remoteEndpoint;
index 40bb815..f8b7134 100644 (file)
 /**
  * @def CA_PORT
  * @brief Port to listen for incoming data. Port 5683 is as per COAP RFC.
+ * Note :- Actual port number may differ based on result of bind() operation.
  */
-#define CA_PORT   5683
+#define CA_PORT   5298
+
+/**
+ * @def CA_SECURE_PORT
+ * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
+ */
+#define CA_SECURE_PORT   5684
 
 /**
  * @def CA_MCAST_PORT
- * @brief Multicast Port Number
+ * @brief Multicast port number as defined in COAP Specification, RFC-7252.
  */
-#define CA_MCAST_PORT   5298
+#define CA_MCAST_PORT   5683
 
 /**
  * @def CA_MULTICAST_IP
@@ -106,7 +113,7 @@ void CAWiFiNotifyNetworkChange(const char *address, const int16_t port,
     CALocalConnectivity_t *localEndpoint = CAAdapterCreateLocalEndpoint(CA_WIFI, address);
     if (!localEndpoint)
     {
-        OIC_LOG_V(ERROR, WIFI_ADAPTER_TAG, "Out of memory");
+        OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Out of memory");
         return;
     }
     localEndpoint->addressInfo.IP.port = port;
@@ -306,7 +313,7 @@ CAResult_t CAStartWIFIListeningServer()
 
     if (gIsMulticastServerStarted == true)
     {
-        OIC_LOG_V(ERROR, WIFI_ADAPTER_TAG, "Multicast Server, Already Started!");
+        OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Multicast Server, Already Started!");
         return CA_SERVER_STARTED_ALREADY;
     }
 
@@ -315,7 +322,7 @@ CAResult_t CAStartWIFIListeningServer()
     bool retVal = CAWiFiIsConnected();
     if (false == retVal)
     {
-        OIC_LOG_V(ERROR, WIFI_ADAPTER_TAG, "Failed : WIFI not Connected");
+        OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Failed : WIFI not Connected");
         return CA_ADAPTER_NOT_ENABLED;
     }
 
@@ -349,7 +356,7 @@ uint32_t CASendWIFIUnicastData(const CARemoteEndpoint_t *remoteEndpoint, void *d
     VERIFY_NON_NULL_RET(data, WIFI_ADAPTER_TAG, "data", dataSize);
     if (dataLength == 0)
     {
-        OIC_LOG_V(ERROR, WIFI_ADAPTER_TAG, "Invalid Data Length");
+        OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Invalid Data Length");
         return dataSize;
     }
 
@@ -367,7 +374,7 @@ uint32_t CASendWIFIMulticastData(void *data, uint32_t dataLength)
     VERIFY_NON_NULL_RET(data, WIFI_ADAPTER_TAG, "data", dataSize);
     if (dataLength == 0)
     {
-        OIC_LOG_V(ERROR, WIFI_ADAPTER_TAG, "Invalid Data Length");
+        OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Invalid Data Length");
         return dataSize;
     }
 
index 141e3a4..65eefc6 100644 (file)
@@ -231,6 +231,11 @@ static void CAReceiveHandler(void *data)
         if (!CAAdapterIsSameSubnet(gMulticastServerInterface, srcIPAddress, netMask))\r
         {\r
             OIC_LOG(DEBUG, WIFI_SERVER_TAG, "Packet received from different subnet, Ignore!");\r
+            if (NULL != netMask)\r
+            {\r
+                OICFree(netMask);\r
+            }\r
+            netMask = NULL;\r
             continue;\r
         }\r
 \r
index dbefaf2..448edab 100644 (file)
@@ -123,6 +123,12 @@ void CAWiFiTerminateNetworkMonitor(void)
         gWifiIPAddress = NULL;
     }
 
+    if (gWifiSubnetMask)
+    {
+        OICFree(gWifiSubnetMask);
+        gWifiSubnetMask = NULL;
+    }
+
     if (gWifiNetInfoMutex)
     {
         u_mutex_free(gWifiNetInfoMutex);
index 23c8d33..4c8823a 100644 (file)
@@ -231,6 +231,11 @@ static void CAReceiveHandler(void *data)
         if (!CAAdapterIsSameSubnet(gMulticastServerInterface, srcIPAddress, netMask))
         {
             OIC_LOG(DEBUG, WIFI_SERVER_TAG, "Packet received from different subnet, Ignore!");
+            if (NULL != netMask)
+            {
+                OICFree(netMask);
+            }
+            netMask = NULL;
             continue;
         }
 
@@ -264,6 +269,9 @@ static void CAReceiveHandler(void *data)
         }
     }
 
+    // free context
+    OICFree(ctx);
+
     OIC_LOG(DEBUG, WIFI_SERVER_TAG, "OUT");
 }
 
index fdea97d..fdcfa6e 100644 (file)
@@ -6,4 +6,7 @@ TCT Unit tests for Tizen:
 4. Copy packaging/core-liboic-tests.spec to <TCT Directory>/packaging.
 5. Build oic test case project with "sudo ./tctbuild build liboic".
 6. Install test framework to device with "sudo ./tctbuild install liboic".
-7. Run tct tool with "tct-mgr".
\ No newline at end of file
+7. Run tct tool with "tct-mgr".
+
+Note: For BLE, please copy BLE libs and headers from the path /connectivity/lib/tizen/ble/libs to /usr/lib and from /connectivity/lib/tizen/ble/inc 
+to /usr/include/network before building test case project.
\ No newline at end of file
index e789f42..027a1c8 100644 (file)
@@ -4,19 +4,9 @@
 #include "interfaceHeaders/caedradapter.h"
 #include "interfaceHeaders/uthreadpool.h"
 
-//& set: Liboic
-
-//Bt callbacks
-
 CALocalConnectivity_t *localBtEndpoint = NULL;
-CARemoteEndpoint_t remoteMulticastEndpoint;
-CARemoteEndpoint_t remoteEndpoint[10]; /* 10 RemoteEndpoints are currently kept */
-char remoteIPAddress[CA_IPADDR_SIZE] = "192.168.1.8";  // Change the Corresponding IP address during testing.
-char localIPAddress[CA_IPADDR_SIZE] = {0};
-int32_t serverId;
 // Global bt Addr. Change this before testing.
 char btAddr[CA_MACADDR_SIZE] = "BC:79:AD:E6:BC:F6";
-char *serviceUUID = "12341234-1C25-481F-9DFB-59193D238280";
 
 static u_thread_pool_t gBTThreadPool = NULL;
 
index e9e861f..73c5474 100644 (file)
@@ -27,8 +27,18 @@ typedef struct ConnectivityHandlerList {
 // Hardcoded values to Test
 char coapData[500] = "{\"oc:\[{href\":\"/a/light\",\"ref\":{\"power\":\"20\",\"state\":\"true\"}}\]}";
 
-#define CA_PORT         5283
-#define CA_MCAST_PORT   5298
+/**
+ * @def CA_PORT
+ * @brief Unicast port number (to listen for incoming data on unicast server).
+ * Note :- Actual port number may differ based on result of bind() operation.
+ */
+#define CA_PORT   5298
+
+/**
+ * @def CA_MCAST_PORT
+ * @brief Multicast port number as defined in COAP Specification, RFC-7252.
+ */
+#define CA_MCAST_PORT   5683
 
 /**
  * @def CA_MULTICAST_IP