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

Call.Service1

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

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

  1. src/callapidbus/call1dbusobject.h:

    #include <QObject>
    #include <QtDBus/QDBusContext>    // Позволяет методам этого класса отправлять ошибки D-Bus обратно вызывающему клиенту
    #include <QtDBus/QDBusObjectPath> // Специальный тип для корректной передачи путей объектов в D-Bus
    
    class Call1DBusAdaptor;
    class Dtmf1DBusAdaptor;
    
    // Класс Call1DBusObject представляет собой D-Bus объект, управляющий состоянием звонка.
    // Множественное наследование: QObject для интеграции в метаобъектную систему Qt, 
    // QDBusContext для возможности генерации D-Bus ошибок внутри методов.
    class Call1DBusObject : public QObject, public QDBusContext
    {
        Q_OBJECT
    
    public:
        // Перечисление, описывающее конечный автомат (state machine) состояний телефонного вызова
        enum CallStatus {
            Unknown = 0,      // Неизвестное или неинициализированное состояние
            Disconnected,     // Вызов завершен, разорван или не состоялся
            Dialing,          // Идет процесс набора номера
            Ringing,          // Входящий вызов (телефон звонит)
            Rejecting,        // Вызов находится в процессе отклонения
            Accepting,        // Вызов находится в процессе принятия
            Active,           // Активный разговор (соединение установлено)
            Held              // Вызов поставлен на удержание
        };
    ...
    }
    
  2. src/callapidbus/callservice1dbusinterface.cpp:

    #include <QtDBus/QDBusReply>
    #include <QtDBus/QDBusError>
    
    #include <QDebug>
    
    #include "callservice1dbusinterface.h"
    
    // Константы, определяющие целевой системный D-Bus сервис, с которым будет взаимодействовать данный клиент
    static const QString s_callService1DBusService = QStringLiteral("org.nemomobile.voicecall"); // Имя сервиса в шине
    static const QString s_callService1DBusObject = QStringLiteral("/ru/auroraos/call/service");  // Путь к объекту в сервисе
    static const QString s_callService1DBusInterface = QStringLiteral("ru.auroraos.Call.Service1"); // Имя D-Bus интерфейса
    
    /*!
    * Конструктор инициализирует экземпляр QDBusInterface для вызовов DBus-интерфейса.
    * parent — родительский экземпляр QObject.
    */
    CallService1DBusInterface::CallService1DBusInterface(QObject *parent)
        : QObject(parent), m_isInitialized(false) // Изначально флаг инициализации установлен в false
    {
    }
    
    // Геттер для проверки состояния инициализации D-Bus интерфейса внешними классами
    bool CallService1DBusInterface::isInitialized() const
    {
        return m_isInitialized;
    }
    
    /*!
    * Вызывает метод 'RegisterCallManager' DBus-интерфейса.
    * dbusObjectPath — путь DBus-объекта для регистрации в качестве менеджера вызовов.
    */
    void CallService1DBusInterface::registerCallManager(const QString &dbusObjectPath)
    {
        // Упаковываем строку пути в специальный тип QDBusObjectPath, требуемый спецификацией D-Bus для аргументов типа 'o'
        QVariant dbusObjPathVariant = QVariant::fromValue(QDBusObjectPath(dbusObjectPath));
        
        // Выполняем синхронный вызов метода D-Bus. QDBusReply хранит либо успешный результат, либо информацию об ошибке.
        QDBusReply<void> reply = m_dbusInterface->call("RegisterCallManager", dbusObjPathVariant);
        
        // Проверяем, прошел ли вызов успешно (isValid возвращает false при ошибке D-Bus)
        if (!reply.isValid()) {
            // Формируем детальное сообщение об ошибке, включая имя и описание ошибки, полученной от D-Bus
            QString message = QStringLiteral("Не удалось вызвать метод %1.RegisterCallManager(%2): %3, %4")
                                    .arg(s_callService1DBusInterface, dbusObjectPath,
                                        reply.error().name(), reply.error().message());
            qWarning() << message; // Выводим предупреждение в лог
            emit dbusErrorReceived(message); // Уведомляем остальные части приложения о возникшей ошибке
            return;
        }
        
        // Если вызов успешен, логируем это и испускаем сигнал успешной регистрации
        qInfo() << QStringLiteral("%1.RegisterCallManager('%2') успешно вызван")
                        .arg(s_callService1DBusInterface, dbusObjectPath);
        emit callManagerRegistered();
    }
    
    /*!
    * Инициализирует экземпляр класса QDBusInterface, который будет выполнять запросы к
    * DBus-интерфейсу ru.auroraos.Call.Service1.
    */
    void CallService1DBusInterface::initialize()
    {
        // Создаем объект QDBusInterface для взаимодействия с указанным сервисом, путем и интерфейсом.
        // Используется сессионная шина (sessionBus). Умный указатель (reset) обеспечит автоматическое удаление 
        // при уничтожении родительского объекта (this), так как this передан последним аргументом.
        m_dbusInterface.reset(new QDBusInterface(s_callService1DBusService, s_callService1DBusObject,
                                                s_callService1DBusInterface,
                                                QDBusConnection::sessionBus(), this));
        
        // Проверка на случай, если выделение памяти не удалось (маловероятно, но хорошая практика безопасности)
        if (m_dbusInterface == nullptr) {
            QString message =
                    QStringLiteral("DBus-интерфейс %1 не создан").arg(s_callService1DBusService);
            qWarning() << message;
            emit dbusErrorReceived(message);
            return;
        }
        
        // Проверка валидности интерфейса: существует ли реально сервис и объект по указанным адресам в шине D-Bus
        if (!m_dbusInterface->isValid()) {
            // Формируем сообщение об ошибке, извлекая имя и текст последней ошибки из объекта интерфейса
            QString message = QStringLiteral("DBus-интерфейс %1 недоступен")
                                    .arg(s_callService1DBusInterface)
                                    .append("\n")
                                    .append(QStringLiteral("Ошибка: %1 %2")
                                                    .arg(m_dbusInterface->lastError().name(),
                                                        m_dbusInterface->lastError().message()));
            qWarning() << message;
            qWarning() << "Тип ошибки:" << m_dbusInterface->lastError().type(); // Логируем числовой тип ошибки D-Bus для детальной отладки
            emit dbusErrorReceived(message);
            return;
        }
        
        // Если все проверки пройдены, интерфейс считается успешно инициализированным и готовым к использованию
        qInfo() << QStringLiteral("DBus-интерфейс %1 инициализирован").arg(s_callService1DBusInterface);
        m_isInitialized = true;
        emit dbusInterfaceInitialized(); // Уведомляем приложение о готовности к работе
    }
    

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

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