/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ /* vim: set ts=2 et sw=2 tw=40: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "BluetoothFirmware.h" #include "nsDebug.h" #include "nsError.h" #include namespace mozilla { namespace dom { namespace bluetooth { static struct BluedroidFunctions { bool initialized; bool tried_initialization; BluedroidFunctions() : initialized(false), tried_initialization(false) { } int (* bt_enable)(); int (* bt_disable)(); int (* bt_is_enabled)(); } sBluedroidFunctions; bool EnsureBluetoothInit() { if (sBluedroidFunctions.tried_initialization) { return sBluedroidFunctions.initialized; } sBluedroidFunctions.initialized = false; sBluedroidFunctions.tried_initialization = true; void* handle = dlopen("libbluedroid.so", RTLD_LAZY); if(!handle) { NS_ERROR("Failed to open libbluedroid.so, bluetooth cannot run"); return false; } sBluedroidFunctions.bt_enable = (int (*)())dlsym(handle, "bt_enable"); if(sBluedroidFunctions.bt_enable == NULL) { NS_ERROR("Failed to attach bt_enable function"); return false; } sBluedroidFunctions.bt_disable = (int (*)())dlsym(handle, "bt_disable"); if(sBluedroidFunctions.bt_disable == NULL) { NS_ERROR("Failed to attach bt_disable function"); return false; } sBluedroidFunctions.bt_is_enabled = (int (*)())dlsym(handle, "bt_is_enabled"); if(sBluedroidFunctions.bt_is_enabled == NULL) { NS_ERROR("Failed to attach bt_is_enabled function"); return false; } sBluedroidFunctions.initialized = true; return true; } int IsBluetoothEnabled() { return sBluedroidFunctions.bt_is_enabled(); } int EnableBluetooth() { return sBluedroidFunctions.bt_enable(); } int DisableBluetooth() { return sBluedroidFunctions.bt_disable(); } } } }