com_android_bluetooth_gatt.cpp revision 27bd5f277ccf471f2fa9cd9151a2a226b51bc825
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;
162662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic jmethodID method_onConfigureMTU;
1631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onScanFilterConfig;
1642b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onScanFilterParamsConfigured;
1652b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onScanFilterEnableDisabled;
1661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvEnable;
1671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvUpdate;
1681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvSetAdvData;
1691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvDisable;
170afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onClientCongestion;
1712b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanStorageConfigured;
1722b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanStartStopped;
1732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanReports;
1742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanThresholdCrossed;
1752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onTrackAdvFoundLost;
17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered;
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected;
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded;
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded;
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded;
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded;
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted;
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped;
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted;
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted;
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead;
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite;
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite;
193afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onNotificationSent;
194afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onServerCongestion;
19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL;
20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL;
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL;
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() {
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv = getCallbackEnv();
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    JNIEnv* env = AndroidRuntime::getJNIEnv();
20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sCallbackEnv != env || sCallbackEnv == NULL) return false;
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return true;
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid)
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status,
22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, UUID_PARAMS(app_uuid));
22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data)
22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(62);
23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data);
23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult
23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , address, rssi, jb);
23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected,
25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected,
27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status)
27703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted,
28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 conn_id, status);
28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
28203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
28303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id,
28803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        SRVC_ID_PARAMS(srvc_id));
28903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status,
2937f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
29403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                int char_prop)
29503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic
2987f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
29903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , char_prop);
30003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status,
3047f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
3057f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_gatt_id_t *descr_id)
30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
30803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor
3097f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
3107f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS(descr_id));
31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
31203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
31303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
31403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status,
31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id)
31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService
31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id));
32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status,
3247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                                          btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id)
32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications
3287f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id));
32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
33103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data)
33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
33703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X",
33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2],
33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]);
34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len);
34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value);
34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify
34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id))
3477f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb);
34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data)
35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
35603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( status == 0 )      //successful
36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
36203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            (jbyte *) p_data->value.value);
36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uint8_t value = 0;
36603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value);
36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic
37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3727f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb);
37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data)
37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic
38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3827f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)));
38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status)
38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted
39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status);
39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data)
39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( p_data->value.len != 0 )
40003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                (jbyte *) p_data->value.value);
40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
40603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
40703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor
40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4107f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id))
41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , p_data->value_type, jb);
41203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data)
41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor
42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4227f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id))
4237f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->descr_id)));
42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
42603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
42703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status)
42803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
42903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
43003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
43103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
43203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
43303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
43403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
43503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
43603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi,
43703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       client_if, address, rssi, status);
43803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
43903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
44003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
44103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
44224dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if)
44324dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{
44424dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    CHECK_CALLBACK_ENV
44524dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if);
44624dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
44724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang}
44824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang
449662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachvoid btgattc_configure_mtu_cb(int conn_id, int status, int mtu)
450662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
451662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    CHECK_CALLBACK_ENV
452662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConfigureMTU,
453662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach                                 conn_id, status, mtu);
454662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
455662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
456662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
4572b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_cfg_cb(int action, int client_if, int status, int filt_type,
4582b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                int avbl_space)
4591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterConfig,
4622b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 action, status, client_if, filt_type, avbl_space);
4632b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4642b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
4652b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
4662b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_param_cb(int action, int client_if, int status, int avbl_space)
4672b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
4682b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
4692b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterParamsConfigured,
4702b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            action, status, client_if, avbl_space);
4712b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4722b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
4732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
4742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_status_cb(int action, int client_if, int status)
4752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
4762b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
4772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterEnableDisabled,
4782b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            action, status, client_if);
4791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_enable_cb(int client_if, int status)
4831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status,client_if);
4861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_update_cb(int client_if, int status)
4901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4921a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvUpdate, status, client_if);
4931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4941a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4951a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4961a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_setadv_data_cb(int client_if, int status)
4971a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4981a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4991a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetAdvData, status, client_if);
5001a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5011a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
5021a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
5031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_disable_cb(int client_if, int status)
5041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
5051a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
5061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvDisable, status, client_if);
5071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5081a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
5091a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
510afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgattc_congestion_cb(int conn_id, bool congested)
511afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
512afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
513afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientCongestion, conn_id, congested);
514afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
515afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
516afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
5172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_cfg_storage_cb(int client_if, int status)
5182b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5192b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanStorageConfigured, status, client_if);
5212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5242b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_startstop_cb(int startstop_action, int client_if, int status)
5252b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5262b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5272b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanStartStopped, startstop_action,
5282b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 status, client_if);
5292b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5302b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_reports_cb(int client_if, int status, int report_format,
5332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                        int num_records, int data_len, uint8_t *p_rep_data)
5342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    jbyteArray jb = sCallbackEnv->NewByteArray(data_len);
5372b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->SetByteArrayRegion(jb, 0, data_len, (jbyte *) p_rep_data);
5382b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5392b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanReports, status, client_if,
5402b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                report_format, num_records, jb);
5412b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->DeleteLocalRef(jb);
5422b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5432b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5442b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5452b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_threshold_cb(int client_if)
5462b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5472b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5482b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanThresholdCrossed, client_if);
5492b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5502b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5512b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5522b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_track_adv_event_cb(int client_if, int filt_index, int addr_type,
5532b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                        bt_bdaddr_t* bda, int adv_state)
5542b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5552b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5562b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    char c_address[32];
5572b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
5582b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        bda->address[0], bda->address[1], bda->address[2],
5592b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        bda->address[3], bda->address[4], bda->address[5]);
5602b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    jstring address = sCallbackEnv->NewStringUTF(c_address);
5612b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onTrackAdvFoundLost,
5622b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                    filt_index, addr_type, address, adv_state, client_if);
5632b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->DeleteLocalRef(address);
5642b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5652b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5662b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5672b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = {
56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_app_cb,
57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_scan_result_cb,
57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_open_cb,
57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_close_cb,
57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_complete_cb,
57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_result_cb,
57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_characteristic_cb,
57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_descriptor_cb,
57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_included_service_cb,
57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_for_notification_cb,
57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_notify_cb,
58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_characteristic_cb,
58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_characteristic_cb,
58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_descriptor_cb,
58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_descriptor_cb,
58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_execute_write_cb,
58524dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_remote_rssi_cb,
586662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_advertise_cb,
587662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_configure_mtu_cb,
5882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_cfg_cb,
5892b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_param_cb,
5902b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_status_cb,
5911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_enable_cb,
5921a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_update_cb,
5931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_setadv_data_cb,
594afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgattc_multiadv_disable_cb,
595f2919fe3409cb17a062baa74361d2129d90ece2bWei Wang    btgattc_congestion_cb,
5962b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_cfg_storage_cb,
5972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_startstop_cb,
5982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_reports_cb,
5992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_threshold_cb,
6002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_track_adv_event_cb
60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks
60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid)
60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered
61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , status, server_if, UUID_PARAMS(uuid));
61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
616dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected,
627dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach                                 address, connected, conn_id, server_if);
62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if,
63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              btgatt_srvc_id_t *srvc_id, int srvc_handle)
63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status,
63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, SRVC_ID_PARAMS(srvc_id),
63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle);
63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if,
64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int srvc_handle,
64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int incl_srvc_handle)
64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded,
64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, srvc_handle, incl_srvc_handle);
64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id,
65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     int srvc_handle, int char_handle)
65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded,
65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(char_id),
65803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, char_handle);
65903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if,
66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 bt_uuid_t *descr_id, int srvc_handle,
66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 int descr_handle)
66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded,
66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(descr_id),
66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, descr_handle);
67003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle)
67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status,
67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle)
68203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status,
68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle)
69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status,
69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                             int attr_handle, int offset, bool is_long)
69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead,
70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, is_long);
71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
71403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
71503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id,
71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bt_bdaddr_t *bda, int attr_handle,
71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              int offset, int length,
71803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bool need_rsp, bool is_prep, uint8_t* value)
71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
72303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
72403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
72503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
72603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
72803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray val = sCallbackEnv->NewByteArray(length);
73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value);
73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite,
73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
73303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, length, need_rsp, is_prep, val);
73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(val);
73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id,
74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   bt_bdaddr_t *bda, int exec_write)
74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite,
75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, exec_write);
75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle)
75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted,
76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, handle);
76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
764afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgatts_indication_sent_cb(int conn_id, int status)
765afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
766afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
767afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotificationSent,
768afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach                                 conn_id, status);
769afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
770afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
771afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
772afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgatts_congestion_cb(int conn_id, bool congested)
773afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
774afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
775afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerCongestion, conn_id, congested);
776afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
777afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
778afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = {
78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_register_app_cb,
78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_connection_cb,
78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_added_cb,
78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_included_service_added_cb,
78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_characteristic_added_cb,
78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_descriptor_added_cb,
78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_started_cb,
78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_stopped_cb,
78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_deleted_cb,
78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_read_cb,
79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_write_cb,
79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_exec_write_cb,
792afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgatts_response_confirmation_cb,
793afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgatts_indication_sent_cb,
794afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgatts_congestion_cb
79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks
79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = {
80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sizeof(btgatt_callbacks_t),
80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattClientCallbacks,
80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattServerCallbacks
80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions
80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) {
81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    // Client callbacks
81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V");
81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V");
81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onConnected   = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V");
81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V");
81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V");
81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V");
82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted",  "(II)V");
82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted",  "(II)V");
82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V");
8237f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V");
8247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V");
82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V");
82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V");
8277f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V");
82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V");
82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V");
83003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V");
831662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    method_onConfigureMTU = env->GetMethodID(clazz, "onConfigureMTU", "(III)V");
8321a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V");
8332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterConfig = env->GetMethodID(clazz, "onScanFilterConfig", "(IIIII)V");
8342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterParamsConfigured = env->GetMethodID(clazz, "onScanFilterParamsConfigured", "(IIII)V");
8352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterEnableDisabled = env->GetMethodID(clazz, "onScanFilterEnableDisabled", "(III)V");
83627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvEnable = env->GetMethodID(clazz, "onAdvertiseInstanceEnabled", "(II)V");
83727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvUpdate = env->GetMethodID(clazz, "onAdvertiseDataUpdated", "(II)V");
83827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvSetAdvData = env->GetMethodID(clazz, "onAdvertiseDataSet", "(II)V");
83927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvDisable = env->GetMethodID(clazz, "onAdvertiseInstanceDisabled", "(II)V");
840afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onClientCongestion = env->GetMethodID(clazz, "onClientCongestion", "(IZ)V");
8412b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanStorageConfigured = env->GetMethodID(clazz, "onBatchScanStorageConfigured", "(II)V");
8422b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanStartStopped = env->GetMethodID(clazz, "onBatchScanStartStopped", "(III)V");
8432b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanReports = env->GetMethodID(clazz, "onBatchScanReports", "(IIII[B)V");
8442b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanThresholdCrossed = env->GetMethodID(clazz, "onBatchScanThresholdCrossed", "(I)V");
8452b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onTrackAdvFoundLost = env->GetMethodID(clazz, "onTrackAdvFoundLost", "(IILjava/lang/String;II)V");
84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     // Server callbacks
84803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V");
850dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach    method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V");
85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V");
85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V");
85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onCharacteristicAdded  = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V");
85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V");
85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V");
85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V");
85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V");
85803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V");
85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V");
86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V");
86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V");
862afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onNotificationSent = env->GetMethodID(clazz, "onNotificationSent", "(II)V");
863afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onServerCongestion = env->GetMethodID(clazz, "onServerCongestion", "(IZ)V");
86403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    info("classInitNative: Success!");
86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf;
86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) {
87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if(btIf)
87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (btIf = getBluetoothInterface()) == NULL) {
87503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Bluetooth module is not loaded");
87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT Interface before initializing...");
88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf->cleanup();
88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf = NULL;
88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT callback object");
88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         env->DeleteGlobalRef(mCallbacksObj);
88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         mCallbacksObj = NULL;
88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (sGattIf = (btgatt_interface_t *)
89203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta          btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) {
89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to get Bluetooth GATT Interface");
89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) {
89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to initialize Bluetooth GATT, status: %d", status);
90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    mCallbacksObj = env->NewGlobalRef(object);
90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) {
90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!btIf) return;
91003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->cleanup();
91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
91403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->DeleteGlobalRef(mCallbacksObj);
91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mCallbacksObj = NULL;
91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
92003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btIf = NULL;
92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
92403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions
92503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
92603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address)
92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return 0;
93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return sGattIf->client->get_device_type(&bda);
93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object,
93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
93703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
94103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
94203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->register_client(&uuid);
94303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf)
94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->unregister_client(clientIf);
94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
951f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadhamstatic void gattClientScanNative(JNIEnv* env, jobject object, jboolean start)
95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
954f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham    sGattIf->client->scan(start);
95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif,
95818591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jstring address, jboolean isDirect, jint transport)
95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
96418591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->client->connect(clientif, &bda, isDirect, transport);
96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf,
96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->disconnect(clientIf, &bda, conn_id);
97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf,
97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    jstring address)
97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->refresh(clientIf, &bda);
98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id,
98703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb)
98803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
99303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
99403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
99503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
99603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object,
99703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
99803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
99903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb)
100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
100303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
100403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
100503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
100703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
100803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
100903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10117f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (char_id_uuid_lsb == 0)
101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, 0);
101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id);
102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object,
102403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
10297f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb)
103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
103503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10397f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10437f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10447f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10457f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
104603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (descr_id_uuid_lsb == 0)
104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
104903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0);
105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id);
105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object,
105603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint service_type, jint service_id_inst_id,
105703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
105803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint incl_service_id_inst_id, jint incl_service_type,
105903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb)
106003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
106103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
106203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
106403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
106503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
106603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
106703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t  incl_srvc_id;
106903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id;
107003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
107103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb);
107203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
107303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (incl_service_id_uuid_lsb == 0)
107403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
107503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, 0);
107603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
107703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id);
107803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
107903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
108003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
108103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object,
108203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
108303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
108403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
108503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
108603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
108703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
108803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
108903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
109003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
109103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
109203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
109703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq);
110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object,
110303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
110403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
110503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
11077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11227f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
11237f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
11247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
112503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq);
112703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
112803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object,
113003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
113103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
113203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
113303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
113403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
113503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
113603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
113703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
113803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
113903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
114003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
114103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
114203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11437f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
114403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
114503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
114603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
114803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
114903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
115003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
115103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id,
115203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
115303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
115403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
115503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
115603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object,
115703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jboolean execute)
115803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
115903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->execute_write(conn_id, execute ? 1 : 0);
116103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
116203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object,
116403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint service_id_inst_id,
116503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
116603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
116703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
11687f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
116903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
117003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
117103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
117203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
117303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1174460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    if (value == NULL) {
1175460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        warn("gattClientWriteDescriptorNative() ignoring NULL array");
1176460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        return;
1177460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    }
1178460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach
117903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
118003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
118103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
118203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
118303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11847f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
118503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
118603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
118703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
11897f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
11907f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
119103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
119203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
119303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
119403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
119503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
119603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id,
119703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
119803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
119903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
120003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object,
120203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint clientIf, jstring address,
120303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint service_id_inst_id,
120403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
120503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
120603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
120703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jboolean enable)
120803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
120903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
121003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
121103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
121203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
121303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
121403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
121503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12167f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
121703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
121803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
121903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
122103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
122203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
122303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (enable)
122503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
122603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    else
122703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
122803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
122903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif,
123103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address)
123203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
123303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
123403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
123603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
123703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_remote_rssi(clientif, &bda);
123903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
124003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1241873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object,
124297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach        jint client_if, jboolean start)
124397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
124497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
124597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->listen(client_if, start);
124697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
124797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
12482b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if,
12492b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jboolean setScanRsp, jboolean inclName, jboolean inclTxPower, jint minInterval,
12502b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint maxInterval, jint appearance, jbyteArray manufacturerData, jbyteArray serviceData,
1251873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jbyteArray serviceUuid)
125297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
125397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
1254873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL);
125597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData);
125697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
1257873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_data = env->GetByteArrayElements(serviceData, NULL);
1258873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData);
1259873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
1260873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL);
1261873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid);
1262873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
126397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower,
1264873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        minInterval, maxInterval, appearance, arr_len, (char*)arr_data,
1265873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        service_data_len, (char*)service_data, service_uuid_len,
1266873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        (char*)service_uuid);
126797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
126897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT);
1269873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT);
1270873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT);
127197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
127297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
127353f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadhamstatic void gattSetScanParametersNative(JNIEnv* env, jobject object,
12742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                        jint scan_interval_unit, jint scan_window_unit)
127553f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham{
127653f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    if (!sGattIf) return;
12772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->set_scan_parameters(scan_interval_unit, scan_window_unit);
127853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham}
127903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12802b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object,
12812b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint client_if, jint filt_index,
12822b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint feat_seln, jint list_logic_type, jint filt_logic_type,
12832b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint rssi_high_thres, jint rssi_low_thres,
12842b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint dely_mode, jint found_timeout, jint lost_timeout, jint found_timeout_cnt)
12852b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
12862b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
12872b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int add_scan_filter_params_action = 0;
12882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_param_setup(client_if, add_scan_filter_params_action, filt_index,
12892b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            feat_seln, list_logic_type, filt_logic_type,
12902b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            rssi_high_thres, rssi_low_thres,
12912b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            dely_mode, found_timeout, lost_timeout, found_timeout_cnt);
12922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
12931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
12952b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint client_if, jint filt_index)
12961a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12971a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int delete_scan_filter_params_action = 1;
12992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_param_setup(client_if, delete_scan_filter_params_action,
13002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            filt_index, 0, 0, 0, 0, 0, 0, 0, 0, 0);
13011a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
130280e7d011fdb511a6583258458e97821176866baaWei Wang
13032b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterParamClearAllNative(JNIEnv* env, jobject object, jint client_if)
13041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
13051a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
13062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int clear_scan_filter_params_action = 2;
13072b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_param_setup(client_if, clear_scan_filter_params_action,
13082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
13092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
13101a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterAddRemoveNative(JNIEnv* env, jobject object,
13122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint client_if, jint action, jint filt_type, jint filt_index, jint company_id,
13132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint company_id_mask, jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb,
13142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jlong uuid_mask_msb, jstring name, jstring address, jbyte addr_type,
13152b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jbyteArray data, jbyteArray mask)
13162b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
13172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    switch(filt_type)
13181a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {
13191a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 0: // BTM_BLE_PF_ADDR_FILTER
13202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        {
13211a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_bdaddr_t bda;
13221a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jstr2bdaddr(env, &bda, address);
13232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index, 0,
13242b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                             0, NULL, NULL, &bda, addr_type,0, NULL,0, NULL);
13251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13262b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        }
13271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13281a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 1: // BTM_BLE_PF_SRVC_DATA
13292b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        {
13302b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* data_array = env->GetByteArrayElements(data, 0);
13312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            int data_len = env->GetArrayLength(data);
13322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* mask_array = env->GetByteArrayElements(mask, NULL);
13332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            uint16_t mask_len = (uint16_t) env->GetArrayLength(mask);
13342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
13352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang               0, 0, NULL, NULL, NULL, 0, data_len, (char*)data_array, mask_len,(char*) mask_array);
13362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(data, data_array, JNI_ABORT);
13372b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(mask, mask_array, JNI_ABORT);
13381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13392b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        }
13401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 2: // BTM_BLE_PF_SRVC_UUID
13421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 3: // BTM_BLE_PF_SRVC_SOL_UUID
13431a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
13441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_uuid_t uuid, uuid_mask;
13451a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid.uu, uuid_msb, uuid_lsb);
13461a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid_mask.uu, uuid_mask_msb, uuid_mask_lsb);
13471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (uuid_mask_lsb != 0 && uuid_mask_msb != 0)
13482b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
13492b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 0, 0, &uuid, &uuid_mask, NULL,0,0, NULL,0, NULL);
13501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            else
13512b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
13522b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 0, 0, &uuid, NULL, NULL, 0,0, NULL,0, NULL);
13531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
13551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 4: // BTM_BLE_PF_LOCAL_NAME
13571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
13581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            const char* c_name = env->GetStringUTFChars(name, NULL);
13591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (c_name != NULL && strlen(c_name) != 0)
13601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            {
13612b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type,
13622b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 filt_index, 0, 0, NULL, NULL, NULL, 0, strlen(c_name),
13632b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 (char*)c_name, 0, NULL);
13641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                env->ReleaseStringUTFChars(name, c_name);
13651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            }
13661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
13681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 5: // BTM_BLE_PF_MANU_DATA
13702b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        case 6: // BTM_BLE_PF_SRVC_DATA_PATTERN
13711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
13721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jbyte* data_array = env->GetByteArrayElements(data, 0);
13732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            int data_len = env->GetArrayLength(data); // Array contains mask
13742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* mask_array = env->GetByteArrayElements(mask, NULL);
13752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            uint16_t mask_len = (uint16_t) env->GetArrayLength(mask);
13762b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
13772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                company_id, company_id_mask, NULL, NULL, NULL, 0, data_len, (char*)data_array,
13782b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                mask_len, (char*) mask_array);
13791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            env->ReleaseByteArrayElements(data, data_array, JNI_ABORT);
13802b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(mask, mask_array, JNI_ABORT);
13811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
13831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        default:
13851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
13861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    }
13871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
13881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13892b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jint client_if,
13902b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jint filt_type, jint filt_index, jint company_id, jint company_id_mask,
13912b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb, jlong uuid_mask_msb,
13922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jstring name, jstring address, jbyte addr_type, jbyteArray data, jbyteArray mask)
13932b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
13942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
13952b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    int action = 0;
13962b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    gattClientScanFilterAddRemoveNative(env, object, client_if, action, filt_type, filt_index,
13972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    company_id, company_id_mask, uuid_lsb, uuid_msb, uuid_mask_lsb, uuid_mask_msb,
13982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    name, address, addr_type, data, mask);
13992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14012b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14022b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterDeleteNative(JNIEnv* env, jobject object, jint client_if,
14032b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jint filt_type, jint filt_index, jint company_id, jint company_id_mask,
14042b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb, jlong uuid_mask_msb,
14052b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jstring name, jstring address, jbyte addr_type, jbyteArray data, jbyteArray mask)
14062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14072b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
14082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    int action = 1;
14092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    gattClientScanFilterAddRemoveNative(env, object, client_if, action, filt_type, filt_index,
14102b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    company_id, company_id_mask, uuid_lsb, uuid_msb, uuid_mask_lsb, uuid_mask_msb,
14112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    name, address, addr_type, data, mask);
14122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterClearNative(JNIEnv* env, jobject object, jint client_if,
14152b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                        jint filt_index)
14162b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
14182b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_clear(client_if, filt_index);
14192b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterEnableNative (JNIEnv* env, jobject object, jint client_if,
14222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                          jboolean enable)
14231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
14241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14252b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_enable(client_if, enable);
14261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
1428662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic void gattClientConfigureMTUNative(JNIEnv *env, jobject object,
1429662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach        jint conn_id, jint mtu)
1430662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
1431662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    if (!sGattIf) return;
1432662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sGattIf->client->configure_mtu(conn_id, mtu);
1433662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
1434662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
14351a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientEnableAdvNative(JNIEnv* env, jobject object, jint client_if,
14361a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power)
14371a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
14381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14391a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_enable(client_if, min_interval, max_interval, adv_type, chnl_map,
14411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        tx_power);
14421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14431a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientUpdateAdvNative(JNIEnv* env, jobject object, jint client_if,
14451a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power)
14461a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
14471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14481a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_update(client_if, min_interval, max_interval, adv_type, chnl_map,
14501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        tx_power);
14511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientSetAdvDataNative(JNIEnv* env, jobject object , jint client_if,
14541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jboolean set_scan_rsp, jboolean incl_name, jboolean incl_txpower, jint appearance,
14551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jbyteArray manufacturer_data,jbyteArray service_data, jbyteArray service_uuid)
14561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
14571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* manu_data = env->GetByteArrayElements(manufacturer_data, NULL);
14591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t manu_len = (uint16_t) env->GetArrayLength(manufacturer_data);
14601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_data = env->GetByteArrayElements(service_data, NULL);
14621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_data_len = (uint16_t) env->GetArrayLength(service_data);
14631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_uuid = env->GetByteArrayElements(service_uuid, NULL);
14651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_uuid_len = (uint16_t) env->GetArrayLength(service_uuid);
14661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_set_inst_data(client_if, set_scan_rsp, incl_name,incl_txpower,
14681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             appearance, manu_len, (char*)manu_data,
14691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             serv_data_len, (char*)serv_data, serv_uuid_len,
14701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             (char*)serv_uuid);
14711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(manufacturer_data, manu_data, JNI_ABORT);
14731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_data, serv_data, JNI_ABORT);
14741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_uuid, serv_uuid, JNI_ABORT);
14751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientDisableAdvNative(JNIEnv* env, jobject object, jint client_if)
14781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
14791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_disable(client_if);
14811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14832b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientConfigBatchScanStorageNative(JNIEnv* env, jobject object, jint client_if,
14842b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint max_full_reports_percent, jint max_trunc_reports_percent,
14852b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint notify_threshold_level_percent)
14862b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14872b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
14882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_cfg_storage(client_if, max_full_reports_percent,
14892b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            max_trunc_reports_percent, notify_threshold_level_percent);
14902b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14912b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientStartBatchScanNative(JNIEnv* env, jobject object, jint client_if,
14932b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint scan_mode, jint scan_interval_unit, jint scan_window_unit, jint addr_type,
14942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint discard_rule)
14952b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14962b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
14972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_enb_batch_scan(client_if, scan_mode, scan_interval_unit,
14982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            scan_window_unit, addr_type, discard_rule);
14992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
15012b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientStopBatchScanNative(JNIEnv* env, jobject object, jint client_if)
15022b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
15032b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
15042b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_dis_batch_scan(client_if);
15052b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
15072b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientReadScanReportsNative(JNIEnv* env, jobject object, jint client_if,
15082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint scan_type)
15092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
15102b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
15112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_read_reports(client_if, scan_type);
15122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
151403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
151503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions
151603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
151703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object,
151803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
151903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
152003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
152103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
152203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
152303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->register_server(&uuid);
152403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
152503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
152603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf)
152703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
152803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
152903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->unregister_server(serverIf);
153003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
153103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
153203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object,
153318591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jint server_if, jstring address, jboolean is_direct, jint transport)
153403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
153503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
153603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
153703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
153803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
153903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
154003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
154118591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->server->connect(server_if, &bd_addr, is_direct, transport);
154203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
154303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
154403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf,
154503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
154603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
154703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
154803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
154903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
155003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->disconnect(serverIf, &bda, conn_id);
155103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
155203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
155303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object,
155403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint service_type, jint service_id_inst_id,
155503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
155603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint num_handles)
155703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
155803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
155903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
156003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
156103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
156203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
156303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
156403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
156503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_service(server_if, &srvc_id, num_handles);
156603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
156703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
156803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object,
156903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint included_svc_handle)
157003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
157103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
157203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_included_service(server_if, svc_handle,
157303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                          included_svc_handle);
157403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
157503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
157603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object,
157703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
157803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong char_uuid_lsb, jlong char_uuid_msb,
157903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint properties, jint permissions)
158003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
158103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
158203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
158303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
158403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb);
158503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
158603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_characteristic(server_if, svc_handle,
158703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        &uuid, properties, permissions);
158803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
158903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
159003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object,
159103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
159203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong desc_uuid_lsb, jlong desc_uuid_msb,
159303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint permissions)
159403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
159503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
159603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
159703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
159803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb);
159903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
160003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions);
160103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
160203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
160303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object,
160403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint transport )
160503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
160603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
160703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->start_service(server_if, svc_handle, transport);
160803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
160903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
161003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object,
161103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                         jint server_if, jint svc_handle)
161203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
161303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
161403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->stop_service(server_if, svc_handle);
161503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
161603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
161703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object,
161803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                           jint server_if, jint svc_handle)
161903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
162003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
162103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->delete_service(server_if, svc_handle);
162203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
162303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
162403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object,
162503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
162603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
162703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
162803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
162903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
163003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
163103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
163203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
163303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 1, (char*)array);
163403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
163503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
163603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
163703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object,
163803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
163903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
164003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
164103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
164203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
164303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
164403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
164503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
164603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 0, (char*)array);
164703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
164803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
164903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
165003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object,
165103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint conn_id, jint trans_id, jint status,
165203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint handle, jint offset, jbyteArray val, jint auth_req)
165303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
165403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
165503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
165603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_response_t response;
165703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
165803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.handle = handle;
165903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.auth_req = auth_req;
166003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.offset = offset;
166103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.len = 0;
166203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
166303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val != NULL)
166403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
166503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        response.attr_value.len = (uint16_t) env->GetArrayLength(val);
166603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jbyte* array = env->GetByteArrayElements(val, 0);
166703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
166803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (int i = 0; i != response.attr_value.len; ++i)
166903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            response.attr_value.value[i] = (uint8_t) array[i];
167003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseByteArrayElements(val, array, JNI_ABORT);
167103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
167203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
167303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_response(conn_id, trans_id, status, &response);
167403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
167503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
167603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command,
167703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jlong uuid1_lsb, jlong uuid1_msb, jstring bda1,
167803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jint p1, jint p2, jint p3, jint p4, jint p5 )
167903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
168003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
168103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
168203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bt_bda1;
168303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bt_bda1, bda1);
168403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
168503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid1;
168603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb);
168703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
168803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_test_params_t params;
168903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.bda1 = &bt_bda1;
169003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.uuid1 = &uuid1;
169103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u1 = p1;
169203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u2 = p2;
169303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u3 = p3;
169403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u4 = p4;
169503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u5 = p5;
169603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->test_command(command, &params);
169703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
169803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
169903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
170003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos
170103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
170203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
170327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang// JNI functions defined in AdvertiseManager class.
170427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangstatic JNINativeMethod sAdvertiseMethods[] = {
170527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientEnableAdvNative", "(IIIIII)V", (void *) gattClientEnableAdvNative},
170627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientUpdateAdvNative", "(IIIIII)V", (void *) gattClientUpdateAdvNative},
170727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientSetAdvDataNative", "(IZZZI[B[B[B)V", (void *) gattClientSetAdvDataNative},
170827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientDisableAdvNative", "(I)V", (void *) gattClientDisableAdvNative},
170927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang};
171027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang
17111a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattStateMachine class.
17121a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic JNINativeMethod sStateMachineMethods[] = {
17131a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanNative", "(Z)V", (void *) gattClientScanNative},
17142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientConfigBatchScanStorageNative", "(IIII)V",(void *) gattClientConfigBatchScanStorageNative},
17152b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientStartBatchScanNative", "(IIIIII)V", (void *) gattClientStartBatchScanNative},
17162b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientStopBatchScanNative", "(I)V", (void *) gattClientStopBatchScanNative},
17172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterParamAddNative", "(IIIIIIIIIII)V", (void *) gattClientScanFilterParamAddNative},
17182b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterParamDeleteNative", "(II)V", (void *) gattClientScanFilterParamDeleteNative},
17192b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterParamClearAllNative", "(I)V", (void *) gattClientScanFilterParamClearAllNative},
17202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterAddNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterAddNative},
17212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterDeleteNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterDeleteNative},
17222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterClearNative", "(II)V", (void *) gattClientScanFilterClearNative},
17232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterEnableNative", "(IZ)V", (void *) gattClientScanFilterEnableNative},
17241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang};
17251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
17261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattService class.
172703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = {
172803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"classInitNative", "()V", (void *) classInitNative},
172903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"initializeNative", "()V", (void *) initializeNative},
173003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"cleanupNative", "()V", (void *) cleanupNative},
173103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative},
173203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative},
173303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative},
173418591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattClientConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattClientConnectNative},
173503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative},
173603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative},
173703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative},
173803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative},
17397f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative},
174003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative},
174103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative},
17427f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative},
174303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative},
17447f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative},
174503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative},
174603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative},
174703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative},
1748873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative},
1749662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    {"gattClientConfigureMTUNative", "(II)V", (void *) gattClientConfigureMTUNative},
175003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative},
175103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative},
175218591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattServerConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattServerConnectNative},
175303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative},
175403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative},
175503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative},
175603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative},
175703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative},
175803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative},
175903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative},
176003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative},
176103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative},
176203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative},
176303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative},
176403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1765873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative},
176653f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative},
1767e84b9ab8ebca5e6d108d722fa84234fddf3685cdWei Wang    {"gattClientReadScanReportsNative", "(II)V", (void *) gattClientReadScanReportsNative},
176853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative},
176903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
177003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
177103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env)
177203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
17731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    int register_success =
17741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattServiceStateMachine",
17752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sStateMachineMethods, NELEM(sStateMachineMethods));
177627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    register_success &=
177727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/AdvertiseManager$AdvertiseNative",
177827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang                sAdvertiseMethods, NELEM(sAdvertiseMethods));
17791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    return register_success &
17801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService",
17812b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sMethods, NELEM(sMethods));
178203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
178303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
1784