Este código de conexão do sinal Ubuntu One DBus está correto?

0

Esta é a primeira vez que uso o DBus, então não tenho certeza se estou indo sobre o caminho certo. Estou tentando conectar o serviço Ubuntu One DBus e obter credenciais de login para o meu aplicativo, no entanto os slots que eu conectei ao DBus retornam sinais detalhados aqui nunca parece estar disparando, apesar de um resultado positivo ser retornado durante a conexão.

Antes de começar a procurar por erros nos detalhes relacionados a este serviço específico, alguém poderia me dizer se esse código funcionaria, ou se eu fiz algo errado aqui?

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;
}
    
por Chris Wilson 26.06.2012 / 11:00

2 respostas

2

O argumento signature para o método de conexão parece errado. Engraçado como parece, deve ser apenas "a{ss}" .

Isso já significa "array de itens de dicionário com string como chave e string como valor" , então a parte adicionada "(Dict of {String, String})" pode ser interpretada de maneira errada. Da mesma forma, a assinatura para o sinal CredentialsNotFound D-Bus não deve ser "(nothing)" , deve ser apenas uma string vazia como "" .

Para se familiarizar com os outros tipos de dados que o D-Bus oferece, tente um tutorial como este: link

    
por alecu 26.06.2012 / 15:01
0

Não tenho certeza de como os slots funcionam exatamente no Qt, mas, no meu entender, você ainda precisa definir a função para ter a assinatura correta para corresponder à assinatura dos sinais do DBus. Portanto, no caso de Credentials Found, ele precisa pegar um hash / map de chaves e valores de string, assumindo que o QtDBus converte a assinatura "a {ss}" no tipo de dado correto automaticamente. Eu suspeito que essas funções de slot também precisam aceitar quaisquer argumentos padrão fornecidos pelo próprio QtDBus.

Também encontrei este tutorial rápido da Nokia, que pode ser útil: link

    
por dobey 02.07.2012 / 16:08