dbus-print-message.c revision 1e14e409a48a96e0599c8f675604735ca132fc0f
1/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 * 21 */ 22#include "dbus-print-message.h" 23 24static const char* 25type_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 43static void 44indent (int depth) 45{ 46 while (depth-- > 0) 47 printf (" "); 48} 49 50static void 51print_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 current_type = dbus_message_iter_get_arg_type (&subiter); 190 191 printf("array [\n"); 192 while (current_type != DBUS_TYPE_INVALID) 193 { 194 print_iter (&subiter, literal, depth+1); 195 196 dbus_message_iter_next (&subiter); 197 current_type = dbus_message_iter_get_arg_type (&subiter); 198 199 if (current_type != DBUS_TYPE_INVALID) 200 printf (","); 201 } 202 indent(depth); 203 printf("]\n"); 204 break; 205 } 206 case DBUS_TYPE_DICT_ENTRY: 207 { 208 DBusMessageIter subiter; 209 210 dbus_message_iter_recurse (iter, &subiter); 211 212 printf("dict entry(\n"); 213 print_iter (&subiter, literal, depth+1); 214 dbus_message_iter_next (&subiter); 215 print_iter (&subiter, literal, depth+1); 216 indent(depth); 217 printf(")\n"); 218 break; 219 } 220 221 case DBUS_TYPE_STRUCT: 222 { 223 int current_type; 224 DBusMessageIter subiter; 225 226 dbus_message_iter_recurse (iter, &subiter); 227 228 printf("struct {\n"); 229 while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID) 230 { 231 print_iter (&subiter, literal, depth+1); 232 dbus_message_iter_next (&subiter); 233 if (dbus_message_iter_get_arg_type (&subiter) != DBUS_TYPE_INVALID) 234 printf (","); 235 } 236 indent(depth); 237 printf("}\n"); 238 break; 239 } 240 241 default: 242 printf (" (dbus-monitor too dumb to decipher arg type '%c')\n", type); 243 break; 244 } 245 } while (dbus_message_iter_next (iter)); 246} 247 248void 249print_message (DBusMessage *message, dbus_bool_t literal) 250{ 251 DBusMessageIter iter; 252 const char *sender; 253 const char *destination; 254 int message_type; 255 256 message_type = dbus_message_get_type (message); 257 sender = dbus_message_get_sender (message); 258 destination = dbus_message_get_destination (message); 259 260 if (!literal) 261 { 262 printf ("%s sender=%s -> dest=%s", 263 type_to_name (message_type), 264 sender ? sender : "(null sender)", 265 destination ? destination : "(null destination)"); 266 267 switch (message_type) 268 { 269 case DBUS_MESSAGE_TYPE_METHOD_CALL: 270 case DBUS_MESSAGE_TYPE_SIGNAL: 271 printf (" serial=%u path=%s; interface=%s; member=%s\n", 272 dbus_message_get_serial (message), 273 dbus_message_get_path (message), 274 dbus_message_get_interface (message), 275 dbus_message_get_member (message)); 276 break; 277 278 case DBUS_MESSAGE_TYPE_METHOD_RETURN: 279 printf (" reply_serial=%u\n", 280 dbus_message_get_reply_serial (message)); 281 break; 282 283 case DBUS_MESSAGE_TYPE_ERROR: 284 printf (" error_name=%s reply_serial=%u\n", 285 dbus_message_get_error_name (message), 286 dbus_message_get_reply_serial (message)); 287 break; 288 289 default: 290 printf ("\n"); 291 break; 292 } 293 } 294 295 dbus_message_iter_init (message, &iter); 296 print_iter (&iter, literal, 1); 297 fflush (stdout); 298 299} 300 301