1 /* GDBus - GLib D-Bus Library
3 * Copyright (C) 2008-2010 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Author: David Zeuthen <davidz@redhat.com>
28 #include "gdbusutils.h"
34 * @title: D-Bus Utilities
35 * @short_description: Various utilities related to D-Bus.
38 * Various utility routines related to D-Bus.
42 is_valid_bus_name_character (gint c
,
43 gboolean allow_hyphen
)
46 (c
>= '0' && c
<= '9') ||
47 (c
>= 'A' && c
<= 'Z') ||
48 (c
>= 'a' && c
<= 'z') ||
50 (allow_hyphen
&& c
== '-');
54 is_valid_initial_bus_name_character (gint c
,
55 gboolean allow_initial_digit
,
56 gboolean allow_hyphen
)
58 if (allow_initial_digit
)
59 return is_valid_bus_name_character (c
, allow_hyphen
);
62 (c
>= 'A' && c
<= 'Z') ||
63 (c
>= 'a' && c
<= 'z') ||
65 (allow_hyphen
&& c
== '-');
69 is_valid_name (const gchar
*start
,
71 gboolean allow_initial_digit
,
72 gboolean allow_hyphen
)
92 if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s
, allow_initial_digit
, allow_hyphen
)))
96 else if (G_UNLIKELY (!is_valid_bus_name_character (*s
, allow_hyphen
)))
103 if (G_UNLIKELY (!has_dot
))
114 * @string: The string to check.
116 * Checks if @string is a valid D-Bus bus name (either unique or well-known).
118 * Returns: %TRUE if valid, %FALSE otherwise.
123 g_dbus_is_name (const gchar
*string
)
130 g_return_val_if_fail (string
!= NULL
, FALSE
);
134 len
= strlen (string
);
135 if (G_UNLIKELY (len
== 0 || len
> 255))
142 /* handle unique name */
143 if (!is_valid_name (s
+ 1, len
- 1, TRUE
, TRUE
))
148 else if (G_UNLIKELY (*s
== '.'))
150 /* can't start with a . */
153 else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s
, FALSE
, TRUE
)))
156 ret
= is_valid_name (s
+ 1, len
- 1, FALSE
, TRUE
);
163 * g_dbus_is_unique_name:
164 * @string: The string to check.
166 * Checks if @string is a valid D-Bus unique bus name.
168 * Returns: %TRUE if valid, %FALSE otherwise.
173 g_dbus_is_unique_name (const gchar
*string
)
178 g_return_val_if_fail (string
!= NULL
, FALSE
);
182 len
= strlen (string
);
183 if (G_UNLIKELY (len
== 0 || len
> 255))
186 if (G_UNLIKELY (*string
!= ':'))
189 if (G_UNLIKELY (!is_valid_name (string
+ 1, len
- 1, TRUE
, TRUE
)))
199 * g_dbus_is_member_name:
200 * @string: The string to check.
202 * Checks if @string is a valid D-Bus member (e.g. signal or method) name.
204 * Returns: %TRUE if valid, %FALSE otherwise.
209 g_dbus_is_member_name (const gchar
*string
)
215 if (G_UNLIKELY (string
== NULL
))
218 if (G_UNLIKELY (!is_valid_initial_bus_name_character (string
[0], FALSE
, FALSE
)))
221 for (n
= 1; string
[n
] != '\0'; n
++)
223 if (G_UNLIKELY (!is_valid_bus_name_character (string
[n
], FALSE
)))
236 * g_dbus_is_interface_name:
237 * @string: The string to check.
239 * Checks if @string is a valid D-Bus interface name.
241 * Returns: %TRUE if valid, %FALSE otherwise.
246 g_dbus_is_interface_name (const gchar
*string
)
253 g_return_val_if_fail (string
!= NULL
, FALSE
);
257 len
= strlen (string
);
258 if (G_UNLIKELY (len
== 0 || len
> 255))
263 if (G_UNLIKELY (*s
== '.'))
265 /* can't start with a . */
268 else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s
, FALSE
, FALSE
)))
271 ret
= is_valid_name (s
+ 1, len
- 1, FALSE
, FALSE
);
277 /* ---------------------------------------------------------------------------------------------------- */
279 /* TODO: maybe move to glib? if so, it should conform to http://en.wikipedia.org/wiki/Guid and/or
280 * http://tools.ietf.org/html/rfc4122 - specifically it should have hyphens then.
284 * g_dbus_generate_guid:
286 * Generate a D-Bus GUID that can be used with
287 * e.g. g_dbus_connection_new().
289 * See the D-Bus specification regarding what strings are valid D-Bus
290 * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant).
292 * Returns: A valid D-Bus GUID. Free with g_free().
297 g_dbus_generate_guid (void)
305 s
= g_string_new (NULL
);
307 r1
= g_random_int ();
308 r2
= g_random_int ();
309 r3
= g_random_int ();
310 g_get_current_time (&now
);
312 g_string_append_printf (s
, "%08x", r1
);
313 g_string_append_printf (s
, "%08x", r2
);
314 g_string_append_printf (s
, "%08x", r3
);
315 g_string_append_printf (s
, "%08x", (guint32
) now
.tv_sec
);
317 return g_string_free (s
, FALSE
);
322 * @string: The string to check.
324 * Checks if @string is a D-Bus GUID.
326 * See the D-Bus specification regarding what strings are valid D-Bus
327 * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant).
329 * Returns: %TRUE if @string is a guid, %FALSE otherwise.
334 g_dbus_is_guid (const gchar
*string
)
339 g_return_val_if_fail (string
!= NULL
, FALSE
);
343 for (n
= 0; n
< 32; n
++)
345 if (!g_ascii_isxdigit (string
[n
]))
348 if (string
[32] != '\0')
357 /* ---------------------------------------------------------------------------------------------------- */