diff options
Diffstat (limited to 'bluetooth/bluetootheventhandler.cpp')
-rw-r--r-- | bluetooth/bluetootheventhandler.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/bluetooth/bluetootheventhandler.cpp b/bluetooth/bluetootheventhandler.cpp new file mode 100644 index 0000000..0acd5f5 --- /dev/null +++ b/bluetooth/bluetootheventhandler.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2021 Konsulko Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <QDebug> +#include <bluez-glib.h> + +#include "bluetootheventhandler.h" +#include "bluetooth.h" +#include "bluetoothmodel.h" + + +BluetoothEventHandler::BluetoothEventHandler (Bluetooth *parent, bool register_agent) : + m_parent(parent), + m_agent(register_agent) +{ + bluez_add_adapter_event_callback(adapter_event_cb, this); + bluez_add_device_event_callback(device_event_cb, this); + if (register_agent) + bluez_add_agent_event_callback(agent_event_cb, this); +} + +BluetoothEventHandler::~BluetoothEventHandler() +{ +} + +void BluetoothEventHandler::handle_init_event(gchar *adapter, gboolean status) +{ + if (status) + m_parent->init_adapter_state(QString(adapter)); + else + qCritical() << "BlueZ initialization failed"; +} + +void BluetoothEventHandler::handle_adapter_event(gchar *adapter, + bluez_event_t event, + GVariant *properties) +{ + if (!adapter || event != BLUEZ_EVENT_CHANGE) + return; + + GVariantDict *props_dict = g_variant_dict_new(properties); + if (!props_dict) + return; + + gboolean powered = FALSE; + if (!g_variant_dict_lookup(props_dict, "Powered", "b", &powered)) { + g_variant_dict_unref(props_dict); + return; + } + + g_variant_dict_unref(props_dict); + + m_parent->update_adapter_power(powered); +} + +void BluetoothEventHandler::handle_device_event(gchar *adapter, + gchar *device, + bluez_event_t event, + GVariant *properties) +{ + if (!device) + return; + + BluetoothDevice *model_device = m_parent->m_bluetooth->getDevice(QString(device)); + if (event == BLUEZ_EVENT_REMOVE) { + if(model_device != nullptr) + m_parent->m_bluetooth->removeDevice(model_device); + + return; + } + + BluetoothDevice *new_device = m_parent->m_bluetooth->updateDeviceProperties(model_device, device, properties); + if (new_device == nullptr) { + qCritical() << "Failed to create device object with id: " << QString(device); + return; + } + if (model_device == nullptr && event == BLUEZ_EVENT_ADD) { + // device not previously in model + m_parent->m_bluetooth->addDevice(new_device); + } +} + +void BluetoothEventHandler::handle_agent_event(gchar *device, + bluez_agent_event_t event, + GVariant *properties) +{ + const gchar *path = NULL; + int pincode; + + if (event == BLUEZ_AGENT_EVENT_REQUEST_CONFIRMATION) { + g_variant_get(properties, "(ou)", &path, &pincode); + if (path) + m_parent->request_confirmation(pincode); + } +} + +void BluetoothEventHandler::handle_connect_event(gchar *device, gboolean status) +{ + if (!status) + qDebug() << "connect failed"; +} + +void BluetoothEventHandler::handle_pair_event(gchar *device, gboolean status) +{ + if (!status) + qDebug() << "pairing failed"; +} + |