com_android_bluetooth_gatt.cpp revision f745ace608784e226a78170bf5a24fe114f1026f
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;
16303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
16403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
16503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Server callback methods
16603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
16703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServerRegistered;
16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onClientConnected;
16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceAdded;
17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onIncludedServiceAdded;
17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onCharacteristicAdded;
17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onDescriptorAdded;
17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStarted;
17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceStopped;
17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onServiceDeleted;
17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onResponseSendCompleted;
17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeRead;
17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onAttributeWrite;
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jmethodID method_onExecuteWrite;
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Static variables
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_interface_t *sGattIf = NULL;
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic jobject mCallbacksObj = NULL;
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNIEnv *sCallbackEnv = NULL;
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic bool checkCallbackThread() {
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv = getCallbackEnv();
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    JNIEnv* env = AndroidRuntime::getJNIEnv();
19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sCallbackEnv != env || sCallbackEnv == NULL) return false;
19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return true;
19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA client callbacks
19903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
20003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_app_cb(int status, int clientIf, bt_uuid_t *app_uuid)
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
20403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientRegistered, status,
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, UUID_PARAMS(app_uuid));
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
20703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
20803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_scan_result_cb(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data)
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
21203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
21603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(62);
22003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, 62, (jbyte *) adv_data);
22103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanResult
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , address, rssi, jb);
22403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
22503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
22603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
22703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
22803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
22903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_open_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
23103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
23203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
23303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
23503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
23603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
23703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
23803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
23903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
24003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConnected,
24103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
24203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
24303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
24403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
24503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
24603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_close_cb(int conn_id, int status, int clientIf, bt_bdaddr_t* bda)
24703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
24803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
24903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
25003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
25103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
25203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
25303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
25403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
25503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDisconnected,
25603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        clientIf, conn_id, status, address);
25703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
25803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
25903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_complete_cb(int conn_id, int status)
26203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
26303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
26403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchCompleted,
26503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 conn_id, status);
26603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
26703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
26803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
26903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
27003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
27103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
27203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onSearchResult, conn_id,
27303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        SRVC_ID_PARAMS(srvc_id));
27403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
27503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
27603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
27703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_characteristic_cb(int conn_id, int status,
2787f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
27903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                int char_prop)
28003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
28103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
28203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetCharacteristic
2837f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
28403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , char_prop);
28503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
28603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
28703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
28803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_descriptor_cb(int conn_id, int status,
2897f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id,
2907f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                btgatt_gatt_id_t *descr_id)
29103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
29203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
29303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetDescriptor
2947f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id)
2957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS(descr_id));
29603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
29703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
29803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
29903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_get_included_service_cb(int conn_id, int status,
30003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                btgatt_srvc_id_t *srvc_id, btgatt_srvc_id_t *incl_srvc_id)
30103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
30203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
30303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetIncludedService
30403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS(srvc_id), SRVC_ID_PARAMS(incl_srvc_id));
30503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
30603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
30703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
30803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_register_for_notification_cb(int conn_id, int registered, int status,
3097f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach                                          btgatt_srvc_id_t *srvc_id, btgatt_gatt_id_t *char_id)
31003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
31203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onRegisterForNotifications
3137f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , conn_id, status, registered, SRVC_ID_PARAMS(srvc_id), GATT_ID_PARAMS(char_id));
31403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
31503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
31603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
31703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_notify_cb(int conn_id, btgatt_notify_params_t *p_data)
31803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
31903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
32003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
32203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address), "%02X:%02X:%02X:%02X:%02X:%02X",
32303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[0], p_data->bda.address[1], p_data->bda.address[2],
32403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        p_data->bda.address[3], p_data->bda.address[4], p_data->bda.address[5]);
32503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
32603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
32703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb = sCallbackEnv->NewByteArray(p_data->len);
32803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->len, (jbyte *) p_data->value);
32903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onNotify
33103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, address, SRVC_ID_PARAMS((&p_data->srvc_id))
3327f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->is_notify, jb);
33303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
33503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
33603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
33703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
33803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
33903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_characteristic_cb(int conn_id, int status, btgatt_read_params_t *p_data)
34003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
34103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
34203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
34303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
34403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( status == 0 )      //successful
34503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
34603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
34703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
34803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            (jbyte *) p_data->value.value);
34903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
35003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        uint8_t value = 0;
35103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
35203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, 1, (jbyte *) &value);
35303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
35403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
35503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadCharacteristic
35603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3577f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), p_data->value_type, jb);
35803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
35903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
36003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
36103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
36203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_characteristic_cb(int conn_id, int status, btgatt_write_params_t *p_data)
36303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
36403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
36503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteCharacteristic
36603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3677f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)));
36803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
36903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_execute_write_cb(int conn_id, int status)
37203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
37303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
37403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteCompleted
37503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status);
37603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
37703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
37803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
37903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_read_descriptor_cb(int conn_id, int status, btgatt_read_params_t *p_data)
38003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
38103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
38203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
38303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray jb;
38403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( p_data->value.len != 0 )
38503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
38603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(p_data->value.len);
38703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sCallbackEnv->SetByteArrayRegion(jb, 0, p_data->value.len,
38803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                (jbyte *) p_data->value.value);
38903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
39003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jb = sCallbackEnv->NewByteArray(1);
39103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
39203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadDescriptor
39403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
3957f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id)), GATT_ID_PARAMS((&p_data->descr_id))
39603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , p_data->value_type, jb);
39703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
39803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(jb);
39903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
40003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
40103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
40203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_write_descriptor_cb(int conn_id, int status, btgatt_write_params_t *p_data)
40303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
40403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
40503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWriteDescriptor
40603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , conn_id, status, SRVC_ID_PARAMS((&p_data->srvc_id))
4077f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->char_id))
4087f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach        , GATT_ID_PARAMS((&p_data->descr_id)));
40903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
41003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
41103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgattc_remote_rssi_cb(int client_if,bt_bdaddr_t* bda, int rssi, int status)
41303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
41403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
41503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
41603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
41703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    snprintf(c_address, sizeof(c_address),"%02X:%02X:%02X:%02X:%02X:%02X",
41803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[0], bda->address[1], bda->address[2],
41903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        bda->address[3], bda->address[4], bda->address[5]);
42003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
42103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onReadRemoteRssi,
42203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta       client_if, address, rssi, status);
42303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
42403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
42503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
42603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
42724dce60783d85fbf49f550203a383b2f4a171a52Wei Wangvoid btgattc_advertise_cb(int status, int client_if)
42824dce60783d85fbf49f550203a383b2f4a171a52Wei Wang{
42924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    CHECK_CALLBACK_ENV
43024dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAdvertiseCallback, status, client_if);
43124dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
43224dce60783d85fbf49f550203a383b2f4a171a52Wei Wang}
43324dce60783d85fbf49f550203a383b2f4a171a52Wei Wang
434662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachvoid btgattc_configure_mtu_cb(int conn_id, int status, int mtu)
435662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
436662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    CHECK_CALLBACK_ENV
437662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onConfigureMTU,
438662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach                                 conn_id, status, mtu);
439662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
440662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
441662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_client_callbacks_t sGattClientCallbacks = {
44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_app_cb,
44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_scan_result_cb,
44503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_open_cb,
44603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_close_cb,
44703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_complete_cb,
44803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_search_result_cb,
44903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_characteristic_cb,
45003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_descriptor_cb,
45103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_get_included_service_cb,
45203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_register_for_notification_cb,
45303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_notify_cb,
45403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_characteristic_cb,
45503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_characteristic_cb,
45603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_read_descriptor_cb,
45703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_write_descriptor_cb,
45803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgattc_execute_write_cb,
45924dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    btgattc_remote_rssi_cb,
460662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_advertise_cb,
461662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    btgattc_configure_mtu_cb,
46203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
46303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
46403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
46503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
46603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * BTA server callbacks
46703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
46803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
46903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_register_app_cb(int status, int server_if, bt_uuid_t *uuid)
47003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
47103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
47203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServerRegistered
47303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        , status, server_if, UUID_PARAMS(uuid));
47403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
47503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
47603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
477dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbachvoid btgatts_connection_cb(int conn_id, int server_if, int connected, bt_bdaddr_t *bda)
47803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
47903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
48003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
48103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
48203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
48303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
48403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
48503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
48603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
48703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onClientConnected,
488dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach                                 address, connected, conn_id, server_if);
48903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
49003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
49103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
49203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
49303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_added_cb(int status, int server_if,
49403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              btgatt_srvc_id_t *srvc_id, int srvc_handle)
49503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
49603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
49703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceAdded, status,
49803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, SRVC_ID_PARAMS(srvc_id),
49903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle);
50003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
50103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
50203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
50303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_included_service_added_cb(int status, int server_if,
50403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int srvc_handle,
50503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   int incl_srvc_handle)
50603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
50703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
50803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onIncludedServiceAdded,
50903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, srvc_handle, incl_srvc_handle);
51003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
51103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
51203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
51303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_characteristic_added_cb(int status, int server_if, bt_uuid_t *char_id,
51403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     int srvc_handle, int char_handle)
51503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
51603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
51703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onCharacteristicAdded,
51803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(char_id),
51903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, char_handle);
52003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
52103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
52203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
52303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_descriptor_added_cb(int status, int server_if,
52403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 bt_uuid_t *descr_id, int srvc_handle,
52503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 int descr_handle)
52603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
52703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
52803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onDescriptorAdded,
52903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, server_if, UUID_PARAMS(descr_id),
53003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 srvc_handle, descr_handle);
53103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
53203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
53303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
53403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_started_cb(int status, int server_if, int srvc_handle)
53503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
53603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
53703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStarted, status,
53803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
53903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
54003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
54103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
54203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_stopped_cb(int status, int server_if, int srvc_handle)
54303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
54403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
54503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceStopped, status,
54603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
54703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
54803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
54903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
55003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_service_deleted_cb(int status, int server_if, int srvc_handle)
55103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
55203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
55303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onServiceDeleted, status,
55403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 server_if, srvc_handle);
55503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
55603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
55703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
55803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
55903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                             int attr_handle, int offset, bool is_long)
56003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
56103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
56203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
56303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
56403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
56503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
56603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
56703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
56803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
56903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeRead,
57003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
57103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, is_long);
57203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
57303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
57403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
57503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
57603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_write_cb(int conn_id, int trans_id,
57703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bt_bdaddr_t *bda, int attr_handle,
57803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              int offset, int length,
57903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                              bool need_rsp, bool is_prep, uint8_t* value)
58003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
58103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
58203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
58303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
58403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
58503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
58603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
58703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
58803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
58903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
59003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyteArray val = sCallbackEnv->NewByteArray(length);
59103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val) sCallbackEnv->SetByteArrayRegion(val, 0, length, (jbyte*)value);
59203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAttributeWrite,
59303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, attr_handle,
59403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 offset, length, need_rsp, is_prep, val);
59503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
59603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(val);
59703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
59803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
59903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_request_exec_write_cb(int conn_id, int trans_id,
60103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                   bt_bdaddr_t *bda, int exec_write)
60203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
60303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
60403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
60503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char c_address[32];
60603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sprintf(c_address, "%02X:%02X:%02X:%02X:%02X:%02X",
60703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[0], bda->address[1], bda->address[2],
60803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            bda->address[3], bda->address[4], bda->address[5]);
60903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
61003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstring address = sCallbackEnv->NewStringUTF(c_address);
61103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onExecuteWrite,
61203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 address, conn_id, trans_id, exec_write);
61303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->DeleteLocalRef(address);
61403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
61503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
61603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
61703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battavoid btgatts_response_confirmation_cb(int status, int handle)
61803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
61903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    CHECK_CALLBACK_ENV
62003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onResponseSendCompleted,
62103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 status, handle);
62203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
62303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
62403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
62503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_server_callbacks_t sGattServerCallbacks = {
62603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_register_app_cb,
62703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_connection_cb,
62803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_added_cb,
62903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_included_service_added_cb,
63003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_characteristic_added_cb,
63103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_descriptor_added_cb,
63203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_started_cb,
63303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_stopped_cb,
63403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_service_deleted_cb,
63503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_read_cb,
63603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_write_cb,
63703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_request_exec_write_cb,
63803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatts_response_confirmation_cb
63903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
64003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
64203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * GATT callbacks
64303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
64403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
64503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const btgatt_callbacks_t sGattCallbacks = {
64603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sizeof(btgatt_callbacks_t),
64703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattClientCallbacks,
64803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    &sGattServerCallbacks
64903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
65003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
65203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native function definitions
65303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
65403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void classInitNative(JNIEnv* env, jclass clazz) {
65603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    // Client callbacks
65803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
65903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onClientRegistered = env->GetMethodID(clazz, "onClientRegistered", "(IIJJ)V");
66003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onScanResult = env->GetMethodID(clazz, "onScanResult", "(Ljava/lang/String;I[B)V");
66103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onConnected   = env->GetMethodID(clazz, "onConnected", "(IIILjava/lang/String;)V");
66203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDisconnected = env->GetMethodID(clazz, "onDisconnected", "(IIILjava/lang/String;)V");
66303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadCharacteristic = env->GetMethodID(clazz, "onReadCharacteristic", "(IIIIJJIJJI[B)V");
66403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onWriteCharacteristic = env->GetMethodID(clazz, "onWriteCharacteristic", "(IIIIJJIJJ)V");
66503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteCompleted = env->GetMethodID(clazz, "onExecuteCompleted",  "(II)V");
66603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchCompleted = env->GetMethodID(clazz, "onSearchCompleted",  "(II)V");
66703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onSearchResult = env->GetMethodID(clazz, "onSearchResult", "(IIIJJ)V");
6687f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onReadDescriptor = env->GetMethodID(clazz, "onReadDescriptor", "(IIIIJJIJJIJJI[B)V");
6697f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onWriteDescriptor = env->GetMethodID(clazz, "onWriteDescriptor", "(IIIIJJIJJIJJ)V");
67003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onNotify = env->GetMethodID(clazz, "onNotify", "(ILjava/lang/String;IIJJIJJZ[B)V");
67103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetCharacteristic = env->GetMethodID(clazz, "onGetCharacteristic", "(IIIIJJIJJI)V");
6727f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    method_onGetDescriptor = env->GetMethodID(clazz, "onGetDescriptor", "(IIIIJJIJJIJJ)V");
67303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onGetIncludedService = env->GetMethodID(clazz, "onGetIncludedService", "(IIIIJJIIJJ)V");
67403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onRegisterForNotifications = env->GetMethodID(clazz, "onRegisterForNotifications", "(IIIIIJJIJJ)V");
67503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onReadRemoteRssi = env->GetMethodID(clazz, "onReadRemoteRssi", "(ILjava/lang/String;II)V");
676662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    method_onConfigureMTU = env->GetMethodID(clazz, "onConfigureMTU", "(III)V");
67703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
67803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     // Server callbacks
67903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
68003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServerRegistered = env->GetMethodID(clazz, "onServerRegistered", "(IIJJ)V");
681dbaf9cd41555de7e6101f368ac348bbeb2094809Andre Eisenbach    method_onClientConnected = env->GetMethodID(clazz, "onClientConnected", "(Ljava/lang/String;ZII)V");
68203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceAdded = env->GetMethodID(clazz, "onServiceAdded", "(IIIIJJI)V");
68303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onIncludedServiceAdded = env->GetMethodID(clazz, "onIncludedServiceAdded", "(IIII)V");
68403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onCharacteristicAdded  = env->GetMethodID(clazz, "onCharacteristicAdded", "(IIJJII)V");
68503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onDescriptorAdded = env->GetMethodID(clazz, "onDescriptorAdded", "(IIJJII)V");
68603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStarted = env->GetMethodID(clazz, "onServiceStarted", "(III)V");
68703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceStopped = env->GetMethodID(clazz, "onServiceStopped", "(III)V");
68803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onServiceDeleted = env->GetMethodID(clazz, "onServiceDeleted", "(III)V");
68903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onResponseSendCompleted = env->GetMethodID(clazz, "onResponseSendCompleted", "(II)V");
69003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeRead= env->GetMethodID(clazz, "onAttributeRead", "(Ljava/lang/String;IIIIZ)V");
69103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onAttributeWrite= env->GetMethodID(clazz, "onAttributeWrite", "(Ljava/lang/String;IIIIIZZ[B)V");
69203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    method_onExecuteWrite= env->GetMethodID(clazz, "onExecuteWrite", "(Ljava/lang/String;III)V");
69324dce60783d85fbf49f550203a383b2f4a171a52Wei Wang    method_onAdvertiseCallback = env->GetMethodID(clazz, "onAdvertiseCallback", "(II)V");
69403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    info("classInitNative: Success!");
69603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
69703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
69803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic const bt_interface_t* btIf;
69903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void initializeNative(JNIEnv *env, jobject object) {
70103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if(btIf)
70203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
70303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (btIf = getBluetoothInterface()) == NULL) {
70503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Bluetooth module is not loaded");
70603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
70703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
70803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
70903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
71003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT Interface before initializing...");
71103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf->cleanup();
71203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         sGattIf = NULL;
71303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
71403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
71503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
71603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         ALOGW("Cleaning up Bluetooth GATT callback object");
71703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         env->DeleteGlobalRef(mCallbacksObj);
71803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta         mCallbacksObj = NULL;
71903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
72003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (sGattIf = (btgatt_interface_t *)
72203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta          btIf->get_profile_interface(BT_PROFILE_GATT_ID)) == NULL) {
72303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to get Bluetooth GATT Interface");
72403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
72503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
72603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
72703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
72803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if ( (status = sGattIf->init(&sGattCallbacks)) != BT_STATUS_SUCCESS) {
72903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        error("Failed to initialize Bluetooth GATT, status: %d", status);
73003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
73103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return;
73203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
73303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    mCallbacksObj = env->NewGlobalRef(object);
73503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
73603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
73703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void cleanupNative(JNIEnv *env, jobject object) {
73803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_status_t status;
73903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!btIf) return;
74003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (sGattIf != NULL) {
74203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->cleanup();
74303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf = NULL;
74403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
74503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
74603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (mCallbacksObj != NULL) {
74703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->DeleteGlobalRef(mCallbacksObj);
74803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mCallbacksObj = NULL;
74903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
75003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btIf = NULL;
75103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
75203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
75403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native Client functions
75503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
75603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
75703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic int gattClientGetDeviceTypeNative(JNIEnv* env, jobject object, jstring address)
75803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
75903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return 0;
76003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
76103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
76203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return sGattIf->client->get_device_type(&bda);
76303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
76403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
76503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterAppNative(JNIEnv* env, jobject object,
76603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
76703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
76803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
76903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
77103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
77203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->register_client(&uuid);
77303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
77403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
77503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientUnregisterAppNative(JNIEnv* env, jobject object, jint clientIf)
77603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
77703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
77803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->unregister_client(clientIf);
77903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
78003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
781f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadhamstatic void gattClientScanNative(JNIEnv* env, jobject object, jboolean start)
78203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
78303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
784f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham    sGattIf->client->scan(start);
78503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
78603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
78703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientConnectNative(JNIEnv* env, jobject object, jint clientif,
78818591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jstring address, jboolean isDirect, jint transport)
78903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
79003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
79103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
79303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
79418591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->client->connect(clientif, &bda, isDirect, transport);
79503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
79603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
79703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientDisconnectNative(JNIEnv* env, jobject object, jint clientIf,
79803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
79903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
80003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
80103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
80203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
80303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->disconnect(clientIf, &bda, conn_id);
80403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
80503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
80603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRefreshNative(JNIEnv* env, jobject object, jint clientIf,
80703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    jstring address)
80803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
80903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
81003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
81203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
81303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->refresh(clientIf, &bda);
81403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
81503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
81603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientSearchServiceNative(JNIEnv* env, jobject object, jint conn_id,
81703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            jboolean search_all, jlong service_uuid_lsb, jlong service_uuid_msb)
81803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
81903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
82003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
82203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
82303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
82403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
82503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
82603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetCharacteristicNative(JNIEnv* env, jobject object,
82703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
82803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
82903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
83003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
83103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb)
83203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
83303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
83403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
83503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
83603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
83703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
83803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
83903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
84003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8417f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
84203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
84303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
84403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
84503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (char_id_uuid_lsb == 0)
84603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
84703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, 0);
84803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
84903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_characteristic(conn_id, &srvc_id, &char_id);
85003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
85103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
85203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
85303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetDescriptorNative(JNIEnv* env, jobject object,
85403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id,
85503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint  service_id_inst_id,
85603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
85703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
85803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
8597f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
86003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb)
86103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
86203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
86303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
86403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
86503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
86603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
86703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
86803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8697f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
87003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
87103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
87203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8737f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
8747f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
8757f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
87603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
87703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (descr_id_uuid_lsb == 0)
87803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
87903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, 0);
88003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
88103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_descriptor(conn_id, &srvc_id, &char_id, &descr_id);
88203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
88303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
88403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
88503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientGetIncludedServiceNative(JNIEnv* env, jobject object,
88603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint service_type, jint service_id_inst_id,
88703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
88803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint incl_service_id_inst_id, jint incl_service_type,
88903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong incl_service_id_uuid_lsb, jlong incl_service_id_uuid_msb)
89003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
89103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
89203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
89403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
89503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
89603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
89703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
89803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t  incl_srvc_id;
89903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.id.inst_id = (uint8_t) incl_service_id_inst_id;
90003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    incl_srvc_id.is_primary = (incl_service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
90103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(incl_srvc_id.id.uuid.uu, incl_service_id_uuid_msb, incl_service_id_uuid_lsb);
90203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
90303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (incl_service_id_uuid_lsb == 0)
90403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
90503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, 0);
90603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    } else {
90703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->get_included_service(conn_id, &srvc_id, &incl_srvc_id);
90803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
90903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
91003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
91103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadCharacteristicNative(JNIEnv* env, jobject object,
91203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
91303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
91403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
91503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
91603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
91703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
91803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
91903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
92103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
92203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
92303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
92403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9257f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
92603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
92703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
92803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
92903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_characteristic(conn_id, &srvc_id, &char_id, authReq);
93003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
93103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
93203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadDescriptorNative(JNIEnv* env, jobject object,
93303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
93403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
93503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
93603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9377f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
93803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
93903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint authReq)
94003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
94103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
94203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
94303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
94403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
94503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
94603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
94703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9487f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
94903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
95003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
95103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9527f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
9537f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
9547f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
95503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_descriptor(conn_id, &srvc_id, &char_id, &descr_id, authReq);
95703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
95803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
95903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteCharacteristicNative(JNIEnv* env, jobject object,
96003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint  service_id_inst_id,
96103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
96203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  char_id_inst_id,
96303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
96403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
96503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
96603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
96703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
96803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
96903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
97003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
97103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
97203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9737f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
97403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
97503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
97603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
97703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
97803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
97903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
98003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_characteristic(conn_id, &srvc_id, &char_id,
98203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
98303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
98403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
98503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
98603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientExecuteWriteNative(JNIEnv* env, jobject object,
98703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jboolean execute)
98803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
98903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
99003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->execute_write(conn_id, execute ? 1 : 0);
99103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
99203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
99303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientWriteDescriptorNative(JNIEnv* env, jobject object,
99403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint conn_id, jint  service_type, jint service_id_inst_id,
99503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
99603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
99703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
9987f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    jint descr_id_inst_id,
99903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong descr_id_uuid_lsb, jlong descr_id_uuid_msb,
100003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint write_type, jint auth_req, jbyteArray value)
100103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
100203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
100303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1004460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    if (value == NULL) {
1005460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        warn("gattClientWriteDescriptorNative() ignoring NULL array");
1006460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach        return;
1007460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach    }
1008460d53a0dd8fd19947b0382506bd2b3f9da4743bAndre Eisenbach
100903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
101003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
101103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
101203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
101303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10147f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
101503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
101603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
101703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10187f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t descr_id;
10197f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    descr_id.inst_id = (uint8_t) descr_id_inst_id;
10207f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    set_uuid(descr_id.uuid.uu, descr_id_uuid_msb, descr_id_uuid_lsb);
102103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    uint16_t len = (uint16_t) env->GetArrayLength(value);
102303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte *p_value = env->GetByteArrayElements(value, NULL);
102403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (p_value == NULL) return;
102503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
102603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->write_descriptor(conn_id, &srvc_id, &char_id, &descr_id,
102703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    write_type, len, auth_req, (char*)p_value);
102803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(value, p_value, 0);
102903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
103003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
103103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientRegisterForNotificationsNative(JNIEnv* env, jobject object,
103203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint clientIf, jstring address,
103303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint  service_type, jint service_id_inst_id,
103403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
103503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jint char_id_inst_id,
103603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jlong char_id_uuid_lsb, jlong char_id_uuid_msb,
103703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jboolean enable)
103803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
103903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
104003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
104103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
104203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
104303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
104403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
104503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10467f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    btgatt_gatt_id_t char_id;
104703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    char_id.inst_id = (uint8_t) char_id_inst_id;
104803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(char_id.uuid.uu, char_id_uuid_msb, char_id_uuid_lsb);
104903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
105103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
105203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
105303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
105403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (enable)
105503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->register_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
105603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    else
105703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        sGattIf->client->deregister_for_notification(clientIf, &bd_addr, &srvc_id, &char_id);
105803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
105903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattClientReadRemoteRssiNative(JNIEnv* env, jobject object, jint clientif,
106103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                 jstring address)
106203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
106303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
106403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
106603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
106703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
106803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->read_remote_rssi(clientif, &bda);
106903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
107003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1071873b8064cca4d0f32808842a39e54e305dd5b410Wei Wangstatic void gattAdvertiseNative(JNIEnv *env, jobject object,
107297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach        jint client_if, jboolean start)
107397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
107497d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
107597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->listen(client_if, start);
107697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
107797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
107897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbachstatic void gattSetAdvDataNative(JNIEnv *env, jobject object, jint client_if, jboolean setScanRsp,
1079873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jboolean inclName, jboolean inclTxPower, jint minInterval, jint maxInterval,
1080873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jint appearance, jbyteArray manufacturerData, jbyteArray serviceData,
1081873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        jbyteArray serviceUuid)
108297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach{
108397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    if (!sGattIf) return;
1084873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* arr_data = env->GetByteArrayElements(manufacturerData, NULL);
108597d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    uint16_t arr_len = (uint16_t) env->GetArrayLength(manufacturerData);
108697d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
1087873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_data = env->GetByteArrayElements(serviceData, NULL);
1088873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_data_len = (uint16_t) env->GetArrayLength(serviceData);
1089873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
1090873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    jbyte* service_uuid = env->GetByteArrayElements(serviceUuid, NULL);
1091873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    uint16_t service_uuid_len = (uint16_t) env->GetArrayLength(serviceUuid);
1092873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang
109397d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    sGattIf->client->set_adv_data(client_if, setScanRsp, inclName, inclTxPower,
1094873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        minInterval, maxInterval, appearance, arr_len, (char*)arr_data,
1095873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        service_data_len, (char*)service_data, service_uuid_len,
1096873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang        (char*)service_uuid);
109797d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
109897d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach    env->ReleaseByteArrayElements(manufacturerData, arr_data, JNI_ABORT);
1099873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceData, service_data, JNI_ABORT);
1100873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    env->ReleaseByteArrayElements(serviceUuid, service_uuid, JNI_ABORT);
110197d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach}
110297d5a00d3d588f89b36be801461455a2ab625907Andre Eisenbach
110353f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadhamstatic void gattSetScanParametersNative(JNIEnv* env, jobject object,
110453f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham                                        jint scan_interval, jint scan_window)
110553f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham{
110653f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    if (!sGattIf) return;
110753f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    sGattIf->client->set_scan_parameters(scan_interval, scan_window);
110853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham}
110903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1110662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbachstatic void gattClientConfigureMTUNative(JNIEnv *env, jobject object,
1111662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach        jint conn_id, jint mtu)
1112662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach{
1113662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    if (!sGattIf) return;
1114662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    sGattIf->client->configure_mtu(conn_id, mtu);
1115662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach}
1116662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach
111703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
111803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Native server functions
111903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
112003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerRegisterAppNative(JNIEnv* env, jobject object,
112103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        jlong app_uuid_lsb, jlong app_uuid_msb )
112203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
112303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
112403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
112503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, app_uuid_msb, app_uuid_lsb);
112603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->register_server(&uuid);
112703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
112803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
112903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerUnregisterAppNative(JNIEnv* env, jobject object, jint serverIf)
113003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
113103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
113203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->unregister_server(serverIf);
113303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
113403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
113503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerConnectNative(JNIEnv *env, jobject object,
113618591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta                                 jint server_if, jstring address, jboolean is_direct, jint transport)
113703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
113803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
113903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bd_addr;
114103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    const char *c_address = env->GetStringUTFChars(address, NULL);
114203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bd_addr_str_to_addr(c_address, bd_addr.address);
114303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114418591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    sGattIf->server->connect(server_if, &bd_addr, is_direct, transport);
114503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
114603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
114703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDisconnectNative(JNIEnv* env, jobject object, jint serverIf,
114803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                  jstring address, jint conn_id)
114903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
115003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
115103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bda;
115203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bda, address);
115303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->disconnect(serverIf, &bda, conn_id);
115403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
115503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
115603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddServiceNative (JNIEnv *env, jobject object,
115703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint service_type, jint service_id_inst_id,
115803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong service_id_uuid_lsb, jlong service_id_uuid_msb,
115903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint num_handles)
116003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
116103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
116203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_srvc_id_t srvc_id;
116403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.id.inst_id = (uint8_t) service_id_inst_id;
116503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    srvc_id.is_primary = (service_type == BTGATT_SERVICE_TYPE_PRIMARY ? 1 : 0);
116603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(srvc_id.id.uuid.uu, service_id_uuid_msb, service_id_uuid_lsb);
116703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
116803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_service(server_if, &srvc_id, num_handles);
116903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
117003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddIncludedServiceNative (JNIEnv *env, jobject object,
117203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint included_svc_handle)
117303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
117403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
117503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_included_service(server_if, svc_handle,
117603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                          included_svc_handle);
117703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
117803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
117903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddCharacteristicNative (JNIEnv *env, jobject object,
118003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
118103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong char_uuid_lsb, jlong char_uuid_msb,
118203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint properties, jint permissions)
118303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
118403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
118503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
118603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
118703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, char_uuid_msb, char_uuid_lsb);
118803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
118903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_characteristic(server_if, svc_handle,
119003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                        &uuid, properties, permissions);
119103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
119203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
119303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerAddDescriptorNative (JNIEnv *env, jobject object,
119403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle,
119503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jlong desc_uuid_lsb, jlong desc_uuid_msb,
119603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint permissions)
119703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
119803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
119903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid;
120103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid.uu, desc_uuid_msb, desc_uuid_lsb);
120203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->add_descriptor(server_if, svc_handle, &uuid, permissions);
120403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
120503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
120603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStartServiceNative (JNIEnv *env, jobject object,
120703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint svc_handle, jint transport )
120803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
120903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
121003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->start_service(server_if, svc_handle, transport);
121103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
121203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
121303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerStopServiceNative (JNIEnv *env, jobject object,
121403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                         jint server_if, jint svc_handle)
121503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
121603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
121703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->stop_service(server_if, svc_handle);
121803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
121903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerDeleteServiceNative (JNIEnv *env, jobject object,
122103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                           jint server_if, jint svc_handle)
122203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
122303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
122403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->delete_service(server_if, svc_handle);
122503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
122603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
122703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendIndicationNative (JNIEnv *env, jobject object,
122803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
122903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
123003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
123103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
123303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
123403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
123503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
123603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 1, (char*)array);
123703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
123803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
123903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendNotificationNative (JNIEnv *env, jobject object,
124103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint attr_handle, jint conn_id, jbyteArray val)
124203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
124303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
124403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jbyte* array = env->GetByteArrayElements(val, 0);
124603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int val_len = env->GetArrayLength(val);
124703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
124803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_indication(server_if, attr_handle, conn_id, val_len,
124903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                     /*confirm*/ 0, (char*)array);
125003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    env->ReleaseByteArrayElements(val, array, JNI_ABORT);
125103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
125203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
125303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattServerSendResponseNative (JNIEnv *env, jobject object,
125403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint server_if, jint conn_id, jint trans_id, jint status,
125503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jint handle, jint offset, jbyteArray val, jint auth_req)
125603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
125703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
125803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
125903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_response_t response;
126003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.handle = handle;
126203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.auth_req = auth_req;
126303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.offset = offset;
126403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    response.attr_value.len = 0;
126503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
126603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (val != NULL)
126703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {
126803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        response.attr_value.len = (uint16_t) env->GetArrayLength(val);
126903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        jbyte* array = env->GetByteArrayElements(val, 0);
127003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (int i = 0; i != response.attr_value.len; ++i)
127203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            response.attr_value.value[i] = (uint8_t) array[i];
127303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        env->ReleaseByteArrayElements(val, array, JNI_ABORT);
127403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
127503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->server->send_response(conn_id, trans_id, status, &response);
127703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
127803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
127903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void gattTestNative(JNIEnv *env, jobject object, jint command,
128003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jlong uuid1_lsb, jlong uuid1_msb, jstring bda1,
128103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                           jint p1, jint p2, jint p3, jint p4, jint p5 )
128203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
128303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    if (!sGattIf) return;
128403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_bdaddr_t bt_bda1;
128603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    jstr2bdaddr(env, &bt_bda1, bda1);
128703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
128803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    bt_uuid_t uuid1;
128903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    set_uuid(uuid1.uu, uuid1_msb, uuid1_lsb);
129003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
129103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    btgatt_test_params_t params;
129203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.bda1 = &bt_bda1;
129303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.uuid1 = &uuid1;
129403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u1 = p1;
129503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u2 = p2;
129603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u3 = p3;
129703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u4 = p4;
129803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    params.u5 = p5;
129903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    sGattIf->client->test_command(command, &params);
130003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
130103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
130203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/**
130303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * JNI function definitinos
130403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
130503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
130603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic JNINativeMethod sMethods[] = {
130703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"classInitNative", "()V", (void *) classInitNative},
130803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"initializeNative", "()V", (void *) initializeNative},
130903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"cleanupNative", "()V", (void *) cleanupNative},
131003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
131103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetDeviceTypeNative", "(Ljava/lang/String;)I", (void *) gattClientGetDeviceTypeNative},
131203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterAppNative", "(JJ)V", (void *) gattClientRegisterAppNative},
131303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientUnregisterAppNative", "(I)V", (void *) gattClientUnregisterAppNative},
1314f745ace608784e226a78170bf5a24fe114f1026fPrerepa Viswanadham    {"gattClientScanNative", "(Z)V", (void *) gattClientScanNative},
131518591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattClientConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattClientConnectNative},
131603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattClientDisconnectNative},
131703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRefreshNative", "(ILjava/lang/String;)V", (void *) gattClientRefreshNative},
131803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientSearchServiceNative", "(IZJJ)V", (void *) gattClientSearchServiceNative},
131903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetCharacteristicNative", "(IIIJJIJJ)V", (void *) gattClientGetCharacteristicNative},
13207f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientGetDescriptorNative", "(IIIJJIJJIJJ)V", (void *) gattClientGetDescriptorNative},
132103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientGetIncludedServiceNative", "(IIIJJIIJJ)V", (void *) gattClientGetIncludedServiceNative},
132203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadCharacteristicNative", "(IIIJJIJJI)V", (void *) gattClientReadCharacteristicNative},
13237f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientReadDescriptorNative", "(IIIJJIJJIJJI)V", (void *) gattClientReadDescriptorNative},
132403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientWriteCharacteristicNative", "(IIIJJIJJII[B)V", (void *) gattClientWriteCharacteristicNative},
13257f9efa4413d64569cd8a25ef2262778505059d80Andre Eisenbach    {"gattClientWriteDescriptorNative", "(IIIJJIJJIJJII[B)V", (void *) gattClientWriteDescriptorNative},
132603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientExecuteWriteNative", "(IZ)V", (void *) gattClientExecuteWriteNative},
132703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientRegisterForNotificationsNative", "(ILjava/lang/String;IIJJIJJZ)V", (void *) gattClientRegisterForNotificationsNative},
132803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattClientReadRemoteRssiNative", "(ILjava/lang/String;)V", (void *) gattClientReadRemoteRssiNative},
1329873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattAdvertiseNative", "(IZ)V", (void *) gattAdvertiseNative},
1330662758761424473da90573de5fed1b686ce9ba0eAndre Eisenbach    {"gattClientConfigureMTUNative", "(II)V", (void *) gattClientConfigureMTUNative},
133103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
133203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerRegisterAppNative", "(JJ)V", (void *) gattServerRegisterAppNative},
133303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerUnregisterAppNative", "(I)V", (void *) gattServerUnregisterAppNative},
133418591a7894c5e4516491438c2e758adf8d2ade90Ganesh Ganapathi Batta    {"gattServerConnectNative", "(ILjava/lang/String;ZI)V", (void *) gattServerConnectNative},
133503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDisconnectNative", "(ILjava/lang/String;I)V", (void *) gattServerDisconnectNative},
133603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddServiceNative", "(IIIJJI)V", (void *) gattServerAddServiceNative},
133703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddIncludedServiceNative", "(III)V", (void *) gattServerAddIncludedServiceNative},
133803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddCharacteristicNative", "(IIJJII)V", (void *) gattServerAddCharacteristicNative},
133903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerAddDescriptorNative", "(IIJJI)V", (void *) gattServerAddDescriptorNative},
134003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStartServiceNative", "(III)V", (void *) gattServerStartServiceNative},
134103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerStopServiceNative", "(II)V", (void *) gattServerStopServiceNative},
134203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerDeleteServiceNative", "(II)V", (void *) gattServerDeleteServiceNative},
134303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendIndicationNative", "(III[B)V", (void *) gattServerSendIndicationNative},
134403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendNotificationNative", "(III[B)V", (void *) gattServerSendNotificationNative},
134503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    {"gattServerSendResponseNative", "(IIIIII[BI)V", (void *) gattServerSendResponseNative},
134603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1347873b8064cca4d0f32808842a39e54e305dd5b410Wei Wang    {"gattSetAdvDataNative", "(IZZZIII[B[B[B)V", (void *) gattSetAdvDataNative},
134853f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative},
134953f26c079f676b3a72a20de4e30f075057d3777dPrerepa Viswanadham    {"gattTestNative", "(IJJLjava/lang/String;IIIII)V", (void *) gattTestNative},
135003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta};
135103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
135203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaint register_com_android_bluetooth_gatt(JNIEnv* env)
135303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta{
135403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    return jniRegisterNativeMethods(env, "com/android/bluetooth/gatt/GattService",
135503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                                    sMethods, NELEM(sMethods));
135603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
135703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
135803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
1359