Fixed klockwork memory leaks and modified the logs
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_edr_adapter / android / caedrutils.c
1 #include <jni.h>
2 #include <stdio.h>
3 #include <android/log.h>
4 #include "caedrutils.h"
5 #include "logger.h"
6 #include "oic_malloc.h"
7 #include "uthreadpool.h"
8 #include "uarraylist.h"
9
10 #define TAG PCF("CA_EDR_UTILS")
11
12 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
13 static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
14 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
15
16 /**
17  * BT common
18  */
19
20 // get address from bluetooth socket
21 jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj)
22 {
23     if(!bluetoothSocketObj)
24     {
25         return NULL;
26     }
27
28     jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
29     if(!jni_cid_BTSocket)
30     {
31         OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_cid_BTSocket is null");
32         return NULL;
33     }
34
35     jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTSocket, "getRemoteDevice",
36          "()Landroid/bluetooth/BluetoothDevice;");
37     if(!jni_mid_getRemoteDevice)
38     {
39         OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_mid_getRemoteDevice is null");
40         return NULL;
41     }
42
43     jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, bluetoothSocketObj, jni_mid_getRemoteDevice);
44     if(!jni_obj_remoteBTDevice)
45     {
46         OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: jni_obj_remoteBTDevice is null");
47         return NULL;
48     }
49
50     jclass jni_cid_BTDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
51     jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress", "()Ljava/lang/String;");
52
53     jstring j_str_address = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, j_mid_getAddress);
54     if(j_str_address)
55     {
56         const char * address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
57         OIC_LOG_V(DEBUG, TAG, "[EDR] getRemoteAddress: ~~ remote device address is %s", address);
58 //      (*env)->ReleaseStringUTFChars(env, j_str_address, address);
59     } else {
60         return NULL;
61     }
62     return j_str_address;
63 }
64
65 jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
66 {
67     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
68     if(!jni_cid_BTAdapter)
69     {
70         OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_cid_BTAdapter is null");
71         return NULL;
72     }
73
74     jmethodID jni_mid_getDefaultAdapter =
75             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
76     if(!jni_mid_getDefaultAdapter)
77     {
78         OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getDefaultAdapter is null");
79         return NULL;
80     }
81
82     jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getAddress", METHODID_STRINGNONPARAM);
83     if(!jni_mid_getAddress)
84     {
85         OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_mid_getAddress is null");
86         return NULL;
87     }
88
89     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
90     if(!jni_obj_BTAdapter)
91     {
92         OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_obj_BTAdapter is null");
93         return NULL;
94     }
95
96     jstring jni_str_address = (jstring)(*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getAddress);
97     if(!jni_str_address)
98     {
99         OIC_LOG(DEBUG, TAG, "[EDR][Native] getAddress: jni_str_address is null");
100         return NULL;
101     }
102
103     return jni_str_address;
104 }
105
106 jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
107 {
108     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
109     if(!jni_cid_BTAdapter)
110     {
111         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_cid_BTAdapter is null");
112         return NULL;
113     }
114
115     jmethodID jni_mid_getDefaultAdapter =
116             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
117
118     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
119     if(!jni_obj_BTAdapter)
120     {
121         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: bluetooth adapter is null");
122         return NULL;
123     }
124
125     // Get a list of currently paired devices
126     jmethodID jni_mid_getBondedDevices = (*env)->GetMethodID(env, jni_cid_BTAdapter,
127             "getBondedDevices", "()Ljava/util/Set;");
128     if(!jni_mid_getBondedDevices)
129     {
130         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_getBondedDevicesr is null");
131         return NULL;
132     }
133
134     jobject jni_obj_setPairedDevices = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getBondedDevices);
135     if(!jni_obj_setPairedDevices)
136     {
137         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_obj_setPairedDevices is null");
138         return NULL;
139     }
140
141     // Convert the set to an object array
142     // object[] array = Set<BluetoothDevice>.toArray();
143     jclass jni_cid_Set = (*env)->FindClass(env,  "java/util/Set");
144     jmethodID jni_mid_toArray = (*env)->GetMethodID(env, jni_cid_Set, "toArray", "()[Ljava/lang/Object;");
145
146     if(!jni_mid_toArray)
147     {
148         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_mid_toArray is null");
149         return NULL;
150     }
151
152     jobjectArray jni_arrayPairedDevices = (jobjectArray)((*env)->CallObjectMethod(env,
153             jni_obj_setPairedDevices, jni_mid_toArray));
154     if(!jni_arrayPairedDevices)
155     {
156         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBondedDevices: jni_arrayPairedDevices is null");
157         return NULL;
158     }
159
160     return jni_arrayPairedDevices;
161 }
162
163 jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
164 {
165     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
166     if(!jni_cid_BTAdapter)
167     {
168         OIC_LOG(DEBUG, TAG, "[EDR][Native] getBTStateOnInfo: jni_cid_BTAdapter is null");
169         return -1;
170     }
171
172     jfieldID jni_fid_stateon = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
173     if (jni_fid_stateon == 0)
174     {
175         OIC_LOG(DEBUG, TAG, "[EDR][Native] get_field_state is 0");
176         return -1;
177     }
178     jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
179
180     OIC_LOG_V(DEBUG, TAG, "[EDR][Native] bluetooth STATE_ON state integer value : %d", jni_int_val);
181
182     return jni_int_val;
183 }
184
185 jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
186 {
187     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
188     if(!jni_cid_BTAdapter)
189     {
190         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_BTAdapter: jni_cid_BTAdapter is null");
191         return FALSE;
192     }
193
194     jmethodID jni_mid_getDefaultAdapter =
195             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
196     if(!jni_mid_getDefaultAdapter)
197     {
198         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getDefaultAdapter is null");
199         return FALSE;
200     }
201
202     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
203     if(!jni_obj_BTAdapter)
204     {
205         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_BTAdapter is null");
206         return FALSE;
207     }
208
209     // isEnable()
210     jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled",
211             "()Z");
212     if(!jni_mid_isEnable)
213     {
214         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_isEnable is null");
215         return FALSE;
216     }
217
218     jboolean jni_isEnable = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_isEnable);
219     OIC_LOG_V(DEBUG, TAG, "[EDR][Native] adapter state is %d", jni_isEnable);
220
221     return jni_isEnable;
222 }
223
224 jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
225 {
226     jclass jni_cid_device_list = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
227     if(!jni_cid_device_list)
228     {
229         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_device_list is null");
230         return NULL;
231     }
232
233     jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_device_list, "getAddress",
234             "()Ljava/lang/String;");
235     if(!jni_mid_getAddress)
236     {
237         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_getAddress is null");
238         return NULL;
239     }
240
241     jstring jni_address = (jstring)(*env)->CallObjectMethod(env, bluetoothDevice, jni_mid_getAddress);
242     if(!jni_address)
243     {
244         OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_address is null");
245         return NULL;
246     }
247     return jni_address;
248 }