103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/*
203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project
303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License");
503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * you may not use this file except in compliance with the License.
603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * You may obtain a copy of the License at
703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *      http://www.apache.org/licenses/LICENSE-2.0
903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
1003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software
1103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS,
1203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * See the License for the specific language governing permissions and
1403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * limitations under the License.
1503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
1603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_TAG "BtGatt.JNI"
1903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_NDEBUG 0
2103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
2203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define CHECK_CALLBACK_ENV                                                      \
2303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta   if (!checkCallbackThread()) {                                                \
2403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       error("Callback: '%s' is not called on the correct thread", __FUNCTION__);\
2503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       return;                                                                  \
2603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta   }
2703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
2803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "com_android_bluetooth.h"
2903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "hardware/bt_gatt.h"
3003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "utils/Log.h"
3103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "android_runtime/AndroidRuntime.h"
3203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <string.h>
3403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <cutils/log.h>
3603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define info(fmt, ...)  ALOGI ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
3703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define debug(fmt, ...) ALOGD ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
3803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define warn(fmt, ...) ALOGW ("WARNING: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
3903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define error(fmt, ...) ALOGE ("ERROR: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
4003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define asrt(s) if(!(s)) ALOGE ("%s(L%d): ASSERT %s failed! ##",__FUNCTION__, __LINE__, #s)
4103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
4203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define BD_ADDR_LEN 6
4303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
4403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define UUID_PARAMS(uuid_ptr) \
4503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uuid_lsb(uuid_ptr),  uuid_msb(uuid_ptr)
4603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
477f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach#define GATT_ID_PARAMS(attr_ptr) \
487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    attr_ptr->inst_id, \
497f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    UUID_PARAMS((&attr_ptr->uuid))
5003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define SRVC_ID_PARAMS(srvc_ptr) \
5203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    (srvc_ptr->is_primary ? \
5303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    BTGATT_SERVICE_TYPE_PRIMARY : BTGATT_SERVICE_TYPE_SECONDARY), \
547f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    GATT_ID_PARAMS((&srvc_ptr->id))
5503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void set_uuid(uint8_t* uuid, jlong uuid_msb, jlong uuid_lsb)
5803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
5903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (int i = 0; i != 8; ++i)
6003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
6103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uuid[i]     = (uuid_lsb >> (8 * i)) & 0xFF;
6203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uuid[i + 8] = (uuid_msb >> (8 * i)) & 0xFF;
6303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
6403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
6503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
6603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_lsb(bt_uuid_t* uuid)
6703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
6803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint64_t  lsb = 0;
6903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int i;
7003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
7103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 7; i >= 0; i--)
7203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
7303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        lsb <<= 8;
7403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        lsb |= uuid->uu[i];
7503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
7603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
7703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return lsb;
7803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
7903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_msb(bt_uuid_t* uuid)
8103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
8203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint64_t msb = 0;
8303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int i;
8403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 15; i >= 8; i--)
8603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
8703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        msb <<= 8;
8803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        msb |= uuid->uu[i];
8903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
9003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return msb;
9203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
9303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void bd_addr_str_to_addr(const char* str, uint8_t *bd_addr)
9503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
9603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int    i;
9703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char   c;
9803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    c = *str++;
10003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 0; i < BD_ADDR_LEN; i++)
10103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
10203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        if (c >= '0' && c <= '9')
10303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - '0';
10403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        else if (c >= 'a' && c <= 'z')
10503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - 'a' + 10;
10603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        else   // (c >= 'A' && c <= 'Z')
10703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - 'A' + 10;
10803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        c = *str++;
11003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        if (c != ':')
11103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        {
11203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] <<= 4;
11303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (c >= '0' && c <= '9')
11403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - '0';
11503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            else if (c >= 'a' && c <= 'z')
11603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - 'a' + 10;
11703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            else   // (c >= 'A' && c <= 'Z')
11803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - 'A' + 10;
11903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            c = *str++;
12103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
12203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        c = *str++;
12403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
12503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
12603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void jstr2bdaddr(JNIEnv* env, bt_bdaddr_t *bda, jstring address)
12803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
12903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char* c_bda = env->GetStringUTFChars(address, NULL);
13003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (c_bda != NULL && bda != NULL && strlen(c_bda) == 17)
13103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
13203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bd_addr_str_to_addr(c_bda, bda->address);
13303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseStringUTFChars(address, c_bda);
13403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
13503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
13603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
13703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battanamespace android {
13803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
13903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
14003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Client callback methods
14103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
14203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
14303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientRegistered;
14403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onScanResult;
14503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onConnected;
14603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDisconnected;
14703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadCharacteristic;
14803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteCharacteristic;
14903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteCompleted;
15003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchCompleted;
15103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchResult;
15203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescrExtProp;
15303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescriptor;
15403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteDescriptor;
15503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onNotify;
15603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetCharacteristic;
15703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetDescriptor;
15803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetIncludedService;
15903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onRegisterForNotifications;
16003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadRemoteRssi;
16124dce60783d85fbf49f550203a383b2f4a171a52Wei Wangstatic jmethodID method_onAdvertiseCallback;
16203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
16303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
16403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods
16503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
16603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered;
16703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected;
16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded;
16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded;
17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded;
17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded;
17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted;
17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped;
17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted;
17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted;
17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead;
17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite;
17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite;
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL;
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL;
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL;
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() {
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv = getCallbackEnv();
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    JNIEnv* env = AndroidRuntime::getJNIEnv();
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sCallbackEnv != env || sCallbackEnv == NULL) return false;
19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return true;
19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid)
20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status,
20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, UUID_PARAMS(app_uuid));
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data)
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(62);
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data);
22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , address, rssi, jb);
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected,
24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected,
25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status)
26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted,
26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 conn_id, status);
26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id,
27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        SRVC_ID_PARAMS(srvc_id));
27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status,
2777f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                int char_prop)
27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic
2827f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
28303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , char_prop);
28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status,
2887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
2897f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_gatt_id_t *descr_id)
29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor
2937f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
2947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS(descr_id));
29503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status,
29903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id)
30003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService
30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id));
30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status,
3087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                                          btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id)
30903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications
3127f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id));
31303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
31403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data)
31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X",
32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2],
32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]);
32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len);
32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value);
32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify
33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id))
3317f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb);
33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
33703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data)
33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( status == 0 )      //successful
34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            (jbyte *) p_data->value.value);
34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uint8_t value = 0;
35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value);
35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic
35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3567f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb);
35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data)
36203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic
36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3667f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)));
36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status)
37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
37203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted
37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status);
37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data)
37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( p_data->value.len != 0 )
38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                (jbyte *) p_data->value.value);
38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor
39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id))
39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , p_data->value_type, jb);
39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
40003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data)
40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor
40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4067f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id))
4077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->descr_id)));
40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status)
41203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
41303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi,
42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       client_if, address, rssi, status);
42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
42624dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if)
42724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{
42824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    CHECK_CALLBACK_ENV
42924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if);
43024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
43124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang}
43224dce60783d85fbf49f550203a383b2f4a171a52Wei Wang
43303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = {
43403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_app_cb,
43503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_scan_result_cb,
43603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_open_cb,
43703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_close_cb,
43803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_complete_cb,
43903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_result_cb,
44003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_characteristic_cb,
44103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_descriptor_cb,
44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_included_service_cb,
44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_for_notification_cb,
44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_notify_cb,
44503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_characteristic_cb,
44603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_characteristic_cb,
44703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_descriptor_cb,
44803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_descriptor_cb,
44903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_execute_write_cb,
45024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_remote_rssi_cb,
45124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_advertise_cb
45203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
45303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
45403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
45503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
45603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks
45703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
45803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
45903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid)
46003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
46103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
46203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered
46303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , status, server_if, UUID_PARAMS(uuid));
46403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
46503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
46603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
467dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
46803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
46903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
47003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
47103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
47203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
47303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
47403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
47503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
47603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
47703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected,
478dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach                                 address, connected, conn_id, server_if);
47903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
48003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
48103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
48203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
48303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if,
48403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              btgatt_srvc_id_t *srvc_id, int srvc_handle)
48503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
48603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
48703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status,
48803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, SRVC_ID_PARAMS(srvc_id),
48903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle);
49003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
49103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
49203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
49303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if,
49403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int srvc_handle,
49503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int incl_srvc_handle)
49603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
49703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
49803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded,
49903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, srvc_handle, incl_srvc_handle);
50003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
50103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
50203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
50303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id,
50403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     int srvc_handle, int char_handle)
50503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
50603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
50703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded,
50803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(char_id),
50903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, char_handle);
51003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
51103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
51203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
51303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if,
51403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 bt_uuid_t *descr_id, int srvc_handle,
51503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 int descr_handle)
51603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
51703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
51803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded,
51903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(descr_id),
52003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, descr_handle);
52103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
52203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
52303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
52403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle)
52503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
52603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
52703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status,
52803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
52903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
53003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
53103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
53203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle)
53303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
53403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
53503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status,
53603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
53703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
53803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
53903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
54003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle)
54103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
54203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
54303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status,
54403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
54503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
54603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
54703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
54803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
54903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                             int attr_handle, int offset, bool is_long)
55003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
55103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
55203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
55303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
55403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
55503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
55603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
55703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
55803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
55903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead,
56003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
56103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, is_long);
56203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
56303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
56403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
56503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
56603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id,
56703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bt_bdaddr_t *bda, int attr_handle,
56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              int offset, int length,
56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bool need_rsp, bool is_prep, uint8_t* value)
57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray val = sCallbackEnv->NewByteArray(length);
58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value);
58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite,
58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, length, need_rsp, is_prep, val);
58503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
58603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(val);
58703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
58803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
58903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
59003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id,
59103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   bt_bdaddr_t *bda, int exec_write)
59203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
59303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
59403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
59503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
59603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
59703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
59803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
59903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite,
60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, exec_write);
60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle)
60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted,
61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, handle);
61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = {
61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_register_app_cb,
61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_connection_cb,
61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_added_cb,
61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_included_service_added_cb,
62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_characteristic_added_cb,
62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_descriptor_added_cb,
62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_started_cb,
62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_stopped_cb,
62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_deleted_cb,
62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_read_cb,
62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_write_cb,
62703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_exec_write_cb,
62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_response_confirmation_cb
62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks
63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = {
63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sizeof(btgatt_callbacks_t),
63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattClientCallbacks,
63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattServerCallbacks
63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions
64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) {
64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    // Client callbacks
64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V");
65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V");
65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onConnected   = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V");
65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V");
65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V");
65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V");
65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted",  "(II)V");
65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted",  "(II)V");
65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V");
6587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V");
6597f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V");
66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V");
66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V");
6627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V");
66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V");
66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V");
66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V");
66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     // Server callbacks
66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V");
670dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach    method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V");
67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V");
67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V");
67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onCharacteristicAdded  = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V");
67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V");
67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V");
67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V");
67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V");
67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V");
67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V");
68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V");
68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V");
68224dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V");
68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    info("classInitNative: Success!");
68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf;
68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) {
69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if(btIf)
69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (btIf = getBluetoothInterface()) == NULL) {
69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Bluetooth module is not loaded");
69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT Interface before initializing...");
70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf->cleanup();
70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf = NULL;
70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT callback object");
70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         env->DeleteGlobalRef(mCallbacksObj);
70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         mCallbacksObj = NULL;
70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (sGattIf = (btgatt_interface_t *)
71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta          btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) {
71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to get Bluetooth GATT Interface");
71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
71403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
71503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) {
71803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to initialize Bluetooth GATT, status: %d", status);
71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
72203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    mCallbacksObj = env->NewGlobalRef(object);
72403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
72503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) {
72703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
72803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!btIf) return;
72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->cleanup();
73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
73303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->DeleteGlobalRef(mCallbacksObj);
73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mCallbacksObj = NULL;
73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btIf = NULL;
74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions
74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address)
74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return 0;
74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return sGattIf->client->get_device_type(&bda);
75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object,
75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->register_client(&uuid);
76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf)
76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->unregister_client(clientIf);
76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientScanNative(JNIEnv* env, jobject object, jint clientIf, jboolean start)
77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->scan(clientIf, start);
77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif,
77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address, jboolean isDirect)
77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->connect(clientif, &bda, isDirect);
78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf,
78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->disconnect(clientIf, &bda, conn_id);
79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
79403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf,
79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    jstring address)
79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->refresh(clientIf, &bda);
80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id,
80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb)
80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object,
81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb)
82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8307f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
83203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
83403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (char_id_uuid_lsb == 0)
83503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
83603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, 0);
83703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id);
83903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
84103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object,
84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
84503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
8487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb)
85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
8637f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
8647f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (descr_id_uuid_lsb == 0)
86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0);
86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id);
87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object,
87503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint service_type, jint service_id_inst_id,
87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint incl_service_id_inst_id, jint incl_service_type,
87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb)
87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t  incl_srvc_id;
88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id;
88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb);
89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (incl_service_id_uuid_lsb == 0)
89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, 0);
89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id);
89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object,
90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
91003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq);
91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
92003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object,
92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
92403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
92503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9267f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9377f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9417f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
9427f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
9437f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq);
94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object,
94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
95403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id,
97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object,
97603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jboolean execute)
97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->execute_write(conn_id, execute ? 1 : 0);
98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object,
98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint service_id_inst_id,
98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9877f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
98803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
993460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    if (value == NULL) {
994460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        warn("gattClientWriteDescriptorNative() ignoring NULL array");
995460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        return;
996460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    }
997460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach
99803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
99903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
100403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
100503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10097f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id,
101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object,
102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint clientIf, jstring address,
102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint service_id_inst_id,
102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
102403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jboolean enable)
102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10357f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (enable)
104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    else
104603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif,
105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address)
105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
105503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
105603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_remote_rssi(clientif, &bda);
105803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
105903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1060873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object,
106197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach        jint client_if, jboolean start)
106297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
106397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
106497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->listen(client_if, start);
106597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
106697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
106797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbachstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if, jboolean setScanRsp,
1068873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jboolean inclName, jboolean inclTxPower, jint minInterval, jint maxInterval,
1069873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jint appearance, jbyteArray manufacturerData, jbyteArray serviceData,
1070873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jbyteArray serviceUuid)
107197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
107297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
1073873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL);
107497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData);
107597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
1076873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_data = env->GetByteArrayElements(serviceData, NULL);
1077873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData);
1078873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
1079873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL);
1080873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid);
1081873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
108297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower,
1083873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        minInterval, maxInterval, appearance, arr_len, (char*)arr_data,
1084873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        service_data_len, (char*)service_data, service_uuid_len,
1085873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        (char*)service_uuid);
108697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
108797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT);
1088873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT);
1089873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT);
109097d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
109197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
109203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions
109503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object,
109703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->register_server(&uuid);
110303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
110403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
110503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf)
110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
110703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->unregister_server(serverIf);
110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object,
111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jint server_if, jstring address, jboolean is_direct)
111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->connect(server_if, &bd_addr, is_direct);
112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
112203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf,
112403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
112503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
112603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
112703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
112803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
112903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->disconnect(serverIf, &bda, conn_id);
113003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
113103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
113203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object,
113303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint service_type, jint service_id_inst_id,
113403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
113503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint num_handles)
113603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
113703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
113803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
113903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
114003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
114103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
114203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
114303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_service(server_if, &srvc_id, num_handles);
114503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
114603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object,
114803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint included_svc_handle)
114903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
115003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
115103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_included_service(server_if, svc_handle,
115203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                          included_svc_handle);
115303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
115403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
115503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object,
115603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
115703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong char_uuid_lsb, jlong char_uuid_msb,
115803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint properties, jint permissions)
115903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
116103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
116303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb);
116403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_characteristic(server_if, svc_handle,
116603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        &uuid, properties, permissions);
116703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
116803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object,
117003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
117103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong desc_uuid_lsb, jlong desc_uuid_msb,
117203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint permissions)
117303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
117403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
117503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
117703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb);
117803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions);
118003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
118103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
118203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object,
118303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint transport )
118403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
118503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
118603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->start_service(server_if, svc_handle, transport);
118703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
118803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
118903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object,
119003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                         jint server_if, jint svc_handle)
119103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
119203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
119303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->stop_service(server_if, svc_handle);
119403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
119503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
119603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object,
119703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                           jint server_if, jint svc_handle)
119803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
119903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
120003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->delete_service(server_if, svc_handle);
120103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
120203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object,
120403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
120503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
120603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
120703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
120903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
121003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
121103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
121203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 1, (char*)array);
121303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
121403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
121503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
121603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object,
121703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
121803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
121903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
122003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
122203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
122303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
122503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 0, (char*)array);
122603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
122703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
122803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object,
123003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint conn_id, jint trans_id, jint status,
123103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint handle, jint offset, jbyteArray val, jint auth_req)
123203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
123303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
123403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_response_t response;
123603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.handle = handle;
123803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.auth_req = auth_req;
123903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.offset = offset;
124003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.len = 0;
124103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val != NULL)
124303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
124403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        response.attr_value.len = (uint16_t) env->GetArrayLength(val);
124503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jbyte* array = env->GetByteArrayElements(val, 0);
124603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (int i = 0; i != response.attr_value.len; ++i)
124803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            response.attr_value.value[i] = (uint8_t) array[i];
124903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseByteArrayElements(val, array, JNI_ABORT);
125003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
125103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
125203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_response(conn_id, trans_id, status, &response);
125303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
125403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
125503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command,
125603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jlong uuid1_lsb, jlong uuid1_msb, jstring bda1,
125703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jint p1, jint p2, jint p3, jint p4, jint p5 )
125803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
125903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
126003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bt_bda1;
126203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bt_bda1, bda1);
126303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid1;
126503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb);
126603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_test_params_t params;
126803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.bda1 = &bt_bda1;
126903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.uuid1 = &uuid1;
127003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u1 = p1;
127103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u2 = p2;
127203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u3 = p3;
127303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u4 = p4;
127403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u5 = p5;
127503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->test_command(command, &params);
127603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
127703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
127903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos
128003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
128103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = {
128303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"classInitNative", "()V", (void *) classInitNative},
128403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"initializeNative", "()V", (void *) initializeNative},
128503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"cleanupNative", "()V", (void *) cleanupNative},
128603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative},
128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative},
128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative},
129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientScanNative", "(IZ)V", (void *) gattClientScanNative},
129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientConnectNative", "(ILjava/lang/String;Z)V", (void *) gattClientConnectNative},
129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative},
129303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative},
129403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative},
129503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative},
12967f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative},
129703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative},
129803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative},
12997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative},
130003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative},
13017f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative},
130203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative},
130303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative},
130403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative},
1305873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative},
130603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
130703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative},
130803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative},
130903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerConnectNative", "(ILjava/lang/String;Z)V", (void *) gattServerConnectNative},
131003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative},
131103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative},
131203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative},
131303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative},
131403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative},
131503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative},
131603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative},
131703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative},
131803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative},
131903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative},
132003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative},
132103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1322873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative},
132303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative},
132403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
132503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
132603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env)
132703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
132803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService",
132903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    sMethods, NELEM(sMethods));
133003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
133103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
1333