File: example-proxy.cpp

package info (click to toggle)
gdbuspp 3-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,116 kB
  • sloc: cpp: 9,462; python: 477; sh: 215; makefile: 6
file content (82 lines) | stat: -rw-r--r-- 3,080 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//  GDBus++ - glib2 GDBus C++ wrapper
//
//  SPDX-License-Identifier: AGPL-3.0-only
//
//  Copyright (C)  OpenVPN Inc <sales@openvpn.net>
//  Copyright (C)  David Sommerseth <davids@openvpn.net>
//

/**
 * @file   example-proxy.cpp
 *
 * @brief  Simple example proxy client.
 *         This example code is referenced to from the README.md document.
 *
 *         To compile this program:
 *
 *  $ c++ -std=c++17 $(pkg-config gdbuspp glib-2.0 gio-2.0 gio-unix-2.0 --cflags --libs) -o example-proxy example-proxy.cpp
 *
 */

#include <iostream>
#include <string>

#include <gdbuspp/connection.hpp>
#include <gdbuspp/proxy.hpp>
#include <gdbuspp/glib2/utils.hpp>


int main(int argc, char **argv)
{
    try
    {
        // Get a connection to the Session D-Bus
        auto connection = DBus::Connection::Create(DBus::BusType::SESSION);

        // Setup a client proxy to our example-service
        auto proxy = DBus::Proxy::Client::Create(connection, "net.example.myservice");

        // Prepare an object and interface target we want to access.
        // This consists of a D-Bus object path and the interface scope inside
        // that object
        auto preset = DBus::Proxy::TargetPreset::Create("/example/myobject",
                                                        "net.example.myinterface");

        // Doing a method call; prepare the argument values required for the
        // 'MethodWithArgs'  D-Bus method, which takes two strings.  We use
        // the glib2::Builder APIs for creating the complete "argument package"
        // for the method call
        GVariantBuilder *args_builder = glib2::Builder::Create("(ss)");
        glib2::Builder::Add(args_builder, std::string("My first string"));
        glib2::Builder::Add(args_builder, std::string("My Second String"));
        GVariant *arguments = glib2::Builder::Finish(args_builder);

        // Perform the D-Bus method call
        GVariant *response = proxy->Call(preset, "MethodWithArgs", arguments);

        // Extract the response from the object.  This method returns only a
        // single string.
        auto result = glib2::Value::Extract<std::string>(response, 0);
        g_variant_unref(response);
        std::cout << "Method call result: " << result << std::endl;

        // Retrieve the content of the D-Bus object property, which is a string
        auto my_property = proxy->GetProperty<std::string>(preset, "my_property");
        std::cout << "my_property: " << my_property << std::endl;

        // Change this property to a new string
        std::string new_property_value = "A changed property";
        proxy->SetProperty(preset, "my_property", new_property_value);

        // Retrieve the same property again to show this value did indeed change
        std::cout << "modified property: "
                  << proxy->GetProperty<std::string>(preset, "my_property")
                  << std::endl;
        return 0;
    }
    catch (const DBus::Exception &excp)
    {
        std::cerr << "EXCEPTION CAUGHT: " << excp.what() << std::endl;
        return 2;
    }
}