• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*- mode: C; c-file-style: "gnu" -*- */
2 /* dbus-print-message.h  Utility function to print out a message
3  *
4  * Copyright (C) 2003 Philip Blundell <philb@gnu.org>
5  * Copyright (C) 2003 Red Hat, Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22 #include "dbus-print-message.h"
23 
24 static const char*
type_to_name(int message_type)25 type_to_name (int message_type)
26 {
27   switch (message_type)
28     {
29     case DBUS_MESSAGE_TYPE_SIGNAL:
30       return "signal";
31     case DBUS_MESSAGE_TYPE_METHOD_CALL:
32       return "method call";
33     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
34       return "method return";
35     case DBUS_MESSAGE_TYPE_ERROR:
36       return "error";
37     default:
38       return "(unknown message type)";
39     }
40 }
41 
42 
43 static void
indent(int depth)44 indent (int depth)
45 {
46   while (depth-- > 0)
47     printf ("   ");
48 }
49 
50 static void
print_iter(DBusMessageIter * iter,dbus_bool_t literal,int depth)51 print_iter (DBusMessageIter *iter, dbus_bool_t literal, int depth)
52 {
53   do
54     {
55       int type = dbus_message_iter_get_arg_type (iter);
56 
57       if (type == DBUS_TYPE_INVALID)
58 	break;
59 
60       indent(depth);
61 
62       switch (type)
63 	{
64 	case DBUS_TYPE_STRING:
65 	  {
66 	    char *val;
67 	    dbus_message_iter_get_basic (iter, &val);
68 	    if (!literal)
69 	      printf ("string \"");
70 	    printf ("%s", val);
71 	    if (!literal)
72 	      printf ("\"\n");
73 	    break;
74 	  }
75 
76 	case DBUS_TYPE_SIGNATURE:
77 	  {
78 	    char *val;
79 	    dbus_message_iter_get_basic (iter, &val);
80 	    if (!literal)
81 	      printf ("signature \"");
82 	    printf ("%s", val);
83 	    if (!literal)
84 	      printf ("\"\n");
85 	    break;
86 	  }
87 
88 	case DBUS_TYPE_OBJECT_PATH:
89 	  {
90 	    char *val;
91 	    dbus_message_iter_get_basic (iter, &val);
92 	    if (!literal)
93 	      printf ("object path \"");
94 	    printf ("%s", val);
95 	    if (!literal)
96 	      printf ("\"\n");
97 	    break;
98 	  }
99 
100 	case DBUS_TYPE_INT16:
101 	  {
102 	    dbus_int16_t val;
103 	    dbus_message_iter_get_basic (iter, &val);
104 	    printf ("int16 %d\n", val);
105 	    break;
106 	  }
107 
108 	case DBUS_TYPE_UINT16:
109 	  {
110 	    dbus_uint16_t val;
111 	    dbus_message_iter_get_basic (iter, &val);
112 	    printf ("uint16 %u\n", val);
113 	    break;
114 	  }
115 
116 	case DBUS_TYPE_INT32:
117 	  {
118 	    dbus_int32_t val;
119 	    dbus_message_iter_get_basic (iter, &val);
120 	    printf ("int32 %d\n", val);
121 	    break;
122 	  }
123 
124 	case DBUS_TYPE_UINT32:
125 	  {
126 	    dbus_uint32_t val;
127 	    dbus_message_iter_get_basic (iter, &val);
128 	    printf ("uint32 %u\n", val);
129 	    break;
130 	  }
131 
132 	case DBUS_TYPE_INT64:
133 	  {
134 	    dbus_int64_t val;
135 	    dbus_message_iter_get_basic (iter, &val);
136 	    printf ("int64 %lld\n", val);
137 	    break;
138 	  }
139 
140 	case DBUS_TYPE_UINT64:
141 	  {
142 	    dbus_uint64_t val;
143 	    dbus_message_iter_get_basic (iter, &val);
144 	    printf ("uint64 %llu\n", val);
145 	    break;
146 	  }
147 
148 	case DBUS_TYPE_DOUBLE:
149 	  {
150 	    double val;
151 	    dbus_message_iter_get_basic (iter, &val);
152 	    printf ("double %g\n", val);
153 	    break;
154 	  }
155 
156 	case DBUS_TYPE_BYTE:
157 	  {
158 	    unsigned char val;
159 	    dbus_message_iter_get_basic (iter, &val);
160 	    printf ("byte %d\n", val);
161 	    break;
162 	  }
163 
164 	case DBUS_TYPE_BOOLEAN:
165 	  {
166 	    dbus_bool_t val;
167 	    dbus_message_iter_get_basic (iter, &val);
168 	    printf ("boolean %s\n", val ? "true" : "false");
169 	    break;
170 	  }
171 
172 	case DBUS_TYPE_VARIANT:
173 	  {
174 	    DBusMessageIter subiter;
175 
176 	    dbus_message_iter_recurse (iter, &subiter);
177 
178 	    printf ("variant ");
179 	    print_iter (&subiter, literal, depth+1);
180 	    break;
181 	  }
182 	case DBUS_TYPE_ARRAY:
183 	  {
184 	    int current_type;
185 	    DBusMessageIter subiter;
186 
187 	    dbus_message_iter_recurse (iter, &subiter);
188 
189 	    printf("array [\n");
190 	    while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
191 	      {
192 		print_iter (&subiter, literal, depth+1);
193 		dbus_message_iter_next (&subiter);
194 		if (dbus_message_iter_get_arg_type (&subiter) != DBUS_TYPE_INVALID)
195 		  printf (",");
196 	      }
197 	    indent(depth);
198 	    printf("]\n");
199 	    break;
200 	  }
201 	case DBUS_TYPE_DICT_ENTRY:
202 	  {
203 	    DBusMessageIter subiter;
204 
205 	    dbus_message_iter_recurse (iter, &subiter);
206 
207 	    printf("dict entry(\n");
208 	    print_iter (&subiter, literal, depth+1);
209 	    dbus_message_iter_next (&subiter);
210 	    print_iter (&subiter, literal, depth+1);
211 	    indent(depth);
212 	    printf(")\n");
213 	    break;
214 	  }
215 
216 	case DBUS_TYPE_STRUCT:
217 	  {
218 	    int current_type;
219 	    DBusMessageIter subiter;
220 
221 	    dbus_message_iter_recurse (iter, &subiter);
222 
223 	    printf("struct {\n");
224 	    while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
225 	      {
226 		print_iter (&subiter, literal, depth+1);
227 		dbus_message_iter_next (&subiter);
228 		if (dbus_message_iter_get_arg_type (&subiter) != DBUS_TYPE_INVALID)
229 		  printf (",");
230 	      }
231 	    indent(depth);
232 	    printf("}\n");
233 	    break;
234 	  }
235 
236 	default:
237 	  printf (" (dbus-monitor too dumb to decipher arg type '%c')\n", type);
238 	  break;
239 	}
240     } while (dbus_message_iter_next (iter));
241 }
242 
243 void
print_message(DBusMessage * message,dbus_bool_t literal)244 print_message (DBusMessage *message, dbus_bool_t literal)
245 {
246   DBusMessageIter iter;
247   const char *sender;
248   const char *destination;
249   int message_type;
250 
251   message_type = dbus_message_get_type (message);
252   sender = dbus_message_get_sender (message);
253   destination = dbus_message_get_destination (message);
254 
255   if (!literal)
256     {
257       printf ("%s sender=%s -> dest=%s",
258 	      type_to_name (message_type),
259 	      sender ? sender : "(null sender)",
260 	      destination ? destination : "(null destination)");
261 
262       switch (message_type)
263 	{
264 	case DBUS_MESSAGE_TYPE_METHOD_CALL:
265 	case DBUS_MESSAGE_TYPE_SIGNAL:
266 	  printf (" path=%s; interface=%s; member=%s\n",
267 		  dbus_message_get_path (message),
268 		  dbus_message_get_interface (message),
269 		  dbus_message_get_member (message));
270 	  break;
271 
272 	case DBUS_MESSAGE_TYPE_METHOD_RETURN:
273 	  printf ("\n");
274 	  break;
275 
276 	case DBUS_MESSAGE_TYPE_ERROR:
277 	  printf (" error_name=%s\n",
278 		  dbus_message_get_error_name (message));
279 	  break;
280 
281 	default:
282 	  printf ("\n");
283 	  break;
284 	}
285     }
286 
287   dbus_message_iter_init (message, &iter);
288   print_iter (&iter, literal, 1);
289   fflush (stdout);
290 
291 }
292 
293