Документация
ОС Аврора 5.1.4
Call.Call1
Ниже приведены фрагменты кода или же цельные файлы, которые реализуют интерфейс ru.auroraos.Call.Call1.
Содержание:
Объявление интерфейса
-
src/callapidbus/call1dbusadaptor.h:#include <QtDBus/QDBusAbstractAdaptor> #include <QtDBus/QDBusObjectPath> // Предварительное объявление класса, чтобы избежать циклических зависимостей заголовочных файлов class Call1DBusObject; /*! * Класс Call1DBusAdaptor является DBus-адаптором для DBus-объекта Call1. * Он наследуется от QDBusAbstractAdaptor, что является стандартным способом * экспорта сигналов и слотов C++ объекта в шину D-Bus в Qt. */ class Call1DBusAdaptor : public QDBusAbstractAdaptor { Q_OBJECT // Явное указание имени интерфейса, под которым этот адаптер будет зарегистрирован в D-Bus Q_CLASSINFO("D-Bus Interface", "ru.auroraos.Call.Call1") public: // Конструктор принимает родительский QObject, к которому будет привязан адаптер explicit Call1DBusAdaptor(QObject *parent = nullptr); public slots: // Методы, объявленные как слоты, становятся доступны для вызова клиентами через D-Bus // Метод интерфейса ru.auroraos.Call.Call1: принятие входящего вызова void Accept(); // Метод интерфейса ru.auroraos.Call.Call1: отклонение вызова с указанием причины void Reject(const uint32_t reason); // Метод интерфейса ru.auroraos.Call.Call1: управление режимом удержания (hold) void SetHold(const bool hold); private: // Указатель на реальный объект бизнес-логики. // Адаптер выступает лишь "оберткой" и делегирует вызовы этому объекту. Call1DBusObject *m_call1DBusObject; signals: // Сигналы, объявленные здесь, будут транслироваться в шину D-Bus как события интерфейса // Сигнал интерфейса ru.auroraos.Call.Call1: уведомление клиентов об изменении статуса вызова void StatusChanged(const uint32_t status); }; #endif // CALL1DBUSADAPTOR_H -
src/callapidbus/call1dbusadaptor.cpp:#include <QDebug> #include "call1dbusobject.h" #include "call1dbusadaptor.h" /*! * Конструктор по умолчанию. * parent — родительский экземпляр QObject (в данной архитектуре это Call1DBusObject). */ Call1DBusAdaptor::Call1DBusAdaptor(QObject *parent) // Инициализируем базовый класс адаптера : QDBusAbstractAdaptor(parent), // Безопасно приводим родительский QObject к нашему конкретному типу бизнес-логики m_call1DBusObject(qobject_cast<Call1DBusObject *>(parent)) { } /*! * Принимает входящий вызов с помощью DBus-объекта Call1. * Вызывается удаленным клиентом через D-Bus. */ void Call1DBusAdaptor::Accept() { // Логируем вызов метода с использованием макроса __func__ для получения имени текущей функции qInfo() << QStringLiteral("Call1DBusAdaptor::%1() вызван").arg(__func__); // Делегируем выполнение реальной логики объекту m_call1DBusObject m_call1DBusObject->Accept(); } /*! * Отклоняет текущий вызов по указанной причине с помощью DBus-объекта Call1. * reason — причина отклонения вызова: 0 — Неизвестная, 1 — Пользователем, 2 — Системой. */ void Call1DBusAdaptor::Reject(const uint32_t reason) { // Логируем вызов метода и переданный аргумент reason qInfo() << QStringLiteral("Call1DBusAdaptor::%1(%2) вызван").arg(__func__).arg(reason); // Делегируем выполнение реальной логики объекту m_call1DBusObject m_call1DBusObject->Reject(reason); } /*! * Изменяет статус удержания текущего вызова с помощью DBus-объекта Call1. * hold — true, если вызов должен быть поставлен на удержание, false — если должен быть снят с удержания. */ void Call1DBusAdaptor::SetHold(const bool hold) { // Логируем вызов метода и переданный булевый аргумент hold qInfo() << QStringLiteral("Call1DBusAdaptor::%1(%2) вызван").arg(__func__).arg(hold); // Делегируем выполнение реальной логики объекту m_call1DBusObject m_call1DBusObject->SetHold(hold); }
Регистрация интерфейса
-
src/callapidbus/calldbusmanager.cpp:/*! * Запускает регистрацию DBus-объекта '/ru/auroraos/CallApiDBus/DBus/Call1'. * В конце метод испускает сигнал InterfacesAdded(), что соответствует стандарту * org.freedesktop.DBus.ObjectManager, позволяя клиентам динамически узнавать о новых объектах. * incoming — true, если вызов должен быть входящим, false — если исходящим. */ void CallDbusManager::registerCall1DBusObject(const bool incoming) { // Формируем словарь начальных свойств (properties) для интерфейса Call1 QVariantMap properties = { { "LocalName", "Локальное имя" }, { "LocalHandle", "Локальный дескриптор" }, { "RemoteName", "Удалённое имя" }, { "RemoteHandle", "Удалённый дескриптор" }, { "Incoming", incoming }, { "Holdable", m_holdable }, // Статус устанавливается в зависимости от направления вызова (Ringing для входящего, Dialing для исходящего) { "Status", incoming ? static_cast<uint>(Call1DBusObject::Ringing) : static_cast<uint>(Call1DBusObject::Dialing) } }; // Регистрируем сам D-Bus объект (создаем адаптер и регистрируем его в шине) m_call1DBusObject.registerCall1DBusObject(incoming); // Формируем структуру VariantMapMap (словарь словарей), требуемую стандартом ObjectManager. // Ключ - имя интерфейса, значение - словарь его свойств. VariantMapMap dbusManagedObjects = VariantMapMap{ { "ru.auroraos.Call.Call1", properties } }; // Если поддержка DTMF включена, добавляем пустой словарь свойств для этого дополнительного интерфейса if (m_dtmf1Enabled) { dbusManagedObjects.insert("ru.auroraos.Call.DTMF1", {}); } // Сохраняем информацию об объекте во внутреннем менеджере состояния по его D-Bus пути (objectPath) m_dbusManagedObjects[m_call1DBusObject.objectPath()] = dbusManagedObjects; // Испускаем сигнал, уведомляющий всех слушателей в шине D-Bus о появлении нового объекта и его интерфейсов emit InterfacesAdded(m_call1DBusObject.objectPath(), m_dbusManagedObjects[m_call1DBusObject.objectPath()]); }
Удаление интерфейса
-
src/callapidbus/calldbusmanager.cpp:void CallDbusManager::handleCallStatusChanged(const uint32_t status) { ... // Проверяем, завершился ли вызов (статус "Отключен") if (status == Call1DBusObject::Disconnected) { // Удаляем запись об этом объекте из внутреннего словаря управляемых объектов m_dbusManagedObjects.remove(m_call1DBusObject.objectPath()); // Формируем список имен интерфейсов, которые перестают быть доступными QStringList call1Interfaces = QStringList() << "ru.auroraos.Call.Call1"; if (m_dtmf1Enabled) { call1Interfaces.append("ru.auroraos.Call.DTMF1"); } // Испускаем сигнал InterfacesRemoved, уведомляя клиентов D-Bus об исчезновении этих интерфейсов по данному пути emit InterfacesRemoved(m_call1DBusObject.objectPath(), call1Interfaces); // Выполняем физическую отмену регистрации объекта в шине D-Bus (освобождение ресурсов) m_call1DBusObject.unregisterCall1DBusObject(); } ... }