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_onReadDescriptor;
15303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteDescriptor;
15403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onNotify;
15503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetCharacteristic;
15603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetDescriptor;
15703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetIncludedService;
15803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onRegisterForNotifications;
15903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadRemoteRssi;
16024dce60783d85fbf49f550203a383b2f4a171a52Wei Wangstatic jmethodID method_onAdvertiseCallback;
161662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic jmethodID method_onConfigureMTU;
1621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onScanFilterConfig;
1632b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onScanFilterParamsConfigured;
1642b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onScanFilterEnableDisabled;
1651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvEnable;
1661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvUpdate;
1671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvSetAdvData;
1681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvDisable;
169afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onClientCongestion;
1702b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanStorageConfigured;
1712b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanStartStopped;
1722b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanReports;
1732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onBatchScanThresholdCrossed;
174655434047df38242c1848eee283f134cfd299fd1Satya Calloji
175655434047df38242c1848eee283f134cfd299fd1Satya Callojistatic jmethodID method_CreateonTrackAdvFoundLostObject;
1762b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic jmethodID method_onTrackAdvFoundLost;
177ecbac5b723ac906c46271c2b740a52ccef625c57Satya Callojistatic jmethodID method_onScanParamSetupCompleted;
178655434047df38242c1848eee283f134cfd299fd1Satya Calloji
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered;
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected;
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded;
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded;
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded;
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded;
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted;
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped;
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted;
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted;
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead;
19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite;
19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite;
195afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onNotificationSent;
196afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachstatic jmethodID method_onServerCongestion;
197e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbachstatic jmethodID method_onServerMtuChanged;
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables
20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL;
20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL;
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL;
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() {
20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv = getCallbackEnv();
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    JNIEnv* env = AndroidRuntime::getJNIEnv();
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sCallbackEnv != env || sCallbackEnv == NULL) return false;
21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return true;
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid)
22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status,
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, UUID_PARAMS(app_uuid));
22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data)
22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(62);
23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data);
23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult
24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , address, rssi, jb);
24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected,
25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected,
27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
27703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status)
28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
28203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted,
28303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 conn_id, status);
28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
28803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id,
29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        SRVC_ID_PARAMS(srvc_id));
29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
29303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
29403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
29503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status,
2967f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                int char_prop)
29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
29903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
30003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic
3017f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , char_prop);
30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status,
3077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
3087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_gatt_id_t *descr_id)
30903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor
3127f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
3137f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS(descr_id));
31403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status,
31803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id)
31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService
32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id));
32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status,
3277f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                                          btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id)
32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications
3317f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id));
33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data)
33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
33703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X",
34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2],
34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]);
34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len);
34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value);
34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify
34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id))
3507f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb);
35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
35603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data)
35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
36203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( status == 0 )      //successful
36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
36603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            (jbyte *) p_data->value.value);
36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uint8_t value = 0;
36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value);
37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
37203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic
37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3757f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb);
37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data)
38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic
38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3857f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)));
38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status)
39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted
39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status);
39403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data)
39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
40003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( p_data->value.len != 0 )
40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
40603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                (jbyte *) p_data->value.value);
40703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor
41203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4137f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id))
41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , p_data->value_type, jb);
41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data)
42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor
42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4257f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id))
4267f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->descr_id)));
42703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
42803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
42903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
43003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status)
43103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
43203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
43303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
43403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
43503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
43603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
43703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
43803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
43903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi,
44003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       client_if, address, rssi, status);
44103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
44524dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if)
44624dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{
44724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    CHECK_CALLBACK_ENV
44824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if);
44924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
45024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang}
45124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang
452662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachvoid btgattc_configure_mtu_cb(int conn_id, int status, int mtu)
453662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
454662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    CHECK_CALLBACK_ENV
455662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConfigureMTU,
456662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach                                 conn_id, status, mtu);
457662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
458662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
459662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
4602b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_cfg_cb(int action, int client_if, int status, int filt_type,
4612b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                int avbl_space)
4621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterConfig,
4652b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 action, status, client_if, filt_type, avbl_space);
4662b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4672b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
4682b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
4692b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_param_cb(int action, int client_if, int status, int avbl_space)
4702b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
4712b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
4722b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterParamsConfigured,
4732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            action, status, client_if, avbl_space);
4742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
4762b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
4772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_scan_filter_status_cb(int action, int client_if, int status)
4782b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
4792b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
4802b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterEnableDisabled,
4812b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            action, status, client_if);
4821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_enable_cb(int client_if, int status)
4861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status,client_if);
4891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4921a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_update_cb(int client_if, int status)
4931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4941a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4951a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvUpdate, status, client_if);
4961a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4971a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4981a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4991a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_setadv_data_cb(int client_if, int status)
5001a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
5011a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
5021a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetAdvData, status, client_if);
5031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
5051a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
5061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_disable_cb(int client_if, int status)
5071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
5081a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
5091a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvDisable, status, client_if);
5101a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5111a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
5121a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
513afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgattc_congestion_cb(int conn_id, bool congested)
514afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
515afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
516afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientCongestion, conn_id, congested);
517afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
518afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
519afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
5202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_cfg_storage_cb(int client_if, int status)
5212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanStorageConfigured, status, client_if);
5242b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5252b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5262b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5272b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_startstop_cb(int startstop_action, int client_if, int status)
5282b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5292b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5302b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanStartStopped, startstop_action,
5312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 status, client_if);
5322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_reports_cb(int client_if, int status, int report_format,
5362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                        int num_records, int data_len, uint8_t *p_rep_data)
5372b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5382b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5392b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    jbyteArray jb = sCallbackEnv->NewByteArray(data_len);
5402b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->SetByteArrayRegion(jb, 0, data_len, (jbyte *) p_rep_data);
5412b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5422b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanReports, status, client_if,
5432b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                report_format, num_records, jb);
5442b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->DeleteLocalRef(jb);
5452b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5462b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5472b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
5482b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangvoid btgattc_batchscan_threshold_cb(int client_if)
5492b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5502b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5512b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onBatchScanThresholdCrossed, client_if);
5522b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5532b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5542b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
555655434047df38242c1848eee283f134cfd299fd1Satya Callojivoid btgattc_track_adv_event_cb(btgatt_track_adv_info_t *p_adv_track_info)
5562b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
5572b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    CHECK_CALLBACK_ENV
5582b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    char c_address[32];
559655434047df38242c1848eee283f134cfd299fd1Satya Calloji    jobject trackadv_obj = NULL;
560655434047df38242c1848eee283f134cfd299fd1Satya Calloji
5612b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
562655434047df38242c1848eee283f134cfd299fd1Satya Calloji        p_adv_track_info->bd_addr.address[0], p_adv_track_info->bd_addr.address[1],
563655434047df38242c1848eee283f134cfd299fd1Satya Calloji        p_adv_track_info->bd_addr.address[2], p_adv_track_info->bd_addr.address[3],
564655434047df38242c1848eee283f134cfd299fd1Satya Calloji        p_adv_track_info->bd_addr.address[4], p_adv_track_info->bd_addr.address[5]);
565655434047df38242c1848eee283f134cfd299fd1Satya Calloji
5662b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    jstring address = sCallbackEnv->NewStringUTF(c_address);
567655434047df38242c1848eee283f134cfd299fd1Satya Calloji
568655434047df38242c1848eee283f134cfd299fd1Satya Calloji    jbyteArray jb_adv_pkt = sCallbackEnv->NewByteArray(p_adv_track_info->adv_pkt_len);
569655434047df38242c1848eee283f134cfd299fd1Satya Calloji    jbyteArray jb_scan_rsp = sCallbackEnv->NewByteArray(p_adv_track_info->scan_rsp_len);
570655434047df38242c1848eee283f134cfd299fd1Satya Calloji
571655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sCallbackEnv->SetByteArrayRegion(jb_adv_pkt, 0, p_adv_track_info->adv_pkt_len,
572655434047df38242c1848eee283f134cfd299fd1Satya Calloji                                     (jbyte *) p_adv_track_info->p_adv_pkt_data);
573655434047df38242c1848eee283f134cfd299fd1Satya Calloji
574655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sCallbackEnv->SetByteArrayRegion(jb_scan_rsp, 0, p_adv_track_info->scan_rsp_len,
575655434047df38242c1848eee283f134cfd299fd1Satya Calloji                                     (jbyte *) p_adv_track_info->p_scan_rsp_data);
576655434047df38242c1848eee283f134cfd299fd1Satya Calloji
577655434047df38242c1848eee283f134cfd299fd1Satya Calloji    trackadv_obj = sCallbackEnv->CallObjectMethod(mCallbacksObj, method_CreateonTrackAdvFoundLostObject,
578655434047df38242c1848eee283f134cfd299fd1Satya Calloji                    p_adv_track_info->client_if, p_adv_track_info->adv_pkt_len, jb_adv_pkt,
579655434047df38242c1848eee283f134cfd299fd1Satya Calloji                    p_adv_track_info->scan_rsp_len, jb_scan_rsp, p_adv_track_info->filt_index,
580655434047df38242c1848eee283f134cfd299fd1Satya Calloji                    p_adv_track_info->advertiser_state, p_adv_track_info->advertiser_info_present,
581655434047df38242c1848eee283f134cfd299fd1Satya Calloji                    address, p_adv_track_info->addr_type, p_adv_track_info->tx_power,
582655434047df38242c1848eee283f134cfd299fd1Satya Calloji                    p_adv_track_info->rssi_value, p_adv_track_info->time_stamp);
583655434047df38242c1848eee283f134cfd299fd1Satya Calloji
584edf17f2e94bc628d4bc954264965a448981f8066Prerepa Viswanadham    if (NULL != trackadv_obj) {
585655434047df38242c1848eee283f134cfd299fd1Satya Calloji        sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onTrackAdvFoundLost, trackadv_obj);
586edf17f2e94bc628d4bc954264965a448981f8066Prerepa Viswanadham        sCallbackEnv->DeleteLocalRef(trackadv_obj);
587edf17f2e94bc628d4bc954264965a448981f8066Prerepa Viswanadham    }
5882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sCallbackEnv->DeleteLocalRef(address);
589655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sCallbackEnv->DeleteLocalRef(jb_adv_pkt);
590655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sCallbackEnv->DeleteLocalRef(jb_scan_rsp);
591655434047df38242c1848eee283f134cfd299fd1Satya Calloji
5922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
5932b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
5942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
595ecbac5b723ac906c46271c2b740a52ccef625c57Satya Callojivoid btgattc_scan_parameter_setup_completed_cb(int client_if, btgattc_error_t status)
596ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji{
597ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    CHECK_CALLBACK_ENV
598ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanParamSetupCompleted, status, client_if);
599ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    checkAndClearExceptionFromCallback(sCallbackEnv, __func__);
600ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji}
601ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji
60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = {
60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_app_cb,
60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_scan_result_cb,
60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_open_cb,
60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_close_cb,
60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_complete_cb,
60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_result_cb,
60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_characteristic_cb,
61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_descriptor_cb,
61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_included_service_cb,
61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_for_notification_cb,
61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_notify_cb,
61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_characteristic_cb,
61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_characteristic_cb,
61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_descriptor_cb,
61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_descriptor_cb,
61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_execute_write_cb,
61924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_remote_rssi_cb,
620662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_advertise_cb,
621662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_configure_mtu_cb,
6222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_cfg_cb,
6232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_param_cb,
6242b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_scan_filter_status_cb,
6251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_enable_cb,
6261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_update_cb,
6271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_setadv_data_cb,
628afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgattc_multiadv_disable_cb,
629f2919fe3409cb17a062baa74361d2129d90ece2bWei Wang    btgattc_congestion_cb,
6302b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_cfg_storage_cb,
6312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_startstop_cb,
6322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_reports_cb,
6332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    btgattc_batchscan_threshold_cb,
634ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    btgattc_track_adv_event_cb,
635ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    btgattc_scan_parameter_setup_completed_cb
63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks
64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid)
64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered
64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , status, server_if, UUID_PARAMS(uuid));
64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
651dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
65803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
65903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected,
662dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach                                 address, connected, conn_id, server_if);
66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if,
66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              btgatt_srvc_id_t *srvc_id, int srvc_handle)
66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
67003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status,
67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, SRVC_ID_PARAMS(srvc_id),
67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle);
67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if,
67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int srvc_handle,
67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int incl_srvc_handle)
68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
68203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded,
68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, srvc_handle, incl_srvc_handle);
68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id,
68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     int srvc_handle, int char_handle)
68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded,
69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(char_id),
69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, char_handle);
69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if,
69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 bt_uuid_t *descr_id, int srvc_handle,
69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 int descr_handle)
70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded,
70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(descr_id),
70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, descr_handle);
70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle)
70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status,
71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
71403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
71503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle)
71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
71803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status,
72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
72203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
72303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle)
72503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
72603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
72703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status,
72803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
73303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                             int attr_handle, int offset, bool is_long)
73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead,
74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, is_long);
74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id,
75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bt_bdaddr_t *bda, int attr_handle,
75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              int offset, int length,
75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bool need_rsp, bool is_prep, uint8_t* value)
75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray val = sCallbackEnv->NewByteArray(length);
76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value);
76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite,
76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, length, need_rsp, is_prep, val);
76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(val);
77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id,
77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   bt_bdaddr_t *bda, int exec_write)
77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite,
78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, exec_write);
78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle)
79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
79403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted,
79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, handle);
79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
799afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgatts_indication_sent_cb(int conn_id, int status)
800afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
801afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
802afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotificationSent,
803afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach                                 conn_id, status);
804afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
805afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
806afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
807afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbachvoid btgatts_congestion_cb(int conn_id, bool congested)
808afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach{
809afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    CHECK_CALLBACK_ENV
810afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerCongestion, conn_id, congested);
811afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
812afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach}
813afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach
814e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbachvoid btgatts_mtu_changed_cb(int conn_id, int mtu)
815e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach{
816e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    CHECK_CALLBACK_ENV
817e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerMtuChanged, conn_id, mtu);
818e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
819e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach}
820e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach
82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = {
82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_register_app_cb,
82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_connection_cb,
82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_added_cb,
82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_included_service_added_cb,
82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_characteristic_added_cb,
82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_descriptor_added_cb,
82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_started_cb,
82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_stopped_cb,
83003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_deleted_cb,
83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_read_cb,
83203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_write_cb,
83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_exec_write_cb,
834afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgatts_response_confirmation_cb,
835afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    btgatts_indication_sent_cb,
836e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    btgatts_congestion_cb,
837e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    btgatts_mtu_changed_cb
83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
83903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
84103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks
84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = {
84503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sizeof(btgatt_callbacks_t),
84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattClientCallbacks,
84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattServerCallbacks
84803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions
85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) {
85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    // Client callbacks
85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V");
85803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V");
85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onConnected   = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V");
86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V");
86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V");
86203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V");
86303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted",  "(II)V");
86403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted",  "(II)V");
86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V");
8667f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V");
8677f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V");
86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V");
86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V");
8707f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V");
87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V");
87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V");
87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V");
874662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    method_onConfigureMTU = env->GetMethodID(clazz, "onConfigureMTU", "(III)V");
8751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V");
8762b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterConfig = env->GetMethodID(clazz, "onScanFilterConfig", "(IIIII)V");
8772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterParamsConfigured = env->GetMethodID(clazz, "onScanFilterParamsConfigured", "(IIII)V");
8782b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onScanFilterEnableDisabled = env->GetMethodID(clazz, "onScanFilterEnableDisabled", "(III)V");
87927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvEnable = env->GetMethodID(clazz, "onAdvertiseInstanceEnabled", "(II)V");
88027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvUpdate = env->GetMethodID(clazz, "onAdvertiseDataUpdated", "(II)V");
88127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvSetAdvData = env->GetMethodID(clazz, "onAdvertiseDataSet", "(II)V");
88227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    method_onMultiAdvDisable = env->GetMethodID(clazz, "onAdvertiseInstanceDisabled", "(II)V");
883afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onClientCongestion = env->GetMethodID(clazz, "onClientCongestion", "(IZ)V");
8842b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanStorageConfigured = env->GetMethodID(clazz, "onBatchScanStorageConfigured", "(II)V");
8852b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanStartStopped = env->GetMethodID(clazz, "onBatchScanStartStopped", "(III)V");
8862b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanReports = env->GetMethodID(clazz, "onBatchScanReports", "(IIII[B)V");
8872b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    method_onBatchScanThresholdCrossed = env->GetMethodID(clazz, "onBatchScanThresholdCrossed", "(I)V");
888655434047df38242c1848eee283f134cfd299fd1Satya Calloji    method_CreateonTrackAdvFoundLostObject = env->GetMethodID(clazz, "CreateonTrackAdvFoundLostObject", "(II[BI[BIIILjava/lang/String;IIII)Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;");
889655434047df38242c1848eee283f134cfd299fd1Satya Calloji    method_onTrackAdvFoundLost = env->GetMethodID(clazz, "onTrackAdvFoundLost",
890655434047df38242c1848eee283f134cfd299fd1Satya Calloji                                                         "(Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;)V");
891ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    method_onScanParamSetupCompleted = env->GetMethodID(clazz, "onScanParamSetupCompleted", "(II)V");
89203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
893655434047df38242c1848eee283f134cfd299fd1Satya Calloji    // Server callbacks
89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V");
896dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach    method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V");
89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V");
89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V");
89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onCharacteristicAdded  = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V");
90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V");
90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V");
90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V");
90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V");
90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V");
90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V");
90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V");
90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V");
908afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onNotificationSent = env->GetMethodID(clazz, "onNotificationSent", "(II)V");
909afc04fcffad9713d5385894b41a1fb29c1d6ee96Andre Eisenbach    method_onServerCongestion = env->GetMethodID(clazz, "onServerCongestion", "(IZ)V");
910e632e4bb8c873f102cac7d6f39585ea06f34c082Andre Eisenbach    method_onServerMtuChanged = env->GetMethodID(clazz, "onMtuChanged", "(II)V");
91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    info("classInitNative: Success!");
91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
91403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf;
91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) {
91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if(btIf)
91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
92003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (btIf = getBluetoothInterface()) == NULL) {
92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Bluetooth module is not loaded");
92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
92403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
92503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT Interface before initializing...");
92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf->cleanup();
92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf = NULL;
93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT callback object");
93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         env->DeleteGlobalRef(mCallbacksObj);
93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         mCallbacksObj = NULL;
93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
93703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (sGattIf = (btgatt_interface_t *)
93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta          btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) {
94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to get Bluetooth GATT Interface");
94103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
94203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
94303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) {
94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to initialize Bluetooth GATT, status: %d", status);
94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    mCallbacksObj = env->NewGlobalRef(object);
95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) {
95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!btIf) return;
95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->cleanup();
96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
96203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->DeleteGlobalRef(mCallbacksObj);
96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mCallbacksObj = NULL;
96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btIf = NULL;
96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions
97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address)
97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
97603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return 0;
97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return sGattIf->client->get_device_type(&bda);
98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object,
98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
98803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->register_client(&uuid);
99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf)
99303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
99403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
99503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->unregister_client(clientIf);
99603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
99703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
998f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadhamstatic void gattClientScanNative(JNIEnv* env, jobject object, jboolean start)
99903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
1001f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham    sGattIf->client->scan(start);
100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
100303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
100403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif,
100518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jstring address, jboolean isDirect, jint transport)
100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
100703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
100803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
100903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
101118591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->client->connect(clientif, &bda, isDirect, transport);
101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf,
101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->disconnect(clientIf, &bda, conn_id);
102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf,
102403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    jstring address)
102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->refresh(clientIf, &bda);
103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id,
103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb)
103503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object,
104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
104603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb)
104903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
105503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
105703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
105903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
106003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
106103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (char_id_uuid_lsb == 0)
106303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
106403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, 0);
106503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
106603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id);
106703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
106803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
106903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
107003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object,
107103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
107203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
107303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
107403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
107503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
10767f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
107703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb)
107803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
107903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
108003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
108103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
108203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
108303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
108403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
108503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10867f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
108703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
108803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
108903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10907f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10917f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10927f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (descr_id_uuid_lsb == 0)
109503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0);
109703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id);
109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(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 incl_service_id_inst_id, jint incl_service_type,
110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb)
110703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t  incl_srvc_id;
111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id;
111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb);
111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (incl_service_id_uuid_lsb == 0)
112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
112203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, 0);
112303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
112403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id);
112503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
112603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
112703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object,
112903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
113003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
113103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
113203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
113303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
113403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
113503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
113603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
113703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
113803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
113903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
114003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
114103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11427f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
114303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
114403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
114503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq);
114703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
114803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object,
115003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
115103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
115203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
115303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
11547f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
115503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
115603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
115703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
115803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
115903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
116103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
116203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
116303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
116403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11657f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
116603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
116703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
116803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11697f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
11707f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
11717f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
117203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq);
117403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
117503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object,
117703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
117803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
117903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
118003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
118103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
118203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
118303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
118403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1185cd3a9e31632afe187f53c3a768541a68e1f99efdyongchun.x.lu    if (value == NULL) {
1186cd3a9e31632afe187f53c3a768541a68e1f99efdyongchun.x.lu        warn("gattClientWriteCharacteristicNative() ignoring NULL array");
1187cd3a9e31632afe187f53c3a768541a68e1f99efdyongchun.x.lu        return;
1188cd3a9e31632afe187f53c3a768541a68e1f99efdyongchun.x.lu    }
1189cd3a9e31632afe187f53c3a768541a68e1f99efdyongchun.x.lu
119003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
119103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
119203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
119303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
119403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
119603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
119703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
119803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
119903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
120003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
120103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
120203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id,
120403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
120503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
120603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
120703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object,
120903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jboolean execute)
121003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
121103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
121203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->execute_write(conn_id, execute ? 1 : 0);
121303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
121403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
121503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object,
121603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint service_id_inst_id,
121703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
121803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
121903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
12207f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
122103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
122203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
122303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
122403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
122503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1226460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    if (value == NULL) {
1227460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        warn("gattClientWriteDescriptorNative() ignoring NULL array");
1228460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        return;
1229460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    }
1230460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach
123103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
123203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
123303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
123403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
123503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12367f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
123703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
123803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
123903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12407f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
12417f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
12427f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
124303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
124503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
124603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
124703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id,
124903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
125003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
125103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
125203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
125303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object,
125403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint clientIf, jstring address,
125503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint service_id_inst_id,
125603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
125703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
125803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
125903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jboolean enable)
126003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
126103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
126203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
126403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
126503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
126603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
126703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12687f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
126903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
127003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
127103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
127303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
127403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
127503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (enable)
127703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
127803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    else
127903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
128003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
128103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif,
128303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address)
128403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
128503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
128603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_remote_rssi(clientif, &bda);
129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1293873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object,
129497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach        jint client_if, jboolean start)
129597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
129697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
129797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->listen(client_if, start);
129897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
129997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
13002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if,
13012b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jboolean setScanRsp, jboolean inclName, jboolean inclTxPower, jint minInterval,
13022b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint maxInterval, jint appearance, jbyteArray manufacturerData, jbyteArray serviceData,
1303873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jbyteArray serviceUuid)
130497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
130597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
1306873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL);
130797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData);
130897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
1309873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_data = env->GetByteArrayElements(serviceData, NULL);
1310873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData);
1311873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
1312873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL);
1313873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid);
1314873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
131597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower,
1316873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        minInterval, maxInterval, appearance, arr_len, (char*)arr_data,
1317873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        service_data_len, (char*)service_data, service_uuid_len,
1318873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        (char*)service_uuid);
131997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
132097d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT);
1321873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT);
1322873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT);
132397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
132497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
132553f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadhamstatic void gattSetScanParametersNative(JNIEnv* env, jobject object,
1326ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji                                        jint client_if, jint scan_interval_unit,
1327ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji                                        jint scan_window_unit)
132853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham{
132953f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    if (!sGattIf) return;
1330ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    sGattIf->client->set_scan_parameters(client_if, scan_interval_unit, scan_window_unit);
133153f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham}
133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1333655434047df38242c1848eee283f134cfd299fd1Satya Callojistatic void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object, jobject params)
13342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
13352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
13362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int add_scan_filter_params_action = 0;
1337655434047df38242c1848eee283f134cfd299fd1Satya Calloji    btgatt_filt_param_setup_t filt_params;
1338655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1339655434047df38242c1848eee283f134cfd299fd1Satya Calloji    jmethodID methodId = 0;
1340655434047df38242c1848eee283f134cfd299fd1Satya Calloji    jclass filtparam = env->GetObjectClass(params);
1341655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1342655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getClientIf", "()I");
1343655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.client_if = env->CallIntMethod(params, methodId);;
1344655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1345655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.action = add_scan_filter_params_action;
1346655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1347655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getFiltIndex", "()I");
1348655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.filt_index = env->CallIntMethod(params, methodId);;
1349655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1350655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getFeatSeln", "()I");
1351655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.feat_seln = env->CallIntMethod(params, methodId);;
1352655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1353655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getListLogicType", "()I");
1354655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.list_logic_type = env->CallIntMethod(params, methodId);
1355655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1356655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getFiltLogicType", "()I");
1357655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.filt_logic_type = env->CallIntMethod(params, methodId);
1358655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1359655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getDelyMode", "()I");
1360655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.dely_mode = env->CallIntMethod(params, methodId);
1361655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1362655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getFoundTimeout", "()I");
1363655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.found_timeout = env->CallIntMethod(params, methodId);
1364655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1365655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getLostTimeout", "()I");
1366655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.lost_timeout = env->CallIntMethod(params, methodId);
1367655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1368655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getFoundTimeOutCnt", "()I");
1369655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.found_timeout_cnt = env->CallIntMethod(params, methodId);
1370655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1371655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getNumOfTrackEntries", "()I");
1372655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.num_of_tracking_entries = env->CallIntMethod(params, methodId);
1373655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1374655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getRSSIHighValue", "()I");
1375655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.rssi_high_thres = env->CallIntMethod(params, methodId);
1376655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1377655434047df38242c1848eee283f134cfd299fd1Satya Calloji    methodId = env->GetMethodID(filtparam, "getRSSILowValue", "()I");
1378655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.rssi_low_thres = env->CallIntMethod(params, methodId);
1379655434047df38242c1848eee283f134cfd299fd1Satya Calloji
1380655434047df38242c1848eee283f134cfd299fd1Satya Calloji    env->DeleteLocalRef(filtparam);
1381655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sGattIf->client->scan_filter_param_setup(filt_params);
13822b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
13831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
13842b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterParamDeleteNative(JNIEnv* env, jobject object,
13852b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint client_if, jint filt_index)
13861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
13871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
13882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int delete_scan_filter_params_action = 1;
1389655434047df38242c1848eee283f134cfd299fd1Satya Calloji    btgatt_filt_param_setup_t filt_params;
1390655434047df38242c1848eee283f134cfd299fd1Satya Calloji    memset(&filt_params, 0, sizeof(btgatt_filt_param_setup_t));
1391655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.client_if = client_if;
1392655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.action = delete_scan_filter_params_action;
1393655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.filt_index = filt_index;
1394655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sGattIf->client->scan_filter_param_setup(filt_params);
13951a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
139680e7d011fdb511a6583258458e97821176866baaWei Wang
13972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterParamClearAllNative(JNIEnv* env, jobject object, jint client_if)
13981a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
13991a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
14002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    const int clear_scan_filter_params_action = 2;
1401655434047df38242c1848eee283f134cfd299fd1Satya Calloji    btgatt_filt_param_setup_t filt_params;
1402655434047df38242c1848eee283f134cfd299fd1Satya Calloji    memset(&filt_params, 0, sizeof(btgatt_filt_param_setup_t));
1403655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.client_if = client_if;
1404655434047df38242c1848eee283f134cfd299fd1Satya Calloji    filt_params.action = clear_scan_filter_params_action;
1405655434047df38242c1848eee283f134cfd299fd1Satya Calloji    sGattIf->client->scan_filter_param_setup(filt_params);
14062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterAddRemoveNative(JNIEnv* env, jobject object,
14092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint client_if, jint action, jint filt_type, jint filt_index, jint company_id,
14102b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint company_id_mask, jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb,
14112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jlong uuid_mask_msb, jstring name, jstring address, jbyte addr_type,
14122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jbyteArray data, jbyteArray mask)
14132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    switch(filt_type)
14151a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {
14161a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 0: // BTM_BLE_PF_ADDR_FILTER
14172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        {
14181a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_bdaddr_t bda;
14191a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jstr2bdaddr(env, &bda, address);
14202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index, 0,
14212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                             0, NULL, NULL, &bda, addr_type,0, NULL,0, NULL);
14221a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14232b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        }
14241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 1: // BTM_BLE_PF_SRVC_DATA
14262b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        {
14272b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* data_array = env->GetByteArrayElements(data, 0);
14282b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            int data_len = env->GetArrayLength(data);
14292b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* mask_array = env->GetByteArrayElements(mask, NULL);
14302b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            uint16_t mask_len = (uint16_t) env->GetArrayLength(mask);
14312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
14322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang               0, 0, NULL, NULL, NULL, 0, data_len, (char*)data_array, mask_len,(char*) mask_array);
14332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(data, data_array, JNI_ABORT);
14342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(mask, mask_array, JNI_ABORT);
14351a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        }
14371a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 2: // BTM_BLE_PF_SRVC_UUID
14391a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 3: // BTM_BLE_PF_SRVC_SOL_UUID
14401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
14411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_uuid_t uuid, uuid_mask;
14421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid.uu, uuid_msb, uuid_lsb);
14431a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid_mask.uu, uuid_mask_msb, uuid_mask_lsb);
14441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (uuid_mask_lsb != 0 && uuid_mask_msb != 0)
14452b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
14462b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 0, 0, &uuid, &uuid_mask, NULL,0,0, NULL,0, NULL);
14471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            else
14482b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
14492b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 0, 0, &uuid, NULL, NULL, 0,0, NULL,0, NULL);
14501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
14521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 4: // BTM_BLE_PF_LOCAL_NAME
14541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
14551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            const char* c_name = env->GetStringUTFChars(name, NULL);
14561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (c_name != NULL && strlen(c_name) != 0)
14571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            {
14582b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sGattIf->client->scan_filter_add_remove(client_if, action, filt_type,
14592b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 filt_index, 0, 0, NULL, NULL, NULL, 0, strlen(c_name),
14602b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                                 (char*)c_name, 0, NULL);
14611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                env->ReleaseStringUTFChars(name, c_name);
14621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            }
14631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
14651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 5: // BTM_BLE_PF_MANU_DATA
14672b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        case 6: // BTM_BLE_PF_SRVC_DATA_PATTERN
14681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
14691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jbyte* data_array = env->GetByteArrayElements(data, 0);
14702b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            int data_len = env->GetArrayLength(data); // Array contains mask
14712b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jbyte* mask_array = env->GetByteArrayElements(mask, NULL);
14722b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            uint16_t mask_len = (uint16_t) env->GetArrayLength(mask);
14732b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            sGattIf->client->scan_filter_add_remove(client_if, action, filt_type, filt_index,
14742b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                company_id, company_id_mask, NULL, NULL, NULL, 0, data_len, (char*)data_array,
14752b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                mask_len, (char*) mask_array);
14761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            env->ReleaseByteArrayElements(data, data_array, JNI_ABORT);
14772b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            env->ReleaseByteArrayElements(mask, mask_array, JNI_ABORT);
14781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
14801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        default:
14821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
14831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    }
14841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
14851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14862b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jint client_if,
14872b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jint filt_type, jint filt_index, jint company_id, jint company_id_mask,
14882b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb, jlong uuid_mask_msb,
14892b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jstring name, jstring address, jbyte addr_type, jbyteArray data, jbyteArray mask)
14902b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
14912b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
14922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    int action = 0;
14932b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    gattClientScanFilterAddRemoveNative(env, object, client_if, action, filt_type, filt_index,
14942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    company_id, company_id_mask, uuid_lsb, uuid_msb, uuid_mask_lsb, uuid_mask_msb,
14952b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    name, address, addr_type, data, mask);
14962b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
14982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
14992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterDeleteNative(JNIEnv* env, jobject object, jint client_if,
15002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jint filt_type, jint filt_index, jint company_id, jint company_id_mask,
15012b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jlong uuid_lsb,  jlong uuid_msb, jlong uuid_mask_lsb, jlong uuid_mask_msb,
15022b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                jstring name, jstring address, jbyte addr_type, jbyteArray data, jbyteArray mask)
15032b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
15042b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
15052b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    int action = 1;
15062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    gattClientScanFilterAddRemoveNative(env, object, client_if, action, filt_type, filt_index,
15072b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    company_id, company_id_mask, uuid_lsb, uuid_msb, uuid_mask_lsb, uuid_mask_msb,
15082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                    name, address, addr_type, data, mask);
15092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15102b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
15112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterClearNative(JNIEnv* env, jobject object, jint client_if,
15122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                        jint filt_index)
15132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
15142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
15152b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_clear(client_if, filt_index);
15162b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
15182b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientScanFilterEnableNative (JNIEnv* env, jobject object, jint client_if,
15192b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                          jboolean enable)
15201a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
15211a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
15222b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->scan_filter_enable(client_if, enable);
15231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
15241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
1525662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic void gattClientConfigureMTUNative(JNIEnv *env, jobject object,
1526662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach        jint conn_id, jint mtu)
1527662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
1528662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    if (!sGattIf) return;
1529662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sGattIf->client->configure_mtu(conn_id, mtu);
1530662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
1531662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
1532fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbachstatic void gattConnectionParameterUpdateNative(JNIEnv *env, jobject object, jint client_if,
1533fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach        jstring address, jint min_interval, jint max_interval, jint latency, jint timeout)
1534fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach{
1535fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach    if (!sGattIf) return;
1536fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach    bt_bdaddr_t bda;
1537fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach    jstr2bdaddr(env, &bda, address);
1538fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach    sGattIf->client->conn_parameter_update(&bda, min_interval, max_interval, latency, timeout);
1539fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach}
1540fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach
15411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientEnableAdvNative(JNIEnv* env, jobject object, jint client_if,
1542c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power,
1543c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach       jint timeout_s)
15441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
15451a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
15461a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_enable(client_if, min_interval, max_interval, adv_type, chnl_map,
1548c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach        tx_power, timeout_s);
15491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
15501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientUpdateAdvNative(JNIEnv* env, jobject object, jint client_if,
1552c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power,
1553c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach       jint timeout_s)
15541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
15551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
15561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_update(client_if, min_interval, max_interval, adv_type, chnl_map,
1558c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach        tx_power, timeout_s);
15591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
15601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientSetAdvDataNative(JNIEnv* env, jobject object , jint client_if,
15621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jboolean set_scan_rsp, jboolean incl_name, jboolean incl_txpower, jint appearance,
15631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jbyteArray manufacturer_data,jbyteArray service_data, jbyteArray service_uuid)
15641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
15651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
15661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* manu_data = env->GetByteArrayElements(manufacturer_data, NULL);
15671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t manu_len = (uint16_t) env->GetArrayLength(manufacturer_data);
15681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_data = env->GetByteArrayElements(service_data, NULL);
15701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_data_len = (uint16_t) env->GetArrayLength(service_data);
15711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_uuid = env->GetByteArrayElements(service_uuid, NULL);
15731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_uuid_len = (uint16_t) env->GetArrayLength(service_uuid);
15741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_set_inst_data(client_if, set_scan_rsp, incl_name,incl_txpower,
15761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             appearance, manu_len, (char*)manu_data,
15771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             serv_data_len, (char*)serv_data, serv_uuid_len,
15781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             (char*)serv_uuid);
15791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(manufacturer_data, manu_data, JNI_ABORT);
15811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_data, serv_data, JNI_ABORT);
15821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_uuid, serv_uuid, JNI_ABORT);
15831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
15841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientDisableAdvNative(JNIEnv* env, jobject object, jint client_if)
15861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
15871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
15881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_disable(client_if);
15891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
15901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
15912b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientConfigBatchScanStorageNative(JNIEnv* env, jobject object, jint client_if,
15922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint max_full_reports_percent, jint max_trunc_reports_percent,
15932b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint notify_threshold_level_percent)
15942b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
15952b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
15962b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_cfg_storage(client_if, max_full_reports_percent,
15972b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            max_trunc_reports_percent, notify_threshold_level_percent);
15982b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
15992b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
16002b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientStartBatchScanNative(JNIEnv* env, jobject object, jint client_if,
16012b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint scan_mode, jint scan_interval_unit, jint scan_window_unit, jint addr_type,
16022b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            jint discard_rule)
16032b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
16042b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
16052b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_enb_batch_scan(client_if, scan_mode, scan_interval_unit,
16062b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang            scan_window_unit, addr_type, discard_rule);
16072b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
16082b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
16092b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientStopBatchScanNative(JNIEnv* env, jobject object, jint client_if)
16102b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
16112b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
16122b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_dis_batch_scan(client_if);
16132b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
16142b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
16152b670d217c743a7a8082f1d72baf532ef66ba21cWei Wangstatic void gattClientReadScanReportsNative(JNIEnv* env, jobject object, jint client_if,
16162b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang        jint scan_type)
16172b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang{
16182b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    if (!sGattIf) return;
16192b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    sGattIf->client->batchscan_read_reports(client_if, scan_type);
16202b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang}
16212b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang
162203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
162303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions
162403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
162503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object,
162603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
162703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
162803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
162903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
163003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
163103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->register_server(&uuid);
163203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
163303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
163403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf)
163503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
163603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
163703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->unregister_server(serverIf);
163803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
163903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
164003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object,
164118591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jint server_if, jstring address, jboolean is_direct, jint transport)
164203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
164303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
164403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
164503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
164603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
164703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
164803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
164918591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->server->connect(server_if, &bd_addr, is_direct, transport);
165003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
165103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
165203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf,
165303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
165403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
165503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
165603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
165703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
165803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->disconnect(serverIf, &bda, conn_id);
165903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
166003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
166103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object,
166203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint service_type, jint service_id_inst_id,
166303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
166403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint num_handles)
166503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
166603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
166703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
166803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
166903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
167003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
167103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
167203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
167303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_service(server_if, &srvc_id, num_handles);
167403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
167503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
167603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object,
167703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint included_svc_handle)
167803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
167903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
168003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_included_service(server_if, svc_handle,
168103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                          included_svc_handle);
168203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
168303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
168403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object,
168503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
168603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong char_uuid_lsb, jlong char_uuid_msb,
168703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint properties, jint permissions)
168803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
168903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
169003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
169103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
169203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb);
169303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
169403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_characteristic(server_if, svc_handle,
169503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        &uuid, properties, permissions);
169603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
169703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
169803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object,
169903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
170003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong desc_uuid_lsb, jlong desc_uuid_msb,
170103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint permissions)
170203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
170303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
170403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
170503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
170603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb);
170703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
170803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions);
170903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
171003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
171103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object,
171203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint transport )
171303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
171403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
171503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->start_service(server_if, svc_handle, transport);
171603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
171703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
171803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object,
171903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                         jint server_if, jint svc_handle)
172003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
172103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
172203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->stop_service(server_if, svc_handle);
172303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
172403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
172503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object,
172603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                           jint server_if, jint svc_handle)
172703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
172803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
172903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->delete_service(server_if, svc_handle);
173003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
173103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
173203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object,
173303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
173403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
173503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
173603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
173703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
173803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
173903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
174003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
174103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 1, (char*)array);
174203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
174303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
174403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
174503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object,
174603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
174703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
174803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
174903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
175003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
175103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
175203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
175303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
175403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 0, (char*)array);
175503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
175603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
175703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
175803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object,
175903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint conn_id, jint trans_id, jint status,
176003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint handle, jint offset, jbyteArray val, jint auth_req)
176103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
176203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
176303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
176403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_response_t response;
176503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
176603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.handle = handle;
176703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.auth_req = auth_req;
176803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.offset = offset;
176903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.len = 0;
177003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
177103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val != NULL)
177203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
177303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        response.attr_value.len = (uint16_t) env->GetArrayLength(val);
177403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jbyte* array = env->GetByteArrayElements(val, 0);
177503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
177603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (int i = 0; i != response.attr_value.len; ++i)
177703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            response.attr_value.value[i] = (uint8_t) array[i];
177803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseByteArrayElements(val, array, JNI_ABORT);
177903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
178003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
178103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_response(conn_id, trans_id, status, &response);
178203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
178303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
178403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command,
178503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jlong uuid1_lsb, jlong uuid1_msb, jstring bda1,
178603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jint p1, jint p2, jint p3, jint p4, jint p5 )
178703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
178803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
178903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
179003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bt_bda1;
179103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bt_bda1, bda1);
179203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
179303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid1;
179403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb);
179503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
179603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_test_params_t params;
179703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.bda1 = &bt_bda1;
179803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.uuid1 = &uuid1;
179903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u1 = p1;
180003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u2 = p2;
180103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u3 = p3;
180203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u4 = p4;
180303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u5 = p5;
180403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->test_command(command, &params);
180503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
180603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
180703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
180803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos
180903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
181003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
181127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang// JNI functions defined in AdvertiseManager class.
181227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangstatic JNINativeMethod sAdvertiseMethods[] = {
1813c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach    {"gattClientEnableAdvNative", "(IIIIIII)V", (void *) gattClientEnableAdvNative},
1814c1512abbe9bb60c94c5f46e90918983d1514c8e3Andre Eisenbach    {"gattClientUpdateAdvNative", "(IIIIIII)V", (void *) gattClientUpdateAdvNative},
181527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientSetAdvDataNative", "(IZZZI[B[B[B)V", (void *) gattClientSetAdvDataNative},
181627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    {"gattClientDisableAdvNative", "(I)V", (void *) gattClientDisableAdvNative},
1817a1664d61821a59145f8095a75373403a0c54244eWei Wang    {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative},
1818a1664d61821a59145f8095a75373403a0c54244eWei Wang    {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative},
181927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang};
182027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang
18219c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang// JNI functions defined in ScanManager class.
18229c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wangstatic JNINativeMethod sScanMethods[] = {
18231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanNative", "(Z)V", (void *) gattClientScanNative},
18249c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang    // Batch scan JNI functions.
18252b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientConfigBatchScanStorageNative", "(IIII)V",(void *) gattClientConfigBatchScanStorageNative},
18262b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientStartBatchScanNative", "(IIIIII)V", (void *) gattClientStartBatchScanNative},
18272b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientStopBatchScanNative", "(I)V", (void *) gattClientStopBatchScanNative},
18289c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang    {"gattClientReadScanReportsNative", "(II)V", (void *) gattClientReadScanReportsNative},
18299c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang    // Scan filter JNI functions.
1830655434047df38242c1848eee283f134cfd299fd1Satya Calloji    {"gattClientScanFilterParamAddNative", "(Lcom/android/bluetooth/gatt/FilterParams;)V", (void *) gattClientScanFilterParamAddNative},
18312b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterParamDeleteNative", "(II)V", (void *) gattClientScanFilterParamDeleteNative},
18322b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterParamClearAllNative", "(I)V", (void *) gattClientScanFilterParamClearAllNative},
18332b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterAddNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterAddNative},
18342b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterDeleteNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterDeleteNative},
18352b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterClearNative", "(II)V", (void *) gattClientScanFilterClearNative},
18362b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang    {"gattClientScanFilterEnableNative", "(IZ)V", (void *) gattClientScanFilterEnableNative},
1837ecbac5b723ac906c46271c2b740a52ccef625c57Satya Calloji    {"gattSetScanParametersNative", "(III)V", (void *) gattSetScanParametersNative},
18381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang};
18391a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
18401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattService class.
184103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = {
184203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"classInitNative", "()V", (void *) classInitNative},
184303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"initializeNative", "()V", (void *) initializeNative},
184403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"cleanupNative", "()V", (void *) cleanupNative},
184503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative},
184603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative},
184703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative},
184818591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattClientConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattClientConnectNative},
184903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative},
185003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative},
185103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative},
185203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative},
18537f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative},
185403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative},
185503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative},
18567f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative},
185703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative},
18587f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative},
185903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative},
186003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative},
186103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative},
1862662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    {"gattClientConfigureMTUNative", "(II)V", (void *) gattClientConfigureMTUNative},
1863fbe63484114cf9b7a79043e0bc5bb74504cf5730Andre Eisenbach    {"gattConnectionParameterUpdateNative", "(ILjava/lang/String;IIII)V", (void *) gattConnectionParameterUpdateNative},
186403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative},
186503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative},
186618591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattServerConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattServerConnectNative},
186703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative},
186803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative},
186903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative},
187003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative},
187103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative},
187203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative},
187303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative},
187403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative},
187503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative},
187603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative},
187703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative},
187803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
187953f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative},
188003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
188103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
188203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env)
188303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
18841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    int register_success =
18859c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/ScanManager$ScanNative",
18869c24a0ef159f3332a2e66648d8d3c7dfac26cbc8Wei Wang                sScanMethods, NELEM(sScanMethods));
188727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang    register_success &=
188827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/AdvertiseManager$AdvertiseNative",
188927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang                sAdvertiseMethods, NELEM(sAdvertiseMethods));
18901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    return register_success &
18911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService",
18922b670d217c743a7a8082f1d72baf532ef66ba21cWei Wang                sMethods, NELEM(sMethods));
189303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
189403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
1895