Merge lp:~ted/libdbusmenu/lp784890 into lp:libdbusmenu/0.4

Proposed by Ted Gould
Status: Merged
Merged at revision: 305
Proposed branch: lp:~ted/libdbusmenu/lp784890
Merge into: lp:libdbusmenu/0.4
Diff against target: 318 lines (+88/-59)
3 files modified
libdbusmenu-glib/menuitem.c (+7/-12)
libdbusmenu-glib/server.c (+79/-47)
libdbusmenu-gtk/parser.c (+2/-0)
To merge this branch: bzr merge lp:~ted/libdbusmenu/lp784890
Reviewer Review Type Date Requested Status
DBus Menu Team Pending
Review via email: mp+64936@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libdbusmenu-glib/menuitem.c'
2--- libdbusmenu-glib/menuitem.c 2011-04-05 18:58:03 +0000
3+++ libdbusmenu-glib/menuitem.c 2011-06-17 03:55:50 +0000
4@@ -1694,25 +1694,20 @@
5 #endif
6 DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi);
7
8- /* We need to keep a ref to the variant because the signal
9- handler will drop the floating ref and then we'll be up
10- a creek if we don't have our own later. */
11- if (variant != NULL) {
12- g_variant_ref_sink(variant);
13- }
14-
15 gboolean handled = FALSE;
16+ if (variant == NULL) {
17+ variant = g_variant_new_int32(0);
18+ }
19+
20+ g_variant_ref_sink(variant);
21+
22 g_signal_emit(G_OBJECT(mi), signals[EVENT], g_quark_from_string(name), name, variant, timestamp, &handled);
23
24 if (!handled && class->handle_event != NULL) {
25 class->handle_event(mi, name, variant, timestamp);
26 }
27
28- if (variant != NULL) {
29- g_variant_unref(variant);
30- }
31-
32- return;
33+ g_variant_unref(variant);
34 }
35
36 /**
37
38=== modified file 'libdbusmenu-glib/server.c'
39--- libdbusmenu-glib/server.c 2011-04-19 18:53:17 +0000
40+++ libdbusmenu-glib/server.c 2011-06-17 03:55:50 +0000
41@@ -952,11 +952,13 @@
42 }
43 }
44
45+ /* these are going to be standard references in all code paths and must be unrefed */
46 GVariant * megadata[2];
47 gboolean gotsomething = FALSE;
48
49 if (item_init) {
50 megadata[0] = g_variant_builder_end(&itembuilder);
51+ g_variant_ref_sink(megadata[0]);
52 gotsomething = TRUE;
53 } else {
54 GError * error = NULL;
55@@ -970,6 +972,7 @@
56
57 if (removeitem_init) {
58 megadata[1] = g_variant_builder_end(&removeitembuilder);
59+ g_variant_ref_sink(megadata[1]);
60 gotsomething = TRUE;
61 } else {
62 GError * error = NULL;
63@@ -989,11 +992,11 @@
64 "ItemsPropertiesUpdated",
65 g_variant_new_tuple(megadata, 2),
66 NULL);
67- } else {
68- g_variant_unref(megadata[0]);
69- g_variant_unref(megadata[1]);
70 }
71
72+ g_variant_unref(megadata[0]);
73+ g_variant_unref(megadata[1]);
74+
75 /* Clean everything up */
76 prop_array_teardown(priv->prop_array);
77 priv->prop_array = NULL;
78@@ -1194,9 +1197,11 @@
79 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
80
81 /* Input */
82- gint parent = g_variant_get_int32(g_variant_get_child_value(params, 0));
83- gint recurse = g_variant_get_int32(g_variant_get_child_value(params, 1));
84- const gchar ** props = g_variant_get_strv(g_variant_get_child_value(params, 2), NULL);
85+ gint32 parent;
86+ gint32 recurse;
87+ const gchar ** props;
88+
89+ g_variant_get(params, "(ii^a&s)", &parent, &recurse, &props);
90
91 /* Output */
92 guint revision = priv->layout_revision;
93@@ -1209,6 +1214,7 @@
94 items = dbusmenu_menuitem_build_variant(mi, props, recurse);
95 }
96 }
97+ g_free(props);
98
99 /* What happens if we don't have anything? */
100 if (items == NULL) {
101@@ -1255,9 +1261,11 @@
102 "There currently isn't a layout in this server");
103 return;
104 }
105-
106- gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));
107- const gchar * property = g_variant_get_string(g_variant_get_child_value(params, 1), NULL);
108+
109+ gint32 id;
110+ const gchar * property;
111+
112+ g_variant_get(params, "(i&s)", &id, &property);
113
114 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
115
116@@ -1299,7 +1307,8 @@
117 return;
118 }
119
120- gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));
121+ gint32 id;
122+ g_variant_get(params, "(i)", &id);
123
124 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
125
126@@ -1327,28 +1336,43 @@
127 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
128
129 if (priv->root == NULL) {
130+ /* Allow a request for just id 0 when root is null. Return no properties.
131+ So that a request always returns a valid structure no matter the
132+ state of the structure in the server.
133+ */
134 GVariant * idlist = g_variant_get_child_value(params, 0);
135- if (g_variant_n_children(idlist) == 1 && g_variant_get_int32(g_variant_get_child_value(idlist, 0)) == 0) {
136- GVariant * final = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);
137- g_dbus_method_invocation_return_value(invocation, final);
138- return;
139+ if (g_variant_n_children(idlist) == 1) {
140+
141+ GVariant *id_v = g_variant_get_child_value(idlist, 0);
142+ gint32 id = g_variant_get_int32(id_v);
143+ g_variant_unref(id_v);
144+
145+ if (id == 0) {
146+
147+ GVariant * final = g_variant_parse(G_VARIANT_TYPE("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);
148+ g_dbus_method_invocation_return_value(invocation, final);
149+ g_variant_unref(final);
150+ }
151+ } else {
152+
153+ g_dbus_method_invocation_return_error(invocation,
154+ error_quark(),
155+ NO_VALID_LAYOUT,
156+ "There currently isn't a layout in this server");
157 }
158-
159- g_dbus_method_invocation_return_error(invocation,
160- error_quark(),
161- NO_VALID_LAYOUT,
162- "There currently isn't a layout in this server");
163+ g_variant_unref(idlist);
164 return;
165 }
166
167- GVariantIter ids;
168- g_variant_iter_init(&ids, g_variant_get_child_value(params, 0));
169+ GVariantIter *ids;
170+ g_variant_get(params, "(aias)", &ids, NULL);
171+ /* TODO: implementation ignores propertyNames declared in XML */
172
173 GVariantBuilder builder;
174 gboolean builder_init = FALSE;
175
176- gint id;
177- while (g_variant_iter_next(&ids, "i", &id)) {
178+ gint32 id;
179+ while (g_variant_iter_loop(ids, "i", &id)) {
180 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
181 if (mi == NULL) continue;
182
183@@ -1364,7 +1388,7 @@
184
185 if (props == NULL) {
186 GError * error = NULL;
187- props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, &error);
188+ props = g_variant_parse(G_VARIANT_TYPE("a{sv}"), "{}", NULL, NULL, &error);
189 if (error != NULL) {
190 g_warning("Unable to parse '{}' as a 'a{sv}': %s", error->message);
191 g_error_free(error);
192@@ -1377,18 +1401,20 @@
193
194 g_variant_builder_add_value(&builder, mi_data);
195 }
196+ g_variant_iter_free(ids);
197
198+ /* a standard reference that must be unrefed */
199 GVariant * ret = NULL;
200
201 if (builder_init) {
202 ret = g_variant_builder_end(&builder);
203+ g_variant_ref_sink(ret);
204 } else {
205 GError * error = NULL;
206- ret = g_variant_parse(g_variant_type_new("a(ia{sv})"), "[]", NULL, NULL, NULL);
207+ ret = g_variant_parse(G_VARIANT_TYPE("a(ia{sv})"), "[]", NULL, NULL, &error);
208 if (error != NULL) {
209 g_warning("Unable to parse '[]' as a 'a(ia{sv})': %s", error->message);
210 g_error_free(error);
211- ret = NULL;
212 }
213 }
214
215@@ -1396,6 +1422,7 @@
216 if (ret != NULL) {
217 g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
218 g_variant_builder_add_value(&builder, ret);
219+ g_variant_unref(ret);
220 final = g_variant_builder_end(&builder);
221 } else {
222 g_warning("Error building property list, final variant is NULL");
223@@ -1434,7 +1461,8 @@
224 bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation)
225 {
226 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
227- gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));
228+ gint32 id;
229+ g_variant_get(params, "(i)", &id);
230
231 if (priv->root == NULL) {
232 g_dbus_method_invocation_return_error(invocation,
233@@ -1468,7 +1496,7 @@
234 ret = g_variant_new_tuple(&end, 1);
235 } else {
236 GError * error = NULL;
237- ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);
238+ ret = g_variant_parse(G_VARIANT_TYPE("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);
239 if (error != NULL) {
240 g_warning("Unable to parse '([(0, {})],)' as a '(a(ia{sv}))': %s", error->message);
241 g_error_free(error);
242@@ -1520,32 +1548,35 @@
243 return;
244 }
245
246- gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));
247+ gint32 id;
248+ gchar *etype;
249+ GVariant *data;
250+ guint32 ts;
251+
252+ g_variant_get(params, "(isvu)", &id, &etype, &data, &ts);
253+
254 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
255
256 if (mi == NULL) {
257+
258 g_dbus_method_invocation_return_error(invocation,
259 error_quark(),
260 INVALID_MENUITEM_ID,
261 "The ID supplied %d does not refer to a menu item we have",
262 id);
263- return;
264- }
265-
266- idle_event_t * event_data = g_new0(idle_event_t, 1);
267- event_data->mi = mi;
268- g_object_ref(event_data->mi);
269- event_data->eventid = g_strdup(g_variant_get_string(g_variant_get_child_value(params, 1), NULL));
270- event_data->timestamp = g_variant_get_uint32(g_variant_get_child_value(params, 3));
271- event_data->variant = g_variant_get_child_value(params, 2);
272-
273- if (g_variant_is_of_type(event_data->variant, G_VARIANT_TYPE_VARIANT)) {
274- event_data->variant = g_variant_get_variant(event_data->variant);
275- }
276-
277- g_variant_ref_sink(event_data->variant);
278-
279- g_timeout_add(0, event_local_handler, event_data);
280+ g_free(etype);
281+ g_variant_unref(data);
282+
283+ } else {
284+
285+ idle_event_t * event_data = g_new0(idle_event_t, 1);
286+ event_data->mi = g_object_ref(mi);
287+ event_data->eventid = etype;
288+ event_data->timestamp = ts;
289+ event_data->variant = data; /* give away our reference */
290+
291+ g_timeout_add(0, event_local_handler, event_data);
292+ }
293
294 g_dbus_method_invocation_return_value(invocation, NULL);
295 return;
296@@ -1565,7 +1596,8 @@
297 return;
298 }
299
300- gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));
301+ gint32 id;
302+ g_variant_get(params, "(i)", &id);
303 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
304
305 if (mi == NULL) {
306
307=== modified file 'libdbusmenu-gtk/parser.c'
308--- libdbusmenu-gtk/parser.c 2011-05-18 18:19:49 +0000
309+++ libdbusmenu-gtk/parser.c 2011-06-17 03:55:50 +0000
310@@ -880,6 +880,8 @@
311 g_idle_add ((GSourceFunc)recreate_menu_item_in_idle_cb, child);
312 }
313 }
314+
315+ g_value_unset (&prop_value);
316 }
317
318 static void

Subscribers

People subscribed via source and target branches

to all changes: