00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#include <config.h>
00025
#include "dbus-gidl.h"
00026
#include "dbus-gparser.h"
00027
#include "dbus-gutils.h"
00028
#include <locale.h>
00029
#include <libintl.h>
00030
#define _(x) dgettext (GETTEXT_PACKAGE, x)
00031
#define N_(x) x
00032
#include <stdio.h>
00033
#include <stdlib.h>
00034
#include <string.h>
00035
00036
#ifdef DBUS_BUILD_TESTS
00037
static void run_all_tests (
const char *test_data_dir);
00038
#endif
00039
00040
static void
00041 indent (
int depth)
00042 {
00043 depth *= 2;
00044
00045
while (depth > 0)
00046 {
00047 putc (
' ', stdout);
00048 --depth;
00049 }
00050 }
00051
00052
static void pretty_print (BaseInfo *base,
00053
int depth);
00054
00055
static void
00056 pretty_print_list (GSList *list,
00057
int depth)
00058 {
00059 GSList *tmp;
00060
00061 tmp = list;
00062
while (tmp !=
NULL)
00063 {
00064 pretty_print (tmp->data, depth);
00065 tmp = tmp->next;
00066 }
00067 }
00068
00069
static void
00070 pretty_print (BaseInfo *base,
00071
int depth)
00072 {
00073 InfoType t;
00074
const char *name;
00075
00076 t = base_info_get_type (base);
00077 name = base_info_get_name (base);
00078
00079 indent (depth);
00080
00081
switch (t)
00082 {
00083
case INFO_TYPE_NODE:
00084 {
00085 NodeInfo *n = (NodeInfo*) base;
00086
00087
if (name ==
NULL)
00088 printf (_(
"<anonymous node> {\n"));
00089
else
00090 printf (_(
"node \"%s\" {\n"), name);
00091
00092 pretty_print_list (node_info_get_interfaces (n), depth + 1);
00093 pretty_print_list (node_info_get_nodes (n), depth + 1);
00094
00095 indent (depth);
00096 printf (
"}\n");
00097 }
00098
break;
00099
case INFO_TYPE_INTERFACE:
00100 {
00101 InterfaceInfo *i = (InterfaceInfo*) base;
00102
00103 g_assert (name != NULL);
00104
00105 printf (_(
"interface \"%s\" {\n"), name);
00106
00107 pretty_print_list (interface_info_get_methods (i), depth + 1);
00108 pretty_print_list (interface_info_get_signals (i), depth + 1);
00109
00110 indent (depth);
00111 printf (
"}\n");
00112 }
00113
break;
00114
case INFO_TYPE_METHOD:
00115 {
00116 MethodInfo *m = (MethodInfo*) base;
00117
00118 g_assert (name != NULL);
00119
00120 printf (_(
"method \"%s\" (\n"), name);
00121
00122 pretty_print_list (method_info_get_args (m), depth + 1);
00123
00124 indent (depth);
00125 printf (
")\n");
00126 }
00127
break;
00128
case INFO_TYPE_SIGNAL:
00129 {
00130 SignalInfo *s = (SignalInfo*) base;
00131
00132 g_assert (name != NULL);
00133
00134 printf (_(
"signal \"%s\" (\n"), name);
00135
00136 pretty_print_list (signal_info_get_args (s), depth + 1);
00137
00138 indent (depth);
00139 printf (
")\n");
00140 }
00141
break;
00142
case INFO_TYPE_ARG:
00143 {
00144 ArgInfo *a = (ArgInfo*) base;
00145
int at = arg_info_get_type (a);
00146 ArgDirection d = arg_info_get_direction (a);
00147
00148 printf (
"%s %s",
00149 d == ARG_IN ?
"in" :
"out",
00150 _dbus_gutils_type_to_string (at));
00151
if (name)
00152 printf (
" %s\n", name);
00153
else
00154 printf (
"\n");
00155 }
00156
break;
00157 }
00158 }
00159
00160
static void
00161 usage (
int ecode)
00162 {
00163 fprintf (stderr,
"dbus-glib-tool [--version] [--help]\n");
00164 exit (ecode);
00165 }
00166
00167
static void
00168 version (
void)
00169 {
00170 printf (
"D-BUS GLib Tool %s\n"
00171
"Copyright (C) 2003, 2004 Red Hat, Inc.\n"
00172
"This is free software; see the source for copying conditions.\n"
00173
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
00174 VERSION);
00175 exit (0);
00176 }
00177
00178
int
00179 main (
int argc,
char **argv)
00180 {
00181
const char *prev_arg;
00182
int i;
00183 GSList *files;
00184 gboolean end_of_args;
00185 GSList *tmp;
00186 gboolean just_pretty_print;
00187
00188 setlocale (LC_ALL,
"");
00189 bindtextdomain (GETTEXT_PACKAGE, DBUS_LOCALEDIR);
00190 bind_textdomain_codeset (GETTEXT_PACKAGE,
"UTF-8");
00191 textdomain (GETTEXT_PACKAGE);
00192
00193 just_pretty_print =
FALSE;
00194 end_of_args =
FALSE;
00195 files =
NULL;
00196 prev_arg =
NULL;
00197 i = 1;
00198
while (i < argc)
00199 {
00200
const char *arg = argv[i];
00201
00202
if (!end_of_args)
00203 {
00204
if (strcmp (arg,
"--help") == 0 ||
00205 strcmp (arg,
"-h") == 0 ||
00206 strcmp (arg,
"-?") == 0)
00207 usage (0);
00208
else if (strcmp (arg,
"--version") == 0)
00209 version ();
00210
#ifdef DBUS_BUILD_TESTS
00211
else if (strcmp (arg,
"--self-test") == 0)
00212 run_all_tests (NULL);
00213
#endif
00214
else if (strcmp (arg,
"--pretty-print") == 0)
00215 just_pretty_print =
TRUE;
00216
else if (arg[0] ==
'-' &&
00217 arg[1] ==
'-' &&
00218 arg[2] ==
'\0')
00219 end_of_args =
TRUE;
00220
else if (arg[0] ==
'-')
00221 {
00222 usage (1);
00223 }
00224
else
00225 {
00226 files = g_slist_prepend (files, (
char*) arg);
00227 }
00228 }
00229
else
00230 files = g_slist_prepend (files, (
char*) arg);
00231
00232 prev_arg = arg;
00233
00234 ++i;
00235 }
00236
00237 files = g_slist_reverse (files);
00238
00239 tmp = files;
00240
while (tmp !=
NULL)
00241 {
00242 NodeInfo *node;
00243 GError *error;
00244
const char *filename;
00245
00246 filename = tmp->data;
00247
00248 error =
NULL;
00249 node = description_load_from_file (filename,
00250 &error);
00251
if (node ==
NULL)
00252 {
00253 g_assert (error != NULL);
00254 fprintf (stderr, _(
"Unable to load \"%s\": %s\n"),
00255 filename, error->message);
00256 g_error_free (error);
00257 exit (1);
00258 }
00259
else if (just_pretty_print)
00260 {
00261 pretty_print ((BaseInfo*) node, 0);
00262 }
00263
else
00264 {
00265
00266
00267
00268
00269
00270
00271
00272 pretty_print ((BaseInfo*) node, 0);
00273 }
00274
00275
if (node)
00276 node_info_unref (node);
00277
00278 tmp = tmp->next;
00279 }
00280
00281
return 0;
00282 }
00283
00284
00285
#ifdef DBUS_BUILD_TESTS
00286
static void
00287 test_die (
const char *failure)
00288 {
00289 fprintf (stderr,
"Unit test failed: %s\n", failure);
00290 exit (1);
00291 }
00292
00298
static gboolean
00299 _dbus_gtool_test (
const char *test_data_dir)
00300 {
00301
00302
return TRUE;
00303 }
00304
00305
static void
00306 run_all_tests (
const char *test_data_dir)
00307 {
00308
if (test_data_dir ==
NULL)
00309 test_data_dir = g_getenv (
"DBUS_TEST_DATA");
00310
00311
if (test_data_dir !=
NULL)
00312 printf (
"Test data in %s\n", test_data_dir);
00313
else
00314 printf (
"No test data!\n");
00315
00316 printf (
"%s: running gtool tests\n",
"dbus-glib-tool");
00317
if (!_dbus_gtool_test (test_data_dir))
00318 test_die (
"gtool");
00319
00320 printf (
"%s: completed successfully\n",
"dbus-glib-tool");
00321 }
00322
00323
#endif