Документация
ОС Аврора 5.1.4
Call.Service1
Ниже приведены фрагменты кода или же цельные файлы, которые реализуют интерфейс ru.auroraos.Call.Service1.
Объявление интерфейса
-
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 // Вызов поставлен на удержание }; ... } -
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(); // Уведомляем приложение о готовности к работе }