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
QtWS25 Last Chance

DBus method calls with arguments

Scheduled Pinned Locked Moved General and Desktop
qdbuslinux
2 Posts 1 Posters 6.2k Views
  • 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 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
    1
    • S StMartin81

      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 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

      • Login

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