Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. DBus method calls with arguments
Forum Updated to NodeBB v4.3 + New Features

DBus method calls with arguments

Scheduled Pinned Locked Moved General and Desktop
qdbuslinux
2 Posts 1 Posters 6.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    StMartin81
    wrote on 11 May 2015, 16:24 last edited by
    #1

    Hello,

    I'm trying to replicate the following command using qdbus:

    $ dbus-send --system --type=method_call --print-reply=literal --dest=org.bluez /org/bluez/hci1 org.freedesktop.DBus.Properties.Set string:org.bluez.Adapter1 string:Powered variant:boolean:true
    

    Here are my two attempts which both didn't work:

    #define BLUEZ_DBUS_SERVICE "org.bluez"
    #define BLUEZ_DBUS_PATH "/org/bluez/hci1"
    QDBusConnection bus = QDBusConnection::systemBus();
    if (!bus.isConnected())
    {
        qFatal("Cannot connect to the D-Bus session bus.");
        return;
    }
    QDBusMessage message = QDBusMessage::createMethodCall(BLUEZ_DBUS_SERVICE,
                                                          BLUEZ_DBUS_PATH,
                                                          "org.freedesktop.DBus.Properties",
                                                          "Set");
    QList<QVariant> args;
    args.append("org.bluez.Adapter1");
    args.append("Powered");
    args.append(true);
    message.setArguments(args);
    QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(message);
    reply.waitForFinished();
    

    and this is my second attempt:

    QDBusConnection bus = QDBusConnection::systemBus();
    if (!bus.isConnected())
    {
        qFatal("Cannot connect to the D-Bus session bus.");
        return;
    }
    QDBusInterface dbus_iface(BLUEZ_DBUS_SERVICE,
                              BLUEZ_DBUS_PATH,
                              "org.freedesktop.DBus.Properties",
                              bus);
     dbus_iface.call("Set",
                     QString("org.freedesktop.DBus.Properties"),
                     QString("Powered"),
                     true);
    

    If I try this:

    message = QDBusMessage::createMethodCall(BLUEZ_DBUS_SERVICE,
                                             BLUEZ_DBUS_PATH,
                                             "org.freedesktop.DBus.Properties",
                                             "Get");
    args.append("org.bluez.Adapter1");
    args.append("Powered");
    reply = QDBusConnection::systemBus().asyncCall(message);
    reply.waitForFinished();
    QVariantMap map = reply.value();
    qDebug() << "Return value: " << map.begin().value();
    

    I get the following output:

    Return value:  QVariant(Invalid)
    

    Can anybody tell me what I am doing wrong here?

    Regards
    Martin

    S 1 Reply Last reply 12 May 2015, 13:27
    1
    • S StMartin81
      11 May 2015, 16:24

      Hello,

      I'm trying to replicate the following command using qdbus:

      $ dbus-send --system --type=method_call --print-reply=literal --dest=org.bluez /org/bluez/hci1 org.freedesktop.DBus.Properties.Set string:org.bluez.Adapter1 string:Powered variant:boolean:true
      

      Here are my two attempts which both didn't work:

      #define BLUEZ_DBUS_SERVICE "org.bluez"
      #define BLUEZ_DBUS_PATH "/org/bluez/hci1"
      QDBusConnection bus = QDBusConnection::systemBus();
      if (!bus.isConnected())
      {
          qFatal("Cannot connect to the D-Bus session bus.");
          return;
      }
      QDBusMessage message = QDBusMessage::createMethodCall(BLUEZ_DBUS_SERVICE,
                                                            BLUEZ_DBUS_PATH,
                                                            "org.freedesktop.DBus.Properties",
                                                            "Set");
      QList<QVariant> args;
      args.append("org.bluez.Adapter1");
      args.append("Powered");
      args.append(true);
      message.setArguments(args);
      QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(message);
      reply.waitForFinished();
      

      and this is my second attempt:

      QDBusConnection bus = QDBusConnection::systemBus();
      if (!bus.isConnected())
      {
          qFatal("Cannot connect to the D-Bus session bus.");
          return;
      }
      QDBusInterface dbus_iface(BLUEZ_DBUS_SERVICE,
                                BLUEZ_DBUS_PATH,
                                "org.freedesktop.DBus.Properties",
                                bus);
       dbus_iface.call("Set",
                       QString("org.freedesktop.DBus.Properties"),
                       QString("Powered"),
                       true);
      

      If I try this:

      message = QDBusMessage::createMethodCall(BLUEZ_DBUS_SERVICE,
                                               BLUEZ_DBUS_PATH,
                                               "org.freedesktop.DBus.Properties",
                                               "Get");
      args.append("org.bluez.Adapter1");
      args.append("Powered");
      reply = QDBusConnection::systemBus().asyncCall(message);
      reply.waitForFinished();
      QVariantMap map = reply.value();
      qDebug() << "Return value: " << map.begin().value();
      

      I get the following output:

      Return value:  QVariant(Invalid)
      

      Can anybody tell me what I am doing wrong here?

      Regards
      Martin

      S Offline
      S Offline
      StMartin81
      wrote on 12 May 2015, 13:27 last edited by
      #2

      I got it working. Problem was that instead of bool I had to use QVariant of QDBusVariant type. So the two functions look like this now:

      These are the defines I've used:

      #define BLUEZ_DBUS_SERVICE "org.bluez"
      #define BLUEZ_DBUS_PATH "/org/bluez/hci0"
      #define BLUEZ_DBUS_IF "org.bluez.Adapter1"
      

      And here is the first implementationÖ

      QDBusConnection bus = QDBusConnection::systemBus();
      if (!bus.isConnected())
      {
          qFatal("Cannot connect to the D-Bus session bus.");
          return;
      }
      QDBusMessage message = QDBusMessage::createMethodCall(BLUEZ_DBUS_SERVICE,
                                                            BLUEZ_DBUS_PATH,
                                                            "org.freedesktop.DBus.Properties",
                                                            "Set");
      QList<QVariant> arguments;
      arguments << BLUEZ_DBUS_IF
                << "Powered"
                << QVariant::fromValue(QDBusVariant(true));
      message.setArguments(arguments);
      QDBusPendingReply<QVariantMap> reply = bus.asyncCall(message);
      reply.waitForFinished();
      

      and here is the second possibility to implement the method call:

      QDBusConnection bus = QDBusConnection::systemBus();
      if (!bus.isConnected())
      {
          qFatal("Cannot connect to the D-Bus session bus.");
          return;
      }
      QDBusInterface dbus_iface(BLUEZ_DBUS_SERVICE,
                                BLUEZ_DBUS_PATH,
                                "org.freedesktop.DBus.Properties",
                                bus);
      if ( dbus_iface.isValid() ) {
          QDBusPendingReply<QVariantMap> reply = dbus_iface.asyncCall("Set",
                                                                      BLUEZ_DBUS_IF,
                                                                      "Powered",
                                                                      QVariant::fromValue(QDBusVariant(true)));
          reply.waitForFinished();
          reply.error().message();
      }
      

      In case anybody wants to do the same thing there is also the possibility to set the "Powered" property directly:

      QDBusInterface ifc(
                  BLUEZ_DBUS_SERVICE,
                  BLUEZ_DBUS_PATH,
                  BLUEZ_DBUS_IF,
                  QDBusConnection::systemBus());
      if ( ifc.isValid() ) {
          ifc.setProperty("Powered", true);
      }
      
      1 Reply Last reply
      1

      1/2

      11 May 2015, 16:24

      • Login

      • Login or register to search.
      1 out of 2
      • First post
        1/2
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved