blob: 8a4b0373f2399c56060b36335ee9a68853d781ce [file] [log] [blame]
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_DBUS_INTERFACE_H__
6#define CHROMEOS_PLATFORM_UPDATE_ENGINE_DBUS_INTERFACE_H__
7
Gilad Arnoldb752fb32014-03-03 12:23:39 -08008// A mockable interface for DBus.
Andrew de los Reyesd57d1472010-10-21 13:34:08 -07009
10#include <dbus/dbus-glib.h>
Andrew de los Reyes000d8952011-03-02 15:21:14 -080011#include <dbus/dbus-glib-lowlevel.h>
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070012
mukesh agrawal88226ff2012-03-19 17:50:06 -070013#ifndef DBUS_TYPE_G_OBJECT_PATH_ARRAY
14#define DBUS_TYPE_G_OBJECT_PATH_ARRAY \
15 (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH))
16#endif
17
18#ifndef DBUS_TYPE_G_STRING_ARRAY
19#define DBUS_TYPE_G_STRING_ARRAY \
20 (dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRING))
21#endif
22
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070023namespace chromeos_update_engine {
24
25class DbusGlibInterface {
26 public:
Gilad Arnoldb752fb32014-03-03 12:23:39 -080027 // Wraps dbus_g_proxy_new_for_name().
28 virtual DBusGProxy* ProxyNewForName(DBusGConnection* connection,
29 const char* name,
30 const char* path,
31 const char* interface) = 0;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070032
Gilad Arnoldb752fb32014-03-03 12:23:39 -080033 // Wraps g_object_unref().
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070034 virtual void ProxyUnref(DBusGProxy* proxy) = 0;
35
Gilad Arnoldb752fb32014-03-03 12:23:39 -080036 // Wraps dbus_g_bus_get().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080037 virtual DBusGConnection* BusGet(DBusBusType type, GError** error) = 0;
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080038
Gilad Arnoldb752fb32014-03-03 12:23:39 -080039 // Wraps dbus_g_proxy_call(). Since this is a variadic function without a
40 // va_list equivalent, we have to list specific wrappers depending on the
41 // number of input and output arguments, based on the required usage. Note,
42 // however, that we do rely on automatic signature overriding to facilitate
43 // different types of input/output arguments.
44 virtual gboolean ProxyCall_0_1(DBusGProxy* proxy,
45 const char* method,
46 GError** error,
47 GHashTable** out1) = 0;
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080048
Gilad Arnoldb752fb32014-03-03 12:23:39 -080049 virtual gboolean ProxyCall_3_0(DBusGProxy* proxy,
50 const char* method,
51 GError** error,
52 const char* in1,
53 const char* in2,
54 const char* in3) = 0;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080055
Gilad Arnoldb752fb32014-03-03 12:23:39 -080056 // Wraps dbus_g_connection_get_connection().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080057 virtual DBusConnection* ConnectionGetConnection(DBusGConnection* gbus) = 0;
58
Gilad Arnoldb752fb32014-03-03 12:23:39 -080059 // Wraps dbus_bus_add_match().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080060 virtual void DbusBusAddMatch(DBusConnection* connection,
61 const char* rule,
62 DBusError* error) = 0;
63
Gilad Arnoldb752fb32014-03-03 12:23:39 -080064 // Wraps dbus_connection_add_filter().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080065 virtual dbus_bool_t DbusConnectionAddFilter(
66 DBusConnection* connection,
67 DBusHandleMessageFunction function,
68 void* user_data,
69 DBusFreeFunction free_data_function) = 0;
Gilad Arnoldb752fb32014-03-03 12:23:39 -080070
71 // Wraps dbus_connection_remove_filter().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080072 virtual void DbusConnectionRemoveFilter(DBusConnection* connection,
73 DBusHandleMessageFunction function,
74 void* user_data) = 0;
Gilad Arnoldb752fb32014-03-03 12:23:39 -080075
76 // Wraps dbus_message_is_signal().
Andrew de los Reyes000d8952011-03-02 15:21:14 -080077 virtual dbus_bool_t DbusMessageIsSignal(DBusMessage* message,
78 const char* interface,
79 const char* signal_name) = 0;
Gilad Arnoldb752fb32014-03-03 12:23:39 -080080
81 // Wraps dbus_message_get_args(). Deploys the same approach for handling
82 // variadic arguments as ProxyCall above.
83 virtual dbus_bool_t DbusMessageGetArgs_3(DBusMessage* message,
84 DBusError* error,
85 char** out1,
86 char** out2,
87 char** out3) = 0;
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070088};
89
Gilad Arnoldb752fb32014-03-03 12:23:39 -080090
Andrew de los Reyesd57d1472010-10-21 13:34:08 -070091class ConcreteDbusGlib : public DbusGlibInterface {
Gilad Arnoldb752fb32014-03-03 12:23:39 -080092 virtual DBusGProxy* ProxyNewForName(DBusGConnection* connection,
93 const char* name,
94 const char* path,
95 const char* interface) {
96 return dbus_g_proxy_new_for_name(connection,
97 name,
98 path,
99 interface);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700100 }
101
102 virtual void ProxyUnref(DBusGProxy* proxy) {
103 g_object_unref(proxy);
104 }
105
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800106 virtual DBusGConnection* BusGet(DBusBusType type, GError** error) {
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700107 return dbus_g_bus_get(type, error);
108 }
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800109
110 virtual gboolean ProxyCall_0_1(DBusGProxy* proxy,
111 const char* method,
112 GError** error,
113 GHashTable** out1) {
114 return dbus_g_proxy_call(proxy, method, error, G_TYPE_INVALID,
115 dbus_g_type_get_map("GHashTable",
116 G_TYPE_STRING,
117 G_TYPE_VALUE),
118 out1, G_TYPE_INVALID);
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700119 }
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800120
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800121 virtual gboolean ProxyCall_3_0(DBusGProxy* proxy,
122 const char* method,
123 GError** error,
124 const char* in1,
125 const char* in2,
126 const char* in3) {
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800127 return dbus_g_proxy_call(
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800128 proxy, method, error,
129 G_TYPE_STRING, in1, G_TYPE_STRING, in2, G_TYPE_STRING, in3,
130 G_TYPE_INVALID, G_TYPE_INVALID);
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800131 }
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800132
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800133 virtual DBusConnection* ConnectionGetConnection(DBusGConnection* gbus) {
134 return dbus_g_connection_get_connection(gbus);
135 }
136
137 virtual void DbusBusAddMatch(DBusConnection* connection,
138 const char* rule,
139 DBusError* error) {
140 dbus_bus_add_match(connection, rule, error);
141 }
142
143 virtual dbus_bool_t DbusConnectionAddFilter(
144 DBusConnection* connection,
145 DBusHandleMessageFunction function,
146 void* user_data,
147 DBusFreeFunction free_data_function) {
148 return dbus_connection_add_filter(connection,
149 function,
150 user_data,
151 free_data_function);
152 }
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800153
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800154 virtual void DbusConnectionRemoveFilter(DBusConnection* connection,
155 DBusHandleMessageFunction function,
156 void* user_data) {
157 dbus_connection_remove_filter(connection, function, user_data);
158 }
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800159
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800160 dbus_bool_t DbusMessageIsSignal(DBusMessage* message,
161 const char* interface,
162 const char* signal_name) {
163 return dbus_message_is_signal(message, interface, signal_name);
164 }
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800165
166 virtual dbus_bool_t DbusMessageGetArgs_3(DBusMessage* message,
167 DBusError* error,
168 char** out1,
169 char** out2,
170 char** out3) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800171 return dbus_message_get_args(message, error,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800172 DBUS_TYPE_STRING, out1,
173 DBUS_TYPE_STRING, out2,
174 DBUS_TYPE_STRING, out3,
175 G_TYPE_INVALID);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800176 }
Andrew de los Reyesd57d1472010-10-21 13:34:08 -0700177};
178
179} // namespace chromeos_update_engine
180
181#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_DBUS_INTERFACE_H__