Документация
ОС Аврора 5.1.3

Call.Call1

Ниже приведены фрагменты кода или же цельные файлы, которые реализуют интерфейс ru.auroraos.Call.Call1.

Содержание:

Объявление интерфейса

  1. 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
    
  2. 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);
    }
    

Регистрация интерфейса

  1. 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()]);
    }
    

Удаление интерфейса

  1. 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();
        }
        ...
    }
    

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.