X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdbus-tool.c;h=f24dd71159ec846898b03755c635db7de748f424;hb=8df2cca08a5c06286303b39a34121c7e6925bf15;hp=5780c261b86c8bb76bf61f4079960b147ddb68de;hpb=60e7ae26af2fc31d59e36f8798d383fa9d87db92;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdbus-tool.c b/gio/gdbus-tool.c index 5780c26..f24dd71 100644 --- a/gio/gdbus-tool.c +++ b/gio/gdbus-tool.c @@ -13,23 +13,26 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: David Zeuthen */ #include "config.h" +#include #include +#include +#include #include -#include -#include #include +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + /* ---------------------------------------------------------------------------------------------------- */ G_GNUC_UNUSED static void completion_debug (const gchar *format, ...); @@ -94,6 +97,7 @@ usage (gint *argc, gchar **argv[], gboolean use_stdout) " introspect Introspect a remote object\n" " monitor Monitor a remote object\n" " call Invoke a method on a remote object\n" + " emit Emit a signal\n" "\n" "Use \"%s COMMAND --help\" to get help on each command.\n"), program_name); @@ -150,6 +154,7 @@ print_methods (GDBusConnection *c, "org.freedesktop.DBus.Introspectable", "Introspect", NULL, + G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, 3000, /* 3 secs */ NULL, @@ -160,14 +165,7 @@ print_methods (GDBusConnection *c, g_error_free (error); goto out; } - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)"))) - { - g_printerr (_("Error: Result is type `%s', expected `(s)'\n"), - g_variant_get_type_string (result)); - g_variant_unref (result); - goto out; - } - g_variant_get (result, "(s)", &xml_data); + g_variant_get (result, "(&s)", &xml_data); error = NULL; node = g_dbus_node_info_new_for_xml (xml_data, &error); @@ -212,6 +210,7 @@ print_paths (GDBusConnection *c, "org.freedesktop.DBus.Introspectable", "Introspect", NULL, + G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, 3000, /* 3 secs */ NULL, @@ -222,14 +221,9 @@ print_paths (GDBusConnection *c, g_error_free (error); goto out; } - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)"))) - { - g_printerr (_("Error: Result is type `%s', expected `(s)'\n"), - g_variant_get_type_string (result)); - g_variant_unref (result); - goto out; - } - g_variant_get (result, "(s)", &xml_data); + g_variant_get (result, "(&s)", &xml_data); + + //g_printerr ("xml='%s'", xml_data); error = NULL; node = g_dbus_node_info_new_for_xml (xml_data, &error); @@ -241,9 +235,7 @@ print_paths (GDBusConnection *c, goto out; } - //g_printerr ("xml=`%s'", xml_data); - - //g_printerr ("bar `%s'\n", path); + //g_printerr ("bar '%s'\n", path); if (node->interfaces != NULL) g_print ("%s \n", path); @@ -252,7 +244,7 @@ print_paths (GDBusConnection *c, { gchar *s; - //g_printerr ("foo `%s'\n", node->nodes[n].path); + //g_printerr ("foo '%s'\n", node->nodes[n].path); if (g_strcmp0 (path, "/") == 0) s = g_strdup_printf ("/%s", node->nodes[n]->path); @@ -290,6 +282,7 @@ print_names (GDBusConnection *c, "org.freedesktop.DBus", "ListNames", NULL, + G_VARIANT_TYPE ("(as)"), G_DBUS_CALL_FLAGS_NONE, 3000, /* 3 secs */ NULL, @@ -300,12 +293,6 @@ print_names (GDBusConnection *c, g_error_free (error); goto out; } - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)"))) - { - g_printerr (_("Error: Result is type `%s', expected `(as)'\n"), g_variant_get_type_string (result)); - g_variant_unref (result); - goto out; - } g_variant_get (result, "(as)", &iter); while (g_variant_iter_loop (iter, "s", &str)) g_hash_table_insert (name_set, g_strdup (str), NULL); @@ -319,6 +306,7 @@ print_names (GDBusConnection *c, "org.freedesktop.DBus", "ListActivatableNames", NULL, + G_VARIANT_TYPE ("(as)"), G_DBUS_CALL_FLAGS_NONE, 3000, /* 3 secs */ NULL, @@ -329,12 +317,6 @@ print_names (GDBusConnection *c, g_error_free (error); goto out; } - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(as)"))) - { - g_printerr (_("Error: Result is type `%s', expected `(as)'\n"), g_variant_get_type_string (result)); - g_variant_unref (result); - goto out; - } g_variant_get (result, "(as)", &iter); while (g_variant_iter_loop (iter, "s", &str)) g_hash_table_insert (name_set, g_strdup (str), NULL); @@ -381,7 +363,9 @@ connection_get_group (void) N_("Options specifying the connection endpoint"), NULL, NULL); + g_option_group_set_translation_domain (g, GETTEXT_PACKAGE); g_option_group_add_entries (g, connection_entries); + return g; } @@ -447,8 +431,8 @@ call_helper_get_method_in_signature (GDBusConnection *c, GVariant *result; GDBusNodeInfo *node_info; const gchar *xml_data; - const GDBusInterfaceInfo *interface_info; - const GDBusMethodInfo *method_info; + GDBusInterfaceInfo *interface_info; + GDBusMethodInfo *method_info; guint n; ret = NULL; @@ -461,6 +445,7 @@ call_helper_get_method_in_signature (GDBusConnection *c, "org.freedesktop.DBus.Introspectable", "Introspect", NULL, + G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, 3000, /* 3 secs */ NULL, @@ -468,15 +453,7 @@ call_helper_get_method_in_signature (GDBusConnection *c, if (result == NULL) goto out; - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)"))) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - _("Error: Result is type `%s', expected `(s)'\n"), - g_variant_get_type_string (result)); - goto out; - } - - g_variant_get (result, "(s)", &xml_data); + g_variant_get (result, "(&s)", &xml_data); node_info = g_dbus_node_info_new_for_xml (xml_data, error); if (node_info == NULL) goto out; @@ -485,7 +462,7 @@ call_helper_get_method_in_signature (GDBusConnection *c, if (interface_info == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - _("Warning: According to introspection data, interface `%s' does not exist\n"), + _("Warning: According to introspection data, interface '%s' does not exist\n"), interface_name); goto out; } @@ -494,7 +471,7 @@ call_helper_get_method_in_signature (GDBusConnection *c, if (method_info == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - _("Warning: According to introspection data, method `%s' does not exist on interface `%s'\n"), + _("Warning: According to introspection data, method '%s' does not exist on interface '%s'\n"), method_name, interface_name); goto out; @@ -550,15 +527,219 @@ _g_variant_parse_me_harder (GVariantType *type, /* ---------------------------------------------------------------------------------------------------- */ +static gchar *opt_emit_dest = NULL; +static gchar *opt_emit_object_path = NULL; +static gchar *opt_emit_signal = NULL; + +static const GOptionEntry emit_entries[] = +{ + { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_emit_dest, N_("Optional destination for signal (unique name)"), NULL}, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_emit_object_path, N_("Object path to emit signal on"), NULL}, + { "signal", 's', 0, G_OPTION_ARG_STRING, &opt_emit_signal, N_("Signal and interface name"), NULL}, + { NULL } +}; + +static gboolean +handle_emit (gint *argc, + gchar **argv[], + gboolean request_completion, + const gchar *completion_cur, + const gchar *completion_prev) +{ + gint ret; + GOptionContext *o; + gchar *s; + GError *error; + GDBusConnection *c; + GVariant *parameters; + gchar *interface_name; + gchar *signal_name; + GVariantBuilder builder; + guint n; + + ret = FALSE; + c = NULL; + parameters = NULL; + interface_name = NULL; + signal_name = NULL; + + modify_argv0_for_command (argc, argv, "emit"); + + o = g_option_context_new (NULL); + g_option_context_set_help_enabled (o, FALSE); + g_option_context_set_summary (o, _("Emit a signal.")); + g_option_context_add_main_entries (o, emit_entries, GETTEXT_PACKAGE); + g_option_context_add_group (o, connection_get_group ()); + + if (!g_option_context_parse (o, argc, argv, NULL)) + { + if (!request_completion) + { + s = g_option_context_get_help (o, FALSE, NULL); + g_printerr ("%s", s); + g_free (s); + goto out; + } + } + + error = NULL; + c = connection_get_dbus_connection (&error); + if (c == NULL) + { + if (request_completion) + { + if (g_strcmp0 (completion_prev, "--address") == 0) + { + g_print ("unix:\n" + "tcp:\n" + "nonce-tcp:\n"); + } + else + { + g_print ("--system \n--session \n--address \n"); + } + } + else + { + g_printerr (_("Error connecting: %s\n"), error->message); + g_error_free (error); + } + goto out; + } + + /* All done with completion now */ + if (request_completion) + goto out; + + if (opt_emit_object_path == NULL) + { + g_printerr (_("Error: object path not specified.\n")); + goto out; + } + if (!g_variant_is_object_path (opt_emit_object_path)) + { + g_printerr (_("Error: %s is not a valid object path\n"), opt_emit_object_path); + goto out; + } + + if (opt_emit_signal == NULL) + { + g_printerr (_("Error: signal not specified.\n")); + goto out; + } + + s = strrchr (opt_emit_signal, '.'); + if (s == NULL) + { + g_printerr (_("Error: signal must be the fully-qualified name.\n")); + goto out; + } + signal_name = g_strdup (s + 1); + interface_name = g_strndup (opt_emit_signal, s - opt_emit_signal); + + if (!g_dbus_is_interface_name (interface_name)) + { + g_printerr (_("Error: %s is not a valid interface name\n"), interface_name); + goto out; + } + + if (!g_dbus_is_member_name (signal_name)) + { + g_printerr (_("Error: %s is not a valid member name\n"), signal_name); + goto out; + } + + if (opt_emit_dest != NULL && !g_dbus_is_unique_name (opt_emit_dest)) + { + g_printerr (_("Error: %s is not a valid unique bus name.\n"), opt_emit_dest); + goto out; + } + + /* Read parameters */ + g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); + for (n = 1; n < (guint) *argc; n++) + { + GVariant *value; + + error = NULL; + value = g_variant_parse (NULL, + (*argv)[n], + NULL, + NULL, + &error); + if (value == NULL) + { + gchar *context; + + context = g_variant_parse_error_print_context (error, (*argv)[n]); + g_error_free (error); + error = NULL; + value = _g_variant_parse_me_harder (NULL, (*argv)[n], &error); + if (value == NULL) + { + /* Use the original non-"parse-me-harder" error */ + g_printerr (_("Error parsing parameter %d: %s\n"), + n, + context); + g_error_free (error); + g_free (context); + g_variant_builder_clear (&builder); + goto out; + } + g_free (context); + } + g_variant_builder_add_value (&builder, value); + } + parameters = g_variant_builder_end (&builder); + + if (parameters != NULL) + parameters = g_variant_ref_sink (parameters); + if (!g_dbus_connection_emit_signal (c, + opt_emit_dest, + opt_emit_object_path, + interface_name, + signal_name, + parameters, + &error)) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + + if (!g_dbus_connection_flush_sync (c, NULL, &error)) + { + g_printerr (_("Error flushing connection: %s\n"), error->message); + g_error_free (error); + goto out; + } + + ret = TRUE; + + out: + if (c != NULL) + g_object_unref (c); + if (parameters != NULL) + g_variant_unref (parameters); + g_free (interface_name); + g_free (signal_name); + g_option_context_free (o); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + static gchar *opt_call_dest = NULL; static gchar *opt_call_object_path = NULL; static gchar *opt_call_method = NULL; +static gint opt_call_timeout = -1; static const GOptionEntry call_entries[] = { { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_call_dest, N_("Destination name to invoke method on"), NULL}, { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_call_object_path, N_("Object path to invoke method on"), NULL}, { "method", 'm', 0, G_OPTION_ARG_STRING, &opt_call_method, N_("Method and interface name"), NULL}, + { "timeout", 't', 0, G_OPTION_ARG_INT, &opt_call_timeout, N_("Timeout in seconds"), NULL}, { NULL } }; @@ -598,7 +779,7 @@ handle_call (gint *argc, o = g_option_context_new (NULL); g_option_context_set_help_enabled (o, FALSE); g_option_context_set_summary (o, _("Invoke a method on a remote object.")); - g_option_context_add_main_entries (o, call_entries, NULL /* GETTEXT_PACKAGE*/); + g_option_context_add_main_entries (o, call_entries, GETTEXT_PACKAGE); g_option_context_add_group (o, connection_get_group ()); complete_names = FALSE; @@ -739,7 +920,7 @@ handle_call (gint *argc, s = strrchr (opt_call_method, '.'); if (!request_completion && s == NULL) { - g_printerr (_("Error: Method name `%s' is invalid\n"), opt_call_method); + g_printerr (_("Error: Method name '%s' is invalid\n"), opt_call_method); goto out; } method_name = g_strdup (s + 1); @@ -796,6 +977,9 @@ handle_call (gint *argc, &error); if (value == NULL) { + gchar *context; + + context = g_variant_parse_error_print_context (error, (*argv)[n]); g_error_free (error); error = NULL; value = _g_variant_parse_me_harder (type, (*argv)[n], &error); @@ -804,22 +988,24 @@ handle_call (gint *argc, if (type != NULL) { s = g_variant_type_dup_string (type); - g_printerr (_("Error parsing parameter %d of type `%s': %s\n"), + g_printerr (_("Error parsing parameter %d of type '%s': %s\n"), n, s, - error->message); + context); g_free (s); } else { g_printerr (_("Error parsing parameter %d: %s\n"), n, - error->message); + context); } g_error_free (error); g_variant_builder_clear (&builder); + g_free (context); goto out; } + g_free (context); } g_variant_builder_add_value (&builder, value); } @@ -833,14 +1019,18 @@ handle_call (gint *argc, interface_name, method_name, parameters, + NULL, G_DBUS_CALL_FLAGS_NONE, - -1, + opt_call_timeout > 0 ? opt_call_timeout * 1000 : opt_call_timeout, NULL, &error); if (result == NULL) { - g_printerr (_("Error: %s\n"), error->message); - g_error_free (error); + if (error) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + } if (in_signature_types != NULL) { GString *s; @@ -852,7 +1042,7 @@ handle_call (gint *argc, g_variant_type_peek_string (type), g_variant_type_get_string_length (type)); } - g_printerr ("(According to introspection data, you need to pass `%s')\n", s->str); + g_printerr ("(According to introspection data, you need to pass '%s')\n", s->str); g_string_free (s, TRUE); } goto out; @@ -881,7 +1071,11 @@ handle_call (gint *argc, /* ---------------------------------------------------------------------------------------------------- */ -/* TODO: dump annotations */ +static gchar *opt_introspect_dest = NULL; +static gchar *opt_introspect_object_path = NULL; +static gboolean opt_introspect_xml = FALSE; +static gboolean opt_introspect_recurse = FALSE; +static gboolean opt_introspect_only_properties = FALSE; static void dump_annotation (const GDBusAnnotationInfo *o, @@ -1047,7 +1241,7 @@ dump_interface (GDBusConnection *c, (GDestroyNotify) g_variant_unref); /* Try to get properties */ - if (c != NULL && name != NULL && object_path != NULL) + if (c != NULL && name != NULL && object_path != NULL && o->properties != NULL) { GVariant *result; result = g_dbus_connection_call_sync (c, @@ -1056,6 +1250,7 @@ dump_interface (GDBusConnection *c, "org.freedesktop.DBus.Properties", "GetAll", g_variant_new ("(s)", o->name), + NULL, G_DBUS_CALL_FLAGS_NONE, 3000, NULL, @@ -1071,14 +1266,14 @@ dump_interface (GDBusConnection *c, &iter); while ((item = g_variant_iter_next_value (iter))) { - const gchar *key; + gchar *key; GVariant *value; g_variant_get (item, "{sv}", &key, &value); - g_hash_table_insert (properties, g_strdup (key), g_variant_ref (value)); + g_hash_table_insert (properties, key, g_variant_ref (value)); } } g_variant_unref (result); @@ -1094,6 +1289,7 @@ dump_interface (GDBusConnection *c, "org.freedesktop.DBus.Properties", "Get", g_variant_new ("(ss)", o->name, o->properties[n]->name), + G_VARIANT_TYPE ("(v)"), G_DBUS_CALL_FLAGS_NONE, 3000, NULL, @@ -1117,13 +1313,13 @@ dump_interface (GDBusConnection *c, dump_annotation (o->annotations[n], indent, FALSE); g_print ("%*sinterface %s {\n", indent, "", o->name); - if (o->methods != NULL) + if (o->methods != NULL && !opt_introspect_only_properties) { g_print ("%*s methods:\n", indent, ""); for (n = 0; o->methods[n] != NULL; n++) dump_method (o->methods[n], indent + 4); } - if (o->signals != NULL) + if (o->signals != NULL && !opt_introspect_only_properties) { g_print ("%*s signals:\n", indent, ""); for (n = 0; o->signals[n] != NULL; n++) @@ -1145,12 +1341,18 @@ dump_interface (GDBusConnection *c, g_hash_table_unref (properties); } +static gboolean +introspect_do (GDBusConnection *c, + const gchar *object_path, + guint indent); + static void dump_node (GDBusConnection *c, const gchar *name, const GDBusNodeInfo *o, guint indent, - const gchar *object_path) + const gchar *object_path, + gboolean recurse) { guint n; const gchar *object_path_to_print; @@ -1167,9 +1369,51 @@ dump_node (GDBusConnection *c, { g_print (" {\n"); for (n = 0; o->interfaces != NULL && o->interfaces[n] != NULL; n++) - dump_interface (c, name, o->interfaces[n], indent + 2, object_path); + { + if (opt_introspect_only_properties) + { + if (o->interfaces[n]->properties != NULL && o->interfaces[n]->properties[0] != NULL) + dump_interface (c, name, o->interfaces[n], indent + 2, object_path); + } + else + { + dump_interface (c, name, o->interfaces[n], indent + 2, object_path); + } + } for (n = 0; o->nodes != NULL && o->nodes[n] != NULL; n++) - dump_node (NULL, NULL, o->nodes[n], indent + 2, NULL); + { + if (recurse) + { + gchar *child_path; + if (g_variant_is_object_path (o->nodes[n]->path)) + { + child_path = g_strdup (o->nodes[n]->path); + /* avoid infinite loops */ + if (g_str_has_prefix (child_path, object_path)) + { + introspect_do (c, child_path, indent + 2); + } + else + { + g_print ("Skipping path %s that is not enclosed by parent %s\n", + child_path, object_path); + } + } + else + { + if (g_strcmp0 (object_path, "/") == 0) + child_path = g_strdup_printf ("/%s", o->nodes[n]->path); + else + child_path = g_strdup_printf ("%s/%s", object_path, o->nodes[n]->path); + introspect_do (c, child_path, indent + 2); + } + g_free (child_path); + } + else + { + dump_node (NULL, NULL, o->nodes[n], indent + 2, NULL, recurse); + } + } g_print ("%*s};\n", indent, ""); } @@ -1179,17 +1423,80 @@ dump_node (GDBusConnection *c, } } -static gchar *opt_introspect_dest = NULL; -static gchar *opt_introspect_object_path = NULL; - static const GOptionEntry introspect_entries[] = { { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_introspect_dest, N_("Destination name to introspect"), NULL}, { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_introspect_object_path, N_("Object path to introspect"), NULL}, + { "xml", 'x', 0, G_OPTION_ARG_NONE, &opt_introspect_xml, N_("Print XML"), NULL}, + { "recurse", 'r', 0, G_OPTION_ARG_NONE, &opt_introspect_recurse, N_("Introspect children"), NULL}, + { "only-properties", 'p', 0, G_OPTION_ARG_NONE, &opt_introspect_only_properties, N_("Only print properties"), NULL}, { NULL } }; static gboolean +introspect_do (GDBusConnection *c, + const gchar *object_path, + guint indent) +{ + GError *error; + GVariant *result; + GDBusNodeInfo *node; + gboolean ret; + const gchar *xml_data; + + ret = FALSE; + node = NULL; + result = NULL; + + error = NULL; + result = g_dbus_connection_call_sync (c, + opt_introspect_dest, + object_path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 sec */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(&s)", &xml_data); + + if (opt_introspect_xml) + { + g_print ("%s", xml_data); + } + else + { + error = NULL; + node = g_dbus_node_info_new_for_xml (xml_data, &error); + if (node == NULL) + { + g_printerr (_("Error parsing introspection XML: %s\n"), error->message); + g_error_free (error); + goto out; + } + + dump_node (c, opt_introspect_dest, node, indent, object_path, opt_introspect_recurse); + } + + ret = TRUE; + + out: + if (node != NULL) + g_dbus_node_info_unref (node); + if (result != NULL) + g_variant_unref (result); + return ret; +} + +static gboolean handle_introspect (gint *argc, gchar **argv[], gboolean request_completion, @@ -1201,16 +1508,11 @@ handle_introspect (gint *argc, gchar *s; GError *error; GDBusConnection *c; - GVariant *result; - const gchar *xml_data; - GDBusNodeInfo *node; gboolean complete_names; gboolean complete_paths; ret = FALSE; c = NULL; - node = NULL; - result = NULL; modify_argv0_for_command (argc, argv, "introspect"); @@ -1219,7 +1521,7 @@ handle_introspect (gint *argc, g_option_context_set_ignore_unknown_options (o, TRUE); g_option_context_set_help_enabled (o, FALSE); g_option_context_set_summary (o, _("Introspect a remote object.")); - g_option_context_add_main_entries (o, introspect_entries, NULL /* GETTEXT_PACKAGE*/); + g_option_context_add_main_entries (o, introspect_entries, GETTEXT_PACKAGE); g_option_context_add_group (o, connection_get_group ()); complete_names = FALSE; @@ -1328,52 +1630,26 @@ handle_introspect (gint *argc, goto out; } - /* All done with completion now */ - if (request_completion) - goto out; - - result = g_dbus_connection_call_sync (c, - opt_introspect_dest, - opt_introspect_object_path, - "org.freedesktop.DBus.Introspectable", - "Introspect", - NULL, - G_DBUS_CALL_FLAGS_NONE, - 3000, /* 3 sec */ - NULL, - &error); - if (result == NULL) + if (request_completion && opt_introspect_object_path != NULL && !opt_introspect_recurse) { - g_printerr (_("Error: %s\n"), error->message); - g_error_free (error); - goto out; + g_print ("--recurse \n"); } - if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(s)"))) - { - g_printerr (_("Error: Result is type `%s', expected `(s)'\n"), - g_variant_get_type_string (result)); - goto out; - } - g_variant_get (result, "(s)", &xml_data); - error = NULL; - node = g_dbus_node_info_new_for_xml (xml_data, &error); - if (node == NULL) + if (request_completion && opt_introspect_object_path != NULL && !opt_introspect_only_properties) { - g_printerr (_("Error parsing introspection XML: %s\n"), error->message); - g_error_free (error); - goto out; + g_print ("--only-properties \n"); } - dump_node (c, opt_introspect_dest, node, 0, opt_introspect_object_path); + /* All done with completion now */ + if (request_completion) + goto out; + + if (!introspect_do (c, opt_introspect_object_path, 0)) + goto out; ret = TRUE; out: - if (node != NULL) - g_dbus_node_info_unref (node); - if (result != NULL) - g_variant_unref (result); if (c != NULL) g_object_unref (c); g_option_context_free (o); @@ -1420,6 +1696,7 @@ monitor_on_name_appeared (GDBusConnection *connection, NULL, /* any member */ opt_monitor_object_path, NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, monitor_signal_cb, NULL, /* user_data */ NULL); /* user_data destroy notify */ @@ -1458,16 +1735,12 @@ handle_monitor (gint *argc, gchar *s; GError *error; GDBusConnection *c; - GVariant *result; - GDBusNodeInfo *node; gboolean complete_names; gboolean complete_paths; GMainLoop *loop; ret = FALSE; c = NULL; - node = NULL; - result = NULL; modify_argv0_for_command (argc, argv, "monitor"); @@ -1476,7 +1749,7 @@ handle_monitor (gint *argc, g_option_context_set_ignore_unknown_options (o, TRUE); g_option_context_set_help_enabled (o, FALSE); g_option_context_set_summary (o, _("Monitor a remote object.")); - g_option_context_add_main_entries (o, monitor_entries, NULL /* GETTEXT_PACKAGE*/); + g_option_context_add_main_entries (o, monitor_entries, GETTEXT_PACKAGE); g_option_context_add_group (o, connection_get_group ()); complete_names = FALSE; @@ -1610,10 +1883,6 @@ handle_monitor (gint *argc, ret = TRUE; out: - if (node != NULL) - g_dbus_node_info_unref (node); - if (result != NULL) - g_variant_unref (result); if (c != NULL) g_object_unref (c); g_option_context_free (o); @@ -1666,13 +1935,29 @@ main (gint argc, gchar *argv[]) gboolean request_completion; gchar *completion_cur; gchar *completion_prev; +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + tmp = _glib_get_locale_dir (); + bindtextdomain (GETTEXT_PACKAGE, tmp); + g_free (tmp); +#else + bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR); +#endif + +#ifdef HAVE_BIND_TEXTDOMAIN_CODESET + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#endif ret = 1; completion_cur = NULL; completion_prev = NULL; - g_type_init (); - if (argc < 2) { usage (&argc, &argv, FALSE); @@ -1698,6 +1983,16 @@ main (gint argc, gchar *argv[]) } goto out; } + else if (g_strcmp0 (command, "emit") == 0) + { + if (handle_emit (&argc, + &argv, + request_completion, + completion_cur, + completion_prev)) + ret = 0; + goto out; + } else if (g_strcmp0 (command, "call") == 0) { if (handle_call (&argc, @@ -1748,7 +2043,7 @@ main (gint argc, gchar *argv[]) completion_debug ("completion_point=%d", completion_point); completion_debug ("----"); completion_debug (" 0123456789012345678901234567890123456789012345678901234567890123456789"); - completion_debug ("`%s'", completion_line); + completion_debug ("'%s'", completion_line); completion_debug (" %*s^", completion_point, ""); completion_debug ("----"); @@ -1782,8 +2077,8 @@ main (gint argc, gchar *argv[]) } } #if 0 - completion_debug (" cur=`%s'", completion_cur); - completion_debug ("prev=`%s'", completion_prev); + completion_debug (" cur='%s'", completion_cur); + completion_debug ("prev='%s'", completion_prev); #endif argc = completion_argc; @@ -1797,13 +2092,13 @@ main (gint argc, gchar *argv[]) { if (request_completion) { - g_print ("help \ncall \nintrospect \nmonitor \n"); + g_print ("help \nemit \ncall \nintrospect \nmonitor \n"); ret = 0; goto out; } else { - g_printerr ("Unknown command `%s'\n", command); + g_printerr ("Unknown command '%s'\n", command); usage (&argc, &argv, FALSE); goto out; }