com_android_bluetooth_gatt.cpp revision 80e7d011fdb511a6583258458e97821176866baa
103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/*
203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project
303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License");
503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * you may not use this file except in compliance with the License.
603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * You may obtain a copy of the License at
703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *      http://www.apache.org/licenses/LICENSE-2.0
903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
1003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software
1103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS,
1203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * See the License for the specific language governing permissions and
1403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * limitations under the License.
1503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
1603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_TAG "BtGatt.JNI"
1903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20c7f38d71d51e3554ab03ffc4000ee444a1517d55Mike Lockwood#define LOG_NDEBUG 0
2103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
2203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define CHECK_CALLBACK_ENV                                                      \
2303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta   if (!checkCallbackThread()) {                                                \
2403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       error("Callback: '%s' is not called on the correct thread", __FUNCTION__);\
2503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       return;                                                                  \
2603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta   }
2703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
2803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "com_android_bluetooth.h"
2903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "hardware/bt_gatt.h"
3003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "utils/Log.h"
3103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include "android_runtime/AndroidRuntime.h"
3203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <string.h>
3403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#include <cutils/log.h>
3603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define info(fmt, ...)  ALOGI ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
3703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define debug(fmt, ...) ALOGD ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
3803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define warn(fmt, ...) ALOGW ("WARNING: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
3903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define error(fmt, ...) ALOGE ("ERROR: %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
4003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define asrt(s) if(!(s)) ALOGE ("%s(L%d): ASSERT %s failed! ##",__FUNCTION__, __LINE__, #s)
4103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
4203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define BD_ADDR_LEN 6
4303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
4403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define UUID_PARAMS(uuid_ptr) \
4503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uuid_lsb(uuid_ptr),  uuid_msb(uuid_ptr)
4603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
477f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach#define GATT_ID_PARAMS(attr_ptr) \
487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    attr_ptr->inst_id, \
497f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    UUID_PARAMS((&attr_ptr->uuid))
5003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta#define SRVC_ID_PARAMS(srvc_ptr) \
5203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    (srvc_ptr->is_primary ? \
5303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    BTGATT_SERVICE_TYPE_PRIMARY : BTGATT_SERVICE_TYPE_SECONDARY), \
547f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    GATT_ID_PARAMS((&srvc_ptr->id))
5503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
5703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void set_uuid(uint8_t* uuid, jlong uuid_msb, jlong uuid_lsb)
5803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
5903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (int i = 0; i != 8; ++i)
6003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
6103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uuid[i]     = (uuid_lsb >> (8 * i)) & 0xFF;
6203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uuid[i + 8] = (uuid_msb >> (8 * i)) & 0xFF;
6303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
6403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
6503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
6603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_lsb(bt_uuid_t* uuid)
6703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
6803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint64_t  lsb = 0;
6903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int i;
7003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
7103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 7; i >= 0; i--)
7203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
7303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        lsb <<= 8;
7403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        lsb |= uuid->uu[i];
7503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
7603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
7703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return lsb;
7803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
7903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic uint64_t uuid_msb(bt_uuid_t* uuid)
8103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
8203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint64_t msb = 0;
8303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int i;
8403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 15; i >= 8; i--)
8603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
8703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        msb <<= 8;
8803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        msb |= uuid->uu[i];
8903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
9003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return msb;
9203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
9303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void bd_addr_str_to_addr(const char* str, uint8_t *bd_addr)
9503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
9603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int    i;
9703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char   c;
9803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    c = *str++;
10003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    for (i = 0; i < BD_ADDR_LEN; i++)
10103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
10203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        if (c >= '0' && c <= '9')
10303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - '0';
10403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        else if (c >= 'a' && c <= 'z')
10503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - 'a' + 10;
10603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        else   // (c >= 'A' && c <= 'Z')
10703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] = c - 'A' + 10;
10803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        c = *str++;
11003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        if (c != ':')
11103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        {
11203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bd_addr[i] <<= 4;
11303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (c >= '0' && c <= '9')
11403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - '0';
11503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            else if (c >= 'a' && c <= 'z')
11603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - 'a' + 10;
11703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            else   // (c >= 'A' && c <= 'Z')
11803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                bd_addr[i] |= c - 'A' + 10;
11903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            c = *str++;
12103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
12203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        c = *str++;
12403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
12503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
12603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void jstr2bdaddr(JNIEnv* env, bt_bdaddr_t *bda, jstring address)
12803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
12903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char* c_bda = env->GetStringUTFChars(address, NULL);
13003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (c_bda != NULL && bda != NULL && strlen(c_bda) == 17)
13103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
13203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bd_addr_str_to_addr(c_bda, bda->address);
13303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseStringUTFChars(address, c_bda);
13403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
13503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
13603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
13703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battanamespace android {
13803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
13903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
14003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Client callback methods
14103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
14203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
14303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientRegistered;
14403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onScanResult;
14503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onConnected;
14603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDisconnected;
14703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadCharacteristic;
14803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteCharacteristic;
14903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteCompleted;
15003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchCompleted;
15103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onSearchResult;
15203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescrExtProp;
15303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadDescriptor;
15403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onWriteDescriptor;
15503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onNotify;
15603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetCharacteristic;
15703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetDescriptor;
15803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onGetIncludedService;
15903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onRegisterForNotifications;
16003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onReadRemoteRssi;
16124dce60783d85fbf49f550203a383b2f4a171a52Wei Wangstatic jmethodID method_onAdvertiseCallback;
162662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic jmethodID method_onConfigureMTU;
1631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onScanFilterConfig;
1641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvEnable;
1651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvUpdate;
1661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvSetAdvData;
1671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic jmethodID method_onMultiAdvDisable;
16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods
17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered;
17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected;
17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded;
17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded;
17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded;
17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded;
17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted;
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped;
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted;
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted;
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead;
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite;
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite;
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL;
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL;
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL;
19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() {
19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv = getCallbackEnv();
19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    JNIEnv* env = AndroidRuntime::getJNIEnv();
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sCallbackEnv != env || sCallbackEnv == NULL) return false;
19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return true;
20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks
20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid)
20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status,
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, UUID_PARAMS(app_uuid));
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data)
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(62);
22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data);
22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult
22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , address, rssi, jb);
22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected,
24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected,
26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status)
26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted,
27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 conn_id, status);
27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
27703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id,
27803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        SRVC_ID_PARAMS(srvc_id));
27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
28203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status,
2837f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                int char_prop)
28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic
2887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
28903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , char_prop);
29003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
29303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status,
2947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
2957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_gatt_id_t *descr_id)
29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor
2997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
3007f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS(descr_id));
30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status,
30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id)
30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
30803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService
30903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id));
31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
31203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
31303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status,
3147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                                          btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id)
31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications
3187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id));
31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data)
32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X",
32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2],
32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]);
33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
33203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len);
33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value);
33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify
33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id))
3377f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb);
33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data)
34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( status == 0 )      //successful
35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            (jbyte *) p_data->value.value);
35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uint8_t value = 0;
35603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
35703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value);
35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic
36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3627f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb);
36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
36603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
36703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data)
36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic
37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3727f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)));
37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status)
37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted
38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status);
38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data)
38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( p_data->value.len != 0 )
39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                (jbyte *) p_data->value.value);
39403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
39503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor
39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4007f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id))
40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , p_data->value_type, jb);
40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
40603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data)
40803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor
41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4127f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id))
4137f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->descr_id)));
41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status)
41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
42603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi,
42703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       client_if, address, rssi, status);
42803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
42903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
43003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
43103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
43224dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if)
43324dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{
43424dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    CHECK_CALLBACK_ENV
43524dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if);
43624dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
43724dce60783d85fbf49f550203a383b2f4a171a52Wei Wang}
43824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang
439662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachvoid btgattc_configure_mtu_cb(int conn_id, int status, int mtu)
440662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
441662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    CHECK_CALLBACK_ENV
442662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConfigureMTU,
443662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach                                 conn_id, status, mtu);
444662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
445662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
446662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
4471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_scan_filter_cb(int action, int status)
4481a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanFilterConfig,
4511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                 action, status);
4521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_enable_cb(int client_if, int status)
4561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvEnable, status,client_if);
4591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_update_cb(int client_if, int status)
4631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvUpdate, status, client_if);
4661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_setadv_data_cb(int client_if, int status)
4701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvSetAdvData, status, client_if);
4731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
4761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangvoid btgattc_multiadv_disable_cb(int client_if, int status)
4771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
4781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    CHECK_CALLBACK_ENV
4791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onMultiAdvDisable, status, client_if);
4801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
4811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
4821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
48303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = {
48403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_app_cb,
48503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_scan_result_cb,
48603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_open_cb,
48703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_close_cb,
48803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_complete_cb,
48903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_result_cb,
49003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_characteristic_cb,
49103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_descriptor_cb,
49203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_included_service_cb,
49303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_for_notification_cb,
49403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_notify_cb,
49503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_characteristic_cb,
49603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_characteristic_cb,
49703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_descriptor_cb,
49803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_descriptor_cb,
49903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_execute_write_cb,
50024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_remote_rssi_cb,
501662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_advertise_cb,
502662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_configure_mtu_cb,
5031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_scan_filter_cb,
5041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_enable_cb,
5051a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_update_cb,
5061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_setadv_data_cb,
5071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    btgattc_multiadv_disable_cb
50803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
50903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
51003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
51103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
51203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks
51303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
51403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
51503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid)
51603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
51703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
51803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered
51903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , status, server_if, UUID_PARAMS(uuid));
52003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
52103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
52203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
523dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
52403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
52503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
52603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
52703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
52803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
52903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
53003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
53103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
53203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
53303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected,
534dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach                                 address, connected, conn_id, server_if);
53503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
53603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
53703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
53803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
53903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if,
54003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              btgatt_srvc_id_t *srvc_id, int srvc_handle)
54103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
54203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
54303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status,
54403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, SRVC_ID_PARAMS(srvc_id),
54503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle);
54603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
54703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
54803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
54903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if,
55003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int srvc_handle,
55103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int incl_srvc_handle)
55203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
55303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
55403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded,
55503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, srvc_handle, incl_srvc_handle);
55603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
55703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
55803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
55903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id,
56003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     int srvc_handle, int char_handle)
56103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
56203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
56303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded,
56403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(char_id),
56503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, char_handle);
56603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
56703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if,
57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 bt_uuid_t *descr_id, int srvc_handle,
57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 int descr_handle)
57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded,
57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(descr_id),
57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, descr_handle);
57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle)
58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status,
58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
58503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
58603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
58703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
58803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle)
58903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
59003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
59103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status,
59203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
59303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
59403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
59503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
59603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle)
59703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
59803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
59903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status,
60003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                             int attr_handle, int offset, bool is_long)
60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead,
61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, is_long);
61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id,
62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bt_bdaddr_t *bda, int attr_handle,
62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              int offset, int length,
62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bool need_rsp, bool is_prep, uint8_t* value)
62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
62703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray val = sCallbackEnv->NewByteArray(length);
63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value);
63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite,
63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, length, need_rsp, is_prep, val);
64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(val);
64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id,
64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   bt_bdaddr_t *bda, int exec_write)
64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite,
65803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, exec_write);
65903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
66203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle)
66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted,
66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, handle);
66803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
66903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
67003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = {
67203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_register_app_cb,
67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_connection_cb,
67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_added_cb,
67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_included_service_added_cb,
67603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_characteristic_added_cb,
67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_descriptor_added_cb,
67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_started_cb,
67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_stopped_cb,
68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_deleted_cb,
68103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_read_cb,
68203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_write_cb,
68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_exec_write_cb,
68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_response_confirmation_cb
68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks
68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = {
69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sizeof(btgatt_callbacks_t),
69303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattClientCallbacks,
69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattServerCallbacks
69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions
69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) {
70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    // Client callbacks
70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V");
70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V");
70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onConnected   = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V");
70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V");
70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V");
71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V");
71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted",  "(II)V");
71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted",  "(II)V");
71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V");
7147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V");
7157f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V");
71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V");
71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V");
7187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V");
71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V");
72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V");
72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V");
722662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    method_onConfigureMTU = env->GetMethodID(clazz, "onConfigureMTU", "(III)V");
7231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V");
7241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onScanFilterConfig = env->GetMethodID(clazz, "onScanFilterConfig", "(II)V");
7251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onMultiAdvEnable = env->GetMethodID(clazz, "onClientEnable", "(II)V");
7261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onMultiAdvUpdate = env->GetMethodID(clazz, "onClientUpdate", "(II)V");
7271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onMultiAdvSetAdvData = env->GetMethodID(clazz, "onClientData", "(II)V");
7281a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    method_onMultiAdvDisable = env->GetMethodID(clazz, "onClientDisable", "(II)V");
72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     // Server callbacks
73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V");
733dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach    method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V");
73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V");
73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V");
73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onCharacteristicAdded  = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V");
73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V");
73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V");
73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V");
74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V");
74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V");
74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V");
74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V");
74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V");
74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    info("classInitNative: Success!");
74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf;
75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) {
75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if(btIf)
75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (btIf = getBluetoothInterface()) == NULL) {
75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Bluetooth module is not loaded");
75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT Interface before initializing...");
76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf->cleanup();
76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf = NULL;
76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT callback object");
76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         env->DeleteGlobalRef(mCallbacksObj);
76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         mCallbacksObj = NULL;
77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (sGattIf = (btgatt_interface_t *)
77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta          btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) {
77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to get Bluetooth GATT Interface");
77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) {
78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to initialize Bluetooth GATT, status: %d", status);
78103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
78403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    mCallbacksObj = env->NewGlobalRef(object);
78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) {
78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!btIf) return;
79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->cleanup();
79403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->DeleteGlobalRef(mCallbacksObj);
79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mCallbacksObj = NULL;
80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btIf = NULL;
80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions
80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address)
80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return 0;
81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return sGattIf->client->get_device_type(&bda);
81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object,
81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->register_client(&uuid);
82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf)
82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->unregister_client(clientIf);
83003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
832f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadhamstatic void gattClientScanNative(JNIEnv* env, jobject object, jboolean start)
83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
83403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
835f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham    sGattIf->client->scan(start);
83603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
83703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif,
83918591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jstring address, jboolean isDirect, jint transport)
84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
84103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
84518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->client->connect(clientif, &bda, isDirect, transport);
84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf,
84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->disconnect(clientIf, &bda, conn_id);
85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf,
85803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    jstring address)
85903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
86303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
86403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->refresh(clientIf, &bda);
86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id,
86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb)
86903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
87303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
87403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
87503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object,
87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb)
88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8927f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (char_id_uuid_lsb == 0)
89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, 0);
89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id);
90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object,
90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9107f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb)
91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
91403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9207f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
9257f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
9267f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (descr_id_uuid_lsb == 0)
92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0);
93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id);
93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object,
93703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint service_type, jint service_id_inst_id,
93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint incl_service_id_inst_id, jint incl_service_type,
94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb)
94103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
94203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
94303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
94803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t  incl_srvc_id;
95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id;
95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
95203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb);
95303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (incl_service_id_uuid_lsb == 0)
95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, 0);
95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id);
95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object,
96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
97303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9767f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq);
98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object,
98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
98703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9887f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
99303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
99403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
99503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
99603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
99703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
99803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9997f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10047f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10057f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
100603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
100703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq);
100803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
100903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object,
101103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
101403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
101803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
102003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10247f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id,
103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
103503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object,
103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jboolean execute)
103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->execute_write(conn_id, execute ? 1 : 0);
104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object,
104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, 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,
10497f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1055460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    if (value == NULL) {
1056460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        warn("gattClientWriteDescriptorNative() ignoring NULL array");
1057460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        return;
1058460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    }
1059460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach
106003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
106103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
106203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
106303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
106403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10657f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
106603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
106703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
106803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10697f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10707f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10717f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
107203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
107303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
107403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
107503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
107603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
107703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id,
107803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
107903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
108003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
108103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
108203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object,
108303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint clientIf, jstring address,
108403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint service_id_inst_id,
108503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
108603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
108703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
108803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jboolean enable)
108903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
109003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
109103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
109203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
109303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
109403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
109503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
109603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10977f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
109803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
109903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
110003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
110103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
110203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
110303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
110403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
110503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (enable)
110603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
110703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    else
110803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
111003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif,
111203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address)
111303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
111403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
111503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_remote_rssi(clientif, &bda);
112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1122873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object,
112397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach        jint client_if, jboolean start)
112497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
112597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
112697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->listen(client_if, start);
112797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
112897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
112997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbachstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if, jboolean setScanRsp,
1130873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jboolean inclName, jboolean inclTxPower, jint minInterval, jint maxInterval,
1131873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jint appearance, jbyteArray manufacturerData, jbyteArray serviceData,
1132873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jbyteArray serviceUuid)
113397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
113497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
1135873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL);
113697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData);
113797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
1138873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_data = env->GetByteArrayElements(serviceData, NULL);
1139873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData);
1140873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
1141873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL);
1142873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid);
1143873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
114497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower,
1145873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        minInterval, maxInterval, appearance, arr_len, (char*)arr_data,
1146873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        service_data_len, (char*)service_data, service_uuid_len,
1147873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        (char*)service_uuid);
114897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
114997d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT);
1150873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT);
1151873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT);
115297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
115397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
115453f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadhamstatic void gattSetScanParametersNative(JNIEnv* env, jobject object,
115553f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham                                        jint scan_interval, jint scan_window)
115653f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham{
115753f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    if (!sGattIf) return;
115853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    sGattIf->client->set_scan_parameters(scan_interval, scan_window);
115953f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham}
116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
11621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterEnableNative(JNIEnv* env, jobject object, jboolean enable)
11631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
11641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
11651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->scan_filter_enable(enable ? 1 : 0);
11661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
116780e7d011fdb511a6583258458e97821176866baaWei Wang
11681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterAddNative(JNIEnv* env, jobject object, jint type,
11691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                jint company_id, jint company_mask, jlong uuid_lsb, jlong uuid_msb,
11701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                jlong uuid_mask_lsb, jlong uuid_mask_msb,
11711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                jstring name, jstring address, jbyte addr_type, jbyteArray data)
11721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
11731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
11741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
11751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    switch(type)
11761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {
11771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 0: // BTM_BLE_PF_ADDR_FILTER
11781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_bdaddr_t bda;
11791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jstr2bdaddr(env, &bda, address);
118080e7d011fdb511a6583258458e97821176866baaWei Wang            sGattIf->client->scan_filter_add(type, 0, 0, 0, 0, 0, &bda, addr_type, 0);
11811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
11821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
11831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 1: // BTM_BLE_PF_SRVC_DATA
118480e7d011fdb511a6583258458e97821176866baaWei Wang            sGattIf->client->scan_filter_add(type, 0, 0, 0, 0, 0, 0, 0, 0);
11851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
11861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
11871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 2: // BTM_BLE_PF_SRVC_UUID
11881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 3: // BTM_BLE_PF_SRVC_SOL_UUID
11891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
11901a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            bt_uuid_t uuid, uuid_mask;
11911a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid.uu, uuid_msb, uuid_lsb);
11921a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            set_uuid(uuid_mask.uu, uuid_mask_msb, uuid_mask_lsb);
11931a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (uuid_mask_lsb != 0 && uuid_mask_msb != 0)
119480e7d011fdb511a6583258458e97821176866baaWei Wang                sGattIf->client->scan_filter_add(type, 0, 0, 0, &uuid, &uuid_mask, 0, 0, 0);
11951a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            else
119680e7d011fdb511a6583258458e97821176866baaWei Wang                sGattIf->client->scan_filter_add(type, 0, 0, 0, &uuid, 0, 0, 0, 0);
11971a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
11981a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
11991a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12001a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 4: // BTM_BLE_PF_LOCAL_NAME
12011a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
12021a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            const char* c_name = env->GetStringUTFChars(name, NULL);
12031a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            if (c_name != NULL && strlen(c_name) != 0)
12041a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            {
120580e7d011fdb511a6583258458e97821176866baaWei Wang                sGattIf->client->scan_filter_add(type, 0, 0, strlen(c_name), 0, 0, 0, 0, c_name);
12061a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                env->ReleaseStringUTFChars(name, c_name);
12071a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            }
12081a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
12091a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
12101a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12111a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        case 5: // BTM_BLE_PF_MANU_DATA
12121a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        {
12131a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            jbyte* data_array = env->GetByteArrayElements(data, 0);
12141a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            int data_len = env->GetArrayLength(data) / 2; // Array contains mask
12151a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12161a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            sGattIf->client->scan_filter_add(type, company_id,company_mask, data_len,
121780e7d011fdb511a6583258458e97821176866baaWei Wang                                            0, 0, 0, 0, (char*)data_array);
12181a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            env->ReleaseByteArrayElements(data, data_array, JNI_ABORT);
12191a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
12201a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        }
12211a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12221a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        default:
12231a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang            break;
12241a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    }
12251a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12261a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12271a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientScanFilterClearNative(JNIEnv* env, jobject object)
12281a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12291a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12301a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->scan_filter_clear();
12311a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12321a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
1233662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic void gattClientConfigureMTUNative(JNIEnv *env, jobject object,
1234662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach        jint conn_id, jint mtu)
1235662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
1236662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    if (!sGattIf) return;
1237662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sGattIf->client->configure_mtu(conn_id, mtu);
1238662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
1239662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
12401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientEnableAdvNative(JNIEnv* env, jobject object, jint client_if,
12411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power)
12421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12431a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12441a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12451a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_enable(client_if, min_interval, max_interval, adv_type, chnl_map,
12461a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        tx_power);
12471a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12481a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12491a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientUpdateAdvNative(JNIEnv* env, jobject object, jint client_if,
12501a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang       jint min_interval, jint max_interval, jint adv_type, jint chnl_map, jint tx_power)
12511a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12521a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12531a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12541a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_update(client_if, min_interval, max_interval, adv_type, chnl_map,
12551a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        tx_power);
12561a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12571a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12581a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientSetAdvDataNative(JNIEnv* env, jobject object , jint client_if,
12591a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jboolean set_scan_rsp, jboolean incl_name, jboolean incl_txpower, jint appearance,
12601a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jbyteArray manufacturer_data,jbyteArray service_data, jbyteArray service_uuid)
12611a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12621a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12631a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* manu_data = env->GetByteArrayElements(manufacturer_data, NULL);
12641a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t manu_len = (uint16_t) env->GetArrayLength(manufacturer_data);
12651a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12661a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_data = env->GetByteArrayElements(service_data, NULL);
12671a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_data_len = (uint16_t) env->GetArrayLength(service_data);
12681a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12691a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    jbyte* serv_uuid = env->GetByteArrayElements(service_uuid, NULL);
12701a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    uint16_t serv_uuid_len = (uint16_t) env->GetArrayLength(service_uuid);
12711a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12721a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_set_inst_data(client_if, set_scan_rsp, incl_name,incl_txpower,
12731a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             appearance, manu_len, (char*)manu_data,
12741a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             serv_data_len, (char*)serv_data, serv_uuid_len,
12751a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                             (char*)serv_uuid);
12761a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(manufacturer_data, manu_data, JNI_ABORT);
12781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_data, serv_data, JNI_ABORT);
12791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    env->ReleaseByteArrayElements(service_uuid, serv_uuid, JNI_ABORT);
12801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
12821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic void gattClientDisableAdvNative(JNIEnv* env, jobject object, jint client_if)
12831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang{
12841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    if (!sGattIf) return;
12851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    sGattIf->client->multi_adv_disable(client_if);
12861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang}
12871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions
129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object,
129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
129303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
129403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
129503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
129603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
129703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->register_server(&uuid);
129803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
129903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
130003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf)
130103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
130203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
130303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->unregister_server(serverIf);
130403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
130503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
130603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object,
130718591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jint server_if, jstring address, jboolean is_direct, jint transport)
130803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
130903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
131003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
131103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
131203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
131303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
131403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
131518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->server->connect(server_if, &bd_addr, is_direct, transport);
131603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
131703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
131803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf,
131903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
132003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
132103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
132203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
132303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
132403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->disconnect(serverIf, &bda, conn_id);
132503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
132603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
132703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object,
132803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint service_type, jint service_id_inst_id,
132903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
133003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint num_handles)
133103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
133303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
133403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
133503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
133603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
133703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
133803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
133903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_service(server_if, &srvc_id, num_handles);
134003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
134103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
134203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object,
134303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint included_svc_handle)
134403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
134503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
134603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_included_service(server_if, svc_handle,
134703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                          included_svc_handle);
134803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
134903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
135003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object,
135103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
135203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong char_uuid_lsb, jlong char_uuid_msb,
135303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint properties, jint permissions)
135403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
135503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
135603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
135703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
135803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb);
135903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
136003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_characteristic(server_if, svc_handle,
136103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        &uuid, properties, permissions);
136203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
136303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
136403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object,
136503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
136603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong desc_uuid_lsb, jlong desc_uuid_msb,
136703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint permissions)
136803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
136903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
137003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
137103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
137203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb);
137303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
137403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions);
137503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
137603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
137703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object,
137803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint transport )
137903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
138003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
138103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->start_service(server_if, svc_handle, transport);
138203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
138303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
138403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object,
138503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                         jint server_if, jint svc_handle)
138603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
138703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
138803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->stop_service(server_if, svc_handle);
138903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
139003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
139103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object,
139203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                           jint server_if, jint svc_handle)
139303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
139403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
139503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->delete_service(server_if, svc_handle);
139603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
139703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
139803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object,
139903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
140003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
140103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
140203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
140303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
140403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
140503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
140603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
140703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 1, (char*)array);
140803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
140903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
141003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
141103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object,
141203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
141303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
141403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
141503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
141603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
141703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
141803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
141903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
142003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 0, (char*)array);
142103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
142203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
142303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
142403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object,
142503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint conn_id, jint trans_id, jint status,
142603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint handle, jint offset, jbyteArray val, jint auth_req)
142703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
142803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
142903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
143003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_response_t response;
143103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
143203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.handle = handle;
143303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.auth_req = auth_req;
143403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.offset = offset;
143503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.len = 0;
143603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
143703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val != NULL)
143803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
143903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        response.attr_value.len = (uint16_t) env->GetArrayLength(val);
144003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jbyte* array = env->GetByteArrayElements(val, 0);
144103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
144203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (int i = 0; i != response.attr_value.len; ++i)
144303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            response.attr_value.value[i] = (uint8_t) array[i];
144403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseByteArrayElements(val, array, JNI_ABORT);
144503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
144603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
144703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_response(conn_id, trans_id, status, &response);
144803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
144903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
145003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command,
145103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jlong uuid1_lsb, jlong uuid1_msb, jstring bda1,
145203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jint p1, jint p2, jint p3, jint p4, jint p5 )
145303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
145403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
145503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
145603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bt_bda1;
145703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bt_bda1, bda1);
145803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
145903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid1;
146003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb);
146103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
146203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_test_params_t params;
146303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.bda1 = &bt_bda1;
146403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.uuid1 = &uuid1;
146503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u1 = p1;
146603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u2 = p2;
146703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u3 = p3;
146803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u4 = p4;
146903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u5 = p5;
147003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->test_command(command, &params);
147103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
147203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
147303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
147403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos
147503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
147603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
14771a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattStateMachine class.
14781a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wangstatic JNINativeMethod sStateMachineMethods[] = {
14791a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanNative", "(Z)V", (void *) gattClientScanNative},
14801a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanFilterEnableNative", "(Z)V", (void *) gattClientScanFilterEnableNative},
14811a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanFilterAddNative", "(IIIJJJJLjava/lang/String;Ljava/lang/String;B[B)V", (void *) gattClientScanFilterAddNative},
14821a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientScanFilterClearNative", "()V", (void *) gattClientScanFilterClearNative},
14831a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientEnableAdvNative", "(IIIIII)V", (void *) gattClientEnableAdvNative},
14841a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientUpdateAdvNative", "(IIIIII)V", (void *) gattClientUpdateAdvNative},
14851a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientSetAdvDataNative", "(IZZZI[B[B[B)V", (void *) gattClientSetAdvDataNative},
14861a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    {"gattClientDisableAdvNative", "(I)V", (void *) gattClientDisableAdvNative},
14871a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang};
14881a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang
14891a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang// JNI functions defined in GattService class.
149003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = {
149103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"classInitNative", "()V", (void *) classInitNative},
149203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"initializeNative", "()V", (void *) initializeNative},
149303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"cleanupNative", "()V", (void *) cleanupNative},
149403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
149503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative},
149603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative},
149703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative},
149818591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattClientConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattClientConnectNative},
149903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative},
150003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative},
150103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative},
150203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative},
15037f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative},
150403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative},
150503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative},
15067f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative},
150703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative},
15087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative},
150903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative},
151003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative},
151103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative},
1512873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative},
1513662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    {"gattClientConfigureMTUNative", "(II)V", (void *) gattClientConfigureMTUNative},
151403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
151503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative},
151603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative},
151718591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattServerConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattServerConnectNative},
151803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative},
151903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative},
152003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative},
152103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative},
152203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative},
152303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative},
152403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative},
152503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative},
152603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative},
152703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative},
152803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative},
152903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1530873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative},
153153f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative},
153253f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative},
153303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
153403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
153503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env)
153603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
15371a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    int register_success =
15381a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattServiceStateMachine",
15391a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                 sStateMachineMethods, NELEM(sStateMachineMethods));
15401a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang    return register_success &
15411a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang        jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService",
15421a2f87a202a4d634f0b6b5b6e9a8545796207288Wei Wang                                 sMethods, NELEM(sMethods));
154303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
154403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
154503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
1546