Project Name: IoTivity
-Release Version No: CA_v0.61
+Release Version No: CA_v0.7
API Version: CA_v0.8
Release Description:
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)
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
*/
typedef void (*CAResponseCallback)(const CARemoteEndpoint_t *object,
const CAResponseInfo_t *responseInfo);
-
+
#ifdef __WITH_DTLS__
/**
* @brief Callback function type for getting DTLS credentials.
* 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();
* @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();
* @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();
/**
* @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);
* \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
*/
/**
* @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
*/
* @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);
* @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);
* @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);
* @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);
* @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);
* @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);
/**
* @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);
* 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();
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:
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.
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".
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)
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
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)
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 \
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)
ca_common_path + 'inc/',
])
+temp = env['CPPPATH']
+header = ' '
+for item in temp:
+ header = header + ' -I' + item
+
######################################################################
# Source files and Target(s)
######################################################################
]
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 = [
* @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
#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()
#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;
{ "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
#elif defined ARDUINO
#include <stdarg.h>
+#include "Arduino.h"
PROGMEM const char level0[] = "DEBUG";
PROGMEM const char level1[] = "INFO";
}
}
#endif //__TIZEN__
-#else
+#endif //ARDUINO
+#ifdef ARDUINO
/**
* Initialize the serial logger for Arduino
* Only defined for Arduino
* @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.
*
* @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
* @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)))
tag++;
}
Serial.print(F(": "));
-
+ Serial.print(lineNum);
+ Serial.print(F(": "));
while ((c = pgm_read_byte(logStr)))
{
Serial.write(c);
* @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');
* @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__
#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);
+++ /dev/null
-//******************************************************************
-//
-// 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
-
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;
}
{
if (NULL == list)
{
- OIC_LOG_V(DEBUG, TAG, "Invalid Parameter");
+ OIC_LOG(DEBUG, TAG, "Invalid Parameter");
return 0;
}
return list->length;
{
#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);
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);
*/
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();
void CAEDRReorderingDeviceSocketList(uint32_t index);
+
#ifdef __cplusplus
} /* extern "C" */
#endif
#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.
* @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.
* @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
--- /dev/null
+/******************************************************************
+ *
+ * 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
--- /dev/null
+/******************************************************************
+*
+* 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
-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
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)
{
break;
case ACI_EVT_CONNECTED:
-@@ -471,3 +505,7 @@ void ble_do_events()
+@@ -471,3 +505,12 @@ void ble_do_events()
#endif
}
+{
+ 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
printf(object->addressInfo.IP.port);
printf("data: ");
printf(requestInfo->info.payload);
+ printf("Type: ");
+ printf(requestInfo->info.type);
if (requestInfo->info.options)
{
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);
}
*
*/
+
+////////////////////////////////////////////////////////////
+//
+// This file can be used internal purpose only
+// Do NOT use this file to test.
+//
+////////////////////////////////////////////////////////////
+
#ifdef __ARDUINO_BLE__
#include <logger.h>
printf("ex) /a/light\n");
printf("reference uri : ");
- gets(buf);
+ if(gets(buf) == NULL)
+ return;
// create token
CAToken_t token = NULL;
}
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");
}
char uri[MAX_BUF_LEN] = {'\0'};
- gets(uri);
+ if( gets(uri) == NULL)
+ return ;
// create remote endpoint
CARemoteEndpoint_t *endpoint = NULL;
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;
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;
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;
printf("select : ");
memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
- gets(buf);
+ if( gets(buf) == NULL)
+ return;
int number = buf[0] - '0';
printf("select : ");
memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
- gets(buf);
+ if( gets(buf) == NULL)
+ return ;
int number = buf[0] - '0';
memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
- gets(buf);
+ if( gets(buf) == NULL)
+ return 'q';
return buf[0];
}
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';
process();
+ if (gLastRequestToken != NULL)
+ {
+ CADestroyToken(gLastRequestToken);
+ }
+ gLastRequestToken = NULL;
+
CATerminate();
#ifdef __WITH_DTLS__
clearDtlsCredentialInfo();
{
printf("find resource to %s URI\n", buf);
+ if (gLastRequestToken != NULL)
+ {
+ CADestroyToken(gLastRequestToken);
+ }
+
gLastRequestToken = token;
}
CADestroyToken(token);
}
+ if (requestData.payload != NULL)
+ {
+ free(requestData.payload);
+ }
+
// destroy remote endpoint
CADestroyRemoteEndpoint(endpoint);
printf("=============================================\n");
CAAdvertiseResource(buf, token, headerOpt, (uint8_t)optionNum);
+ // delete token
+ if (token != NULL)
+ {
+ CADestroyToken(token);
+ }
+
free(headerOpt);
}
{
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;
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("##############################################################");
}
}
printf("\n=============================================\n");
- return CA_STATUS_OK;
+
+ return CA_STATUS_FAILED;
}
*
******************************************************************/
+//***************************************************************
+//
+// 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>
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));
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));
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));
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));
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;
}
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;
}
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;
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;
}
{
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);
{
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];
+++ /dev/null
-/******************************************************************
- *
- * 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");
-}
#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")
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;
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)
}
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)
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()
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)
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");
}
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)
// delete mutex
CAEDRDestroyMutex();
- if(gContext)
- {
- (*env)->DeleteGlobalRef(env, gContext);
- }
CAEDRNativeRemoveAllDeviceState();
CAEDRNativeRemoveAllDeviceSocket(env);
}
{
OIC_LOG_V(DEBUG, TAG, "CAEdrClientJniInit");
g_jvm = jvm;
+
+ CAEDRServerJniInit(env, jvm);
}
int32_t CAEDRSendUnicastMessage(const char* address, 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)
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)
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)
{
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)
{
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);
{
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)
}
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");
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);
}
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
{
OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: error!!");
return;
}
-
- // close socket after data was sent
- CAEDRNativeSocketClose(env, address, id);
}
else
{
}
}
-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..");
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
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){
void CAEDRNativeRemoveDevice(const char* remoteAddress)
{
- OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDevice");
+ OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceforStateList");
if(!gdeviceStateList)
{
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)
{
return state->state;
}
}
- OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
return FALSE;
}
{
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);
gdeviceObjectList->size--;
gdeviceObjectList->length--;
}
+
+void CAEDRInitializeClient(u_thread_pool_t handle)
+{
+ OIC_LOG(DEBUG, TAG, "IN");
+ CAEDRInitialize(handle);
+ OIC_LOG(DEBUG, TAG, "OUT");
+}
+
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
+
+
--- /dev/null
+#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;
+}
*/
void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
+static void CAEDRDataDestroyer(void *data, uint32_t size);
+
CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
CANetworkPacketReceivedCallback packetReceivedCallback,
CANetworkChangeCallback networkStateChangeCallback,
CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
- CAEDRInitializeClient();
+ CAEDRInitializeClient(handle);
CAConnectivityHandler_t handler;
handler.startAdapter = CAStartEDR;
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);
}
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;
}
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;
}
// Free message
- CAFreeEDRData(message);
+ //CAFreeEDRData(message);
OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
}
}
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))
{
}
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;
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 !");
isHeaderAvailable = CA_FALSE;
}
- OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
+ OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
}
CAResult_t CAAdapterStartQueue()
OICFree(edrData);
}
+void CAEDRDataDestroyer(void *data, uint32_t size)
+{
+ CAEDRData *edrdata = (CAEDRData *) data;
+
+ CAFreeEDRData(edrdata);
+}
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();
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");
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;
#include "calecore.h"
#include "caleserver.h"
#include "caleutils.h"
-#include "caedrcore.h"
#include "logger.h"
#include "oic_malloc.h"
}
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");
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);
CAResult_t CATerminateBle()
{
OIC_LOG(DEBUG, TAG, "IN");
- ble_disconnect();
+ ble_radio_reset();
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
*
*/
void CATermiateBleAdapterMutex();
+static void CALEDataDestroyer(void *data, uint32_t size);
CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
CANetworkPacketReceivedCallback reqRespCallback,
}
if (CA_STATUS_OK != CAQueueingThreadInitialize(gSendQueueHandle, gBleAdapterThreadPool,
- CABLEServerSendDataThread, NULL))
+ CABLEServerSendDataThread, CALEDataDestroyer))
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
OICFree(gSendQueueHandle);
}
if (CA_STATUS_OK != CAQueueingThreadInitialize(gBLEClientSendQueueHandle, gBleAdapterThreadPool,
- CABLEClientSendDataThread, NULL))
+ CABLEClientSendDataThread, CALEDataDestroyer))
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
OICFree(gBLEClientSendQueueHandle);
}
if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleServerReceiverQueue, gBleAdapterThreadPool,
- CABLEServerDataReceiverHandler, NULL))
+ CABLEServerDataReceiverHandler, CALEDataDestroyer))
{
OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
OICFree(gCABleServerReceiverQueue);
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;
OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
totalDataLen, recvDataLen);
}
- CAFreeBLEData(bleData);
if (totalDataLen == recvDataLen)
{
u_mutex_lock(gBleAdapterReqRespCbMutex);
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;
}
OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
totalDataLen, recvDataLen);
}
- CAFreeBLEData(bleData);
if (totalDataLen == recvDataLen)
{
u_mutex_lock(gBleAdapterReqRespCbMutex);
recvDataLen = 0;
totalDataLen = 0;
isHeaderAvailable = false;
+ remoteEndpoint = NULL;
+ defragData = NULL;
u_mutex_unlock(gBleAdapterReqRespCbMutex);
}
{
OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
OICFree(defragData);
- OICFree(remoteEndpoint);
+ CAAdapterFreeRemoteEndpoint(remoteEndpoint);
u_mutex_unlock(gBleClientReceiveDataMutex);
return;
}
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");
}
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 )
memcpy(dataSegment, header, CA_HEADER_LENGTH);
OICFree(header);
+
int32_t length = 0;
if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
{
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");
}
memcpy(dataSegment, header, CA_HEADER_LENGTH);
OICFree(header);
+
int32_t length = 0;
if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
{
}
}
- OICFree(bleData->remoteEndpoint);
- OICFree(bleData);
+ OICFree(dataSegment);
u_mutex_unlock(gBleClientSendDataMutex);
OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
}
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;
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)
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;
}
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;
}
CAResult_t result = CALEInitializeNetworkMonitor();
if (CA_STATUS_OK != result)
{
- OIC_LOG_V(ERROR, TAG, "error");
+ OIC_LOG(ERROR, TAG, "error");
return CA_STATUS_FAILED;
}
CAResult_t result = CAInitializeBle();
if (CA_STATUS_OK != result)
{
- OIC_LOG_V(ERROR, TAG, "error");
+ OIC_LOG(ERROR, TAG, "error");
return CA_STATUS_FAILED;
}
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;
u_mutex_unlock(gBleReqRespClientCbMutex);
+ OICFree(data);
+
OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "OUT");
return;
}
OICFree(value);
return CA_STATUS_FAILED;
}
- // OICFree(value);
+
+ OICFree(value);
OIC_LOG(DEBUG, TZ_BLE_CLIENT_TAG, "OUT");
return CA_STATUS_OK;
u_mutex_unlock(gBleReqRespCbMutex);
+ OICFree(data);
OIC_LOG(DEBUG, TZ_BLE_SERVER_TAG, "OUT");
}
u_mutex_unlock(gBleCharacteristicMutex);
return CA_STATUS_FAILED;
}
- OICFree(data);
+ OICFree(data);
u_mutex_unlock(gBleCharacteristicMutex);
OIC_LOG(ERROR, TZ_BLE_SERVER_TAG, "OUT");
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);
}
#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
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");
*info = resInfo;
*size = resSize;
- OIC_LOG_V(DEBUG, TAG, "OUT");
+ OIC_LOG(DEBUG, TAG, "OUT");
return res;
if (endpoint == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "RemoteEndpoint is NULL");
+ OIC_LOG(DEBUG, TAG, "RemoteEndpoint is NULL");
return CA_STATUS_INVALID_PARAM;
}
if (index == -1)
{
- OIC_LOG_V(DEBUG, TAG, "unknown connectivity type!");
+ OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
continue;
}
if (-1 == index)
{
- OIC_LOG_V(DEBUG, TAG, "unknown connectivity type!");
+ OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
continue;
}
#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
{
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;
{
// 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)
#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
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;
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);
switch (ConnectivityType)
{
case CA_ETHERNET:
+ {
#ifndef ETHERNET_ADAPTER
OIC_LOG_V(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
{
u_arraylist_add(gSelectedNetworkList, &NETWORK_ETHERNET);
}
+ }
break;
case CA_WIFI:
+ {
#ifndef WIFI_ADAPTER
OIC_LOG_V(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
{
u_arraylist_add(gSelectedNetworkList, &NETWORK_WIFI);
}
+ }
break;
case CA_EDR:
+ {
#ifndef EDR_ADAPTER
OIC_LOG_V(DEBUG, TAG, "Add network type(EDR) - Not Supported");
{
u_arraylist_add(gSelectedNetworkList, &NETWORK_EDR);
}
+ }
break;
case CA_LE:
+ {
#ifndef LE_ADAPTER
OIC_LOG_V(DEBUG, TAG, "Add network type(LE) - Not Supported");
{
u_arraylist_add(gSelectedNetworkList, &NETWORK_LE);
}
+ }
break;
}
// stop selected interface adapter
CAStopAdapter(connType);
+ return CA_STATUS_OK;
}
}
- return CA_STATUS_OK;
+ return CA_STATUS_FAILED;
}
u_arraylist_t *CAGetSelectedNetworkList()
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 */
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 */
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 */
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 */
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;
}
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;
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 */
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 */
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 */
CAResult_t CATerminateNetworkType()
{
- OIC_LOG_V(DEBUG, TAG, "CATerminateNetworkType()");
+ OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
if(gSelectedNetworkList != NULL)
{
u_arraylist_free(&gSelectedNetworkList);
#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
#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
\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
\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
}\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
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);
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));
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);
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));
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;
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;
if (resourceUri == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "uri is null value");
+ OIC_LOG(DEBUG, TAG, "uri is null value");
return NULL;
}
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));
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);
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));
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);
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;
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);
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));
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);
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;
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);
if (context == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "error");
+ OIC_LOG(DEBUG, TAG, "error");
return;
}
OIC_LOG(DEBUG, TAG, "IN");
if (context == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "error");
+ OIC_LOG(DEBUG, TAG, "error");
return CA_STATUS_FAILED;
}
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;
}
OIC_LOG(DEBUG, TAG, "IN");
if (context == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "error");
+ OIC_LOG(DEBUG, TAG, "error");
return CA_STATUS_FAILED;
}
OIC_LOG(DEBUG, TAG, "IN");
if (context == NULL)
{
- OIC_LOG_V(DEBUG, TAG, "error");
+ OIC_LOG(DEBUG, TAG, "error");
return CA_STATUS_FAILED;
}
#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
* @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;
/**
* @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
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;
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;
}
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;
}
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;
}
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;
}
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;
}
char buf[1024] = { 0, };
struct ifconf ifc;
struct ifreq* ifr;
- struct ifreq* item;
int32_t sck;
int32_t interfaces;
int32_t i;
OIC_LOG_V(DEBUG, WIFI_MONITOR_TAG, "[WiFiCore] CAWiFiStateEnabled");
CASendNetworkChangeCallback(currNetworkStatus);
- return;
}
OIC_LOG_V(DEBUG, WIFI_MONITOR_TAG, "[WiFiCore] CAWiFiStateDisabled");
CASendNetworkChangeCallback(currNetworkStatus);
- return;
}
&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;
/**
* @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;
/**
* @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
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;
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;
}
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;
}
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;
}
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;
}
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
gWifiIPAddress = NULL;
}
+ if (gWifiSubnetMask)
+ {
+ OICFree(gWifiSubnetMask);
+ gWifiSubnetMask = NULL;
+ }
+
if (gWifiNetInfoMutex)
{
u_mutex_free(gWifiNetInfoMutex);
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;
}
}
}
+ // free context
+ OICFree(ctx);
+
OIC_LOG(DEBUG, WIFI_SERVER_TAG, "OUT");
}
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
#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;
// 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