/** * g_dbus_is_member_name: * @string: The string to check. * * Checks if @string is a valid D-Bus member (e.g. signal or method) name. * * Returns: %TRUE if valid, %FALSE otherwise. * * Since: 2.26 */ gboolean g_dbus_is_member_name (const gchar *string) { gboolean ret; guint n; ret = FALSE; if (G_UNLIKELY (string == NULL)) goto out; if (G_UNLIKELY (!is_valid_initial_bus_name_character (string[0], FALSE, FALSE))) goto out; for (n = 1; string[n] != '\0'; n++) { if (G_UNLIKELY (!is_valid_bus_name_character (string[n], FALSE))) { goto out; } } ret = TRUE; out: return ret; }
/** * g_dbus_is_interface_name: * @string: The string to check. * * Checks if @string is a valid D-Bus interface name. * * Returns: %TRUE if valid, %FALSE otherwise. * * Since: 2.26 */ gboolean g_dbus_is_interface_name (const gchar *string) { guint len; gboolean ret; const gchar *s; const gchar *end; g_return_val_if_fail (string != NULL, FALSE); ret = FALSE; len = strlen (string); if (G_UNLIKELY (len == 0 || len > 255)) goto out; s = string; end = s + len; if (G_UNLIKELY (*s == '.')) { /* can't start with a . */ goto out; } else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, FALSE, FALSE))) goto out; ret = is_valid_name (s + 1, len - 1, FALSE, FALSE); out: return ret; }
static gboolean is_valid_name (const gchar *start, guint len, gboolean allow_initial_digit, gboolean allow_hyphen) { gboolean ret; const gchar *s; const gchar *end; gboolean has_dot; ret = FALSE; if (len == 0) goto out; s = start; end = s + len; has_dot = FALSE; while (s != end) { if (*s == '.') { s += 1; if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, allow_initial_digit, allow_hyphen))) goto out; has_dot = TRUE; } else if (G_UNLIKELY (!is_valid_bus_name_character (*s, allow_hyphen))) { goto out; } s += 1; } if (G_UNLIKELY (!has_dot)) goto out; ret = TRUE; out: return ret; }
/** * g_dbus_is_name: * @string: The string to check. * * Checks if @string is a valid D-Bus bus name (either unique or well-known). * * Returns: %TRUE if valid, %FALSE otherwise. * * Since: 2.26 */ gboolean g_dbus_is_name (const gchar *string) { guint len; gboolean ret; const gchar *s; g_return_val_if_fail (string != NULL, FALSE); ret = FALSE; len = strlen (string); if (G_UNLIKELY (len == 0 || len > 255)) goto out; s = string; if (*s == ':') { /* handle unique name */ if (!is_valid_name (s + 1, len - 1, TRUE, TRUE)) goto out; ret = TRUE; goto out; } else if (G_UNLIKELY (*s == '.')) { /* can't start with a . */ goto out; } else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, FALSE, TRUE))) goto out; ret = is_valid_name (s + 1, len - 1, FALSE, TRUE); out: return ret; }