Правильно ли указан код подключения сигнала Ubuntu One DBus?

Я впервые использую DBus, поэтому я не совсем уверен, правильно ли я поступаю. Я пытаюсь подключить сервис Ubuntu One DBus и получить учетные данные для входа в мое приложение, однако слоты, которые я подключил к обратным сигналам DBus, подробно описанным здесь здесь , никогда не запускаются, несмотря на положительный результат возвращается во время соединения.

Прежде чем я начну искать ошибки в деталях, относящихся к этой конкретной услуге, может кто-нибудь сказать мне, будет ли этот код вообще работать, или я здесь что-то не так сделал?

int main()
{
    UbuntuOneDBus *u1Dbus = new UbuntuOneDBus;
    u1Dbus->init()
}

class UbuntuOneDBus : public QObject
{
  Q_OBJECT

  QString busName;
  QString path;
  QString interface;
  QString method;
  QString signature;

  void connectReturnSignals();

private slots:
  void credentialsFound();
  void credentialsNotFound();
  void credentialsError();

public:
  UbuntuOneDBus();

  void init();
};

UbuntuOneDBus::UbuntuOneDBus()
{
  busName = "com.ubuntuone.Credentials";
  path = "/credentials";
  interface = "com.ubuntuone.CredentialsManagement";
  method = "register";
  signature = "a{ss}";

  connectReturnSignals();
}

void UbuntuOneDBus::init()
{
  QDBusMessage message = QDBusMessage::createMethodCall( busName, path, interface, method );
  QDBusConnection::sessionBus().send( message );
}

void UbuntuOneDBus::connectReturnSignals()
{
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsFound", this, SLOT( credentialsFound() ) );
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsNotFound", this, SLOT( credentialsNotFound() ) );
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsError", this, SLOT( credentialsError() ) );
}

void UbuntuOneDBus::credentialsFound()
{
  qDebug() << "Credentials found";
}

void UbuntuOneDBus::credentialsNotFound()
{
  std::cout << "Credentials not found" << std::endl;
}

void UbuntuOneDBus::credentialsError()
{
  std::cout << "Credentials error" << std::endl;
}
0
задан 30 June 2012 в 21:25

2 ответа

Я не совсем уверен, как именно работают слоты в Qt, но, насколько я понимаю, вам все равно нужно определить функцию, чтобы иметь правильную сигнатуру, соответствующую сигнатуре сигналов DBus. Поэтому в случае Credentials Found необходимо получить хеш / карту строковых ключей и значений, предполагая, что QtDBus автоматически преобразует сигнатуру "a {ss}" в правильный тип данных. Я подозреваю, что такие функции слотов также должны принимать любые стандартные аргументы, предоставляемые самим QtDBus.

Я также нашел это краткое руководство от Nokia, которое может быть полезным: http://www.developer.nokia.com/Community/Wiki/QtDbus_quick_tutorial

0
ответ дан 30 June 2012 в 21:25

Аргумент signature метода connect выглядит неправильно. Как ни странно, это должно быть просто "a{ss}".

Это уже означает «массив элементов словаря со строкой в ​​качестве ключа и строкой в ​​качестве значения» , поэтому добавленная часть "(Dict of {String, String})" может быть интерпретирована неправильно. Аналогично, сигнатура для сигнала D-Bus CredentialsNotFound не должна быть "(nothing)", она должна быть просто пустой строкой, подобной "".

Чтобы ознакомиться с другими типами данных, которые предлагает D-Bus, попробуйте следующее учебное пособие: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types

0
ответ дан 30 June 2012 в 21:25

Другие вопросы по тегам:

Похожие вопросы: