+2003-08-18 Havoc Pennington <hp@redhat.com>
+
+ * dbus/dbus-hash.c (_dbus_hash_table_insert_two_strings): fix
+
+ * dbus/dbus-message.c (_dbus_message_loader_queue_messages): fix
+ dumb bug created earlier (wrong order of args to
+ decode_header_data())
+
+ * tools/dbus-send.c: port
+
+ * tools/dbus-print-message.c (print_message): port
+
+ * test/data/*messages: port all messages over
+
+ * dbus/dbus-message-builder.c: support including
+ message type
+
+ * bus/driver.c: port over
+
+ * bus/dispatch.c: port over to new stuff
+
+ * dbus/dbus-connection.c (_dbus_connection_new_for_transport):
+ rename disconnect signal to "Disconnected"
+
2003-08-17 Havoc Pennington <hp@pobox.com>
This doesn't compile yet, but syncing up so I can hack on it from
* the hello message to the bus driver
*/
if (recipient == NULL &&
- dbus_message_has_interface (message, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS) &&
- dbus_message_has_member (message, "Hello"))
+ dbus_message_is_method_call (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "Hello"))
{
_dbus_verbose ("security check allowing %s message\n",
"Hello");
_dbus_assert (error != NULL);
_DBUS_ASSERT_ERROR_IS_SET (error);
-
+
_dbus_verbose ("Sending error reply %s \"%s\"\n",
error->name, error->message);
*/
if (service_name == NULL)
{
- if (dbus_message_has_interface (message, DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL) &&
- dbus_message_has_member (message, "Disconnect"))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
bus_connection_disconnected (connection);
/* DBusConnection also handles some of these automatically, we leave
* on services that all service owners will get messages to it, not just
* the primary owner.
*/
- else if (strcmp (service_name, DBUS_SERVICE_BROADCAST) == 0) /* spam! */
+ else if (strcmp (service_name, DBUS_SERVICE_ORG_FREEDESKTOP_BROADCAST) == 0) /* spam! */
{
if (!bus_dispatch_broadcast_message (transaction, connection, message, &error))
goto out;
return dbus_connection_pop_message (connection);
}
+static void
+warn_unexpected (DBusConnection *connection,
+ DBusMessage *message,
+ const char *expected)
+{
+ _dbus_warn ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n",
+ dbus_message_get_interface (message) ?
+ dbus_message_get_interface (message) : "(unset)",
+ dbus_message_get_member (message) ?
+ dbus_message_get_member (message) : "(unset)",
+ dbus_message_get_error_name (message) ?
+ dbus_message_get_error_name (message) : "(unset)",
+ connection,
+ expected);
+}
+
typedef struct
{
const char *expected_service_name;
if (message == NULL)
{
_dbus_warn ("Did not receive a message on %p, expecting %s\n",
- connection, DBUS_MESSAGE_SERVICE_DELETED);
+ connection, "ServiceDeleted");
goto out;
}
- else if (!dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_DELETED))
+ else if (!dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceDeleted"))
{
- _dbus_warn ("Received message %s on %p, expecting %s\n",
- dbus_message_get_name (message),
- connection, DBUS_MESSAGE_SERVICE_DELETED);
+ warn_unexpected (connection, message, "ServiceDeleted");
+
goto out;
}
else
message = pop_message_waiting_for_memory (connection);
if (message != NULL)
{
- _dbus_warn ("Received message %s on %p, expecting no messages\n",
- dbus_message_get_name (message), connection);
+ warn_unexpected (connection, message, "no messages");
+
d->failed = TRUE;
}
if (message == NULL)
{
_dbus_warn ("Did not receive a message on %p, expecting %s\n",
- connection, DBUS_MESSAGE_SERVICE_CREATED);
+ connection, "ServiceCreated");
goto out;
}
- else if (!dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED))
+ else if (!dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceCreated"))
{
- _dbus_warn ("Received message %s on %p, expecting %s\n",
- dbus_message_get_name (message),
- connection, DBUS_MESSAGE_SERVICE_CREATED);
+ warn_unexpected (connection, message, "ServiceCreated");
goto out;
}
else
acquired = NULL;
message = NULL;
- message = dbus_message_new_method_call (DBUS_MESSAGE_HELLO,
+ message = dbus_message_new_method_call (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "Hello",
DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
if (message == NULL)
if (message == NULL)
{
_dbus_warn ("Did not receive a reply to %s %d on %p\n",
- DBUS_MESSAGE_HELLO, serial, connection);
+ "Hello", serial, connection);
goto out;
}
- _dbus_verbose ("Received %s on %p\n",
- dbus_message_get_name (message), connection);
+ _dbus_verbose ("Received message %p on %p\n",
+ message, connection);
if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
{
if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
{
- if (dbus_message_has_name (message,
+ if (dbus_message_is_error (message,
DBUS_ERROR_NO_MEMORY))
{
; /* good, this is a valid response */
}
else
{
- _dbus_warn ("Did not expect error %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "not this error");
+
goto out;
}
}
{
CheckServiceCreatedData scd;
- if (dbus_message_has_name (message,
- DBUS_MESSAGE_HELLO))
+ if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
; /* good, expected */
}
else
{
- _dbus_warn ("Did not expect reply %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "method return for Hello");
+
goto out;
}
if (message == NULL)
{
_dbus_warn ("Expecting %s, got nothing\n",
- DBUS_MESSAGE_SERVICE_ACQUIRED);
+ "ServiceAcquired");
goto out;
}
dbus_error_init (&error);
- message = dbus_message_new_method_call (DBUS_MESSAGE_ACTIVATE_SERVICE,
+ message = dbus_message_new_method_call (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ActivateService",
DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
if (message == NULL)
if (message == NULL)
{
_dbus_warn ("Did not receive a reply to %s %d on %p\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection);
+ "ActivateService", serial, connection);
goto out;
}
- _dbus_verbose ("Received %s on %p\n",
- dbus_message_get_name (message), connection);
+ _dbus_verbose ("Received message %p on %p\n",
+ message, connection);
if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
{
goto out;
}
- if (dbus_message_has_name (message,
+ if (dbus_message_is_error (message,
DBUS_ERROR_NO_MEMORY))
{
; /* good, this is a valid response */
}
- else if (dbus_message_has_name (message,
+ else if (dbus_message_is_error (message,
DBUS_ERROR_ACTIVATE_SERVICE_NOT_FOUND))
{
; /* good, this is expected also */
}
else
{
- _dbus_warn ("Did not expect error %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "not this error");
goto out;
}
}
message = initial_message;
dbus_message_ref (message);
- if (dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceCreated"))
{
char *service_name;
CheckServiceCreatedData scd;
else
{
_dbus_warn ("Message %s doesn't have a service name: %s\n",
- dbus_message_get_name (message),
+ "ServiceCreated",
error.message);
dbus_error_free (&error);
goto out;
}
else
{
- _dbus_warn ("Expected to get base service ServiceCreated, instead got %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "ServiceCreated for base service");
+
goto out;
}
message = initial_message;
dbus_message_ref (message);
- if (dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceCreated"))
{
char *service_name;
CheckServiceCreatedData scd;
else
{
_dbus_warn ("Message %s doesn't have a service name: %s\n",
- dbus_message_get_name (message),
+ "ServiceCreated",
error.message);
dbus_error_free (&error);
goto out;
if (message == NULL)
{
_dbus_warn ("Expected a reply to %s, got nothing\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE);
+ "ActivateService");
goto out;
}
}
else
{
- _dbus_warn ("Expected to get service %s ServiceCreated, instead got %s\n",
- activated_name, dbus_message_get_name (message));
+ warn_unexpected (connection, message, "ServiceCreated for the activated name");
+
goto out;
}
- if (!dbus_message_has_name (message, DBUS_MESSAGE_ACTIVATE_SERVICE))
+ if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
{
- _dbus_warn ("Expected reply to %s, got message %s instead\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE,
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "reply to ActivateService");
+
goto out;
}
if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
{
_dbus_warn ("Did not have activation result first argument to %s: %s\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE, error.message);
+ "ActivateService", error.message);
dbus_error_free (&error);
goto out;
}
retval = FALSE;
/* Kill off the test service by sending it a quit message */
- message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteExit",
+ message = dbus_message_new_method_call ("org.freedesktop.TestSuite",
+ "Exit",
service_name);
if (message == NULL)
message = pop_message_waiting_for_memory (connection);
_dbus_assert (message != NULL);
- if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
- {
- _dbus_warn ("expecting an error reply to asking test service to exit, got %s\n",
- dbus_message_get_name (message));
- goto out;
- }
- else if (!dbus_message_has_name (message, DBUS_ERROR_NO_MEMORY))
+ if (!dbus_message_is_error (message,
+ DBUS_ERROR_NO_MEMORY))
{
- _dbus_warn ("not expecting error %s when asking test service to exit\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message,
+ "a no memory error from asking test service to exit");
goto out;
}
_dbus_verbose ("Got error %s when asking test service to exit\n",
- dbus_message_get_name (message));
+ dbus_message_get_error_name (message));
/* Do this again; we still need the service to exit... */
if (!check_send_exit_to_service (context, connection,
if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
{
- _dbus_warn ("Expected an error, got %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "an error");
+
goto out;
}
error_name = first_error_name;
while (error_name != NULL)
{
- if (dbus_message_has_name (message, error_name))
+ if (dbus_message_is_error (message, error_name))
{
error_found = TRUE;
break;
{
_dbus_warn ("Expected error %s or other, got %s instead\n",
first_error_name,
- dbus_message_get_name (message));
+ dbus_message_get_error_name (message));
goto out;
}
dbus_error_init (&error);
- message = dbus_message_new_method_call (DBUS_MESSAGE_ACTIVATE_SERVICE,
+ message = dbus_message_new_method_call (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ActivateService",
DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
if (message == NULL)
if (message == NULL)
{
_dbus_warn ("Did not receive any messages after %s %d on %p\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection);
+ "ActivateService", serial, connection);
goto out;
}
- _dbus_verbose ("Received %s on %p after sending %s\n",
- dbus_message_get_name (message), connection,
- DBUS_MESSAGE_ACTIVATE_SERVICE);
+ _dbus_verbose ("Received message %p on %p after sending %s\n",
+ message, connection, "ActivateService");
if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
{
goto out;
}
- if (dbus_message_has_name (message,
+ if (dbus_message_is_error (message,
DBUS_ERROR_NO_MEMORY))
{
; /* good, this is a valid response */
}
- else if (dbus_message_has_name (message,
+ else if (dbus_message_is_error (message,
DBUS_ERROR_SPAWN_CHILD_EXITED))
{
; /* good, this is expected also */
else
{
_dbus_warn ("Did not expect error %s\n",
- dbus_message_get_name (message));
+ dbus_message_get_error_name (message));
goto out;
}
}
goto out;
}
- got_service_deleted = dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_DELETED);
+ got_service_deleted = dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceDeleted");
got_error = dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
dbus_connection_return_message (connection, message);
dbus_error_init (&error);
- message = dbus_message_new_method_call (DBUS_MESSAGE_ACTIVATE_SERVICE,
+ message = dbus_message_new_method_call (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ActivateService",
DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
if (message == NULL)
if (message == NULL)
{
_dbus_warn ("Did not receive a reply to %s %d on %p\n",
- DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection);
+ "ActivateService", serial, connection);
goto out;
}
- _dbus_verbose ("Received %s on %p\n",
- dbus_message_get_name (message), connection);
+ _dbus_verbose ("Received message %p on %p\n",
+ message, connection);
if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
{
goto out;
}
- if (dbus_message_has_name (message,
- DBUS_ERROR_NO_MEMORY))
+ if (dbus_message_is_error (message,
+ DBUS_ERROR_NO_MEMORY))
{
; /* good, this is a valid response */
}
- else if (dbus_message_has_name (message,
- DBUS_ERROR_SPAWN_CHILD_SIGNALED))
+ else if (dbus_message_is_error (message,
+ DBUS_ERROR_SPAWN_CHILD_SIGNALED))
{
; /* good, this is expected also */
}
else
{
- _dbus_warn ("Did not expect error %s\n",
- dbus_message_get_name (message));
+ warn_unexpected (connection, message, "not this error");
+
goto out;
}
}
_dbus_verbose ("sending service deleted: %s\n", service_name);
- message = dbus_message_new_signal (DBUS_MESSAGE_SERVICE_DELETED);
+ message = dbus_message_new_signal (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceDeleted");
if (message == NULL)
{
return FALSE;
}
- if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
+ if (!dbus_message_set_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) ||
!dbus_message_append_args (message,
DBUS_TYPE_STRING, service_name,
DBUS_TYPE_INVALID))
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
- message = dbus_message_new_signal (DBUS_MESSAGE_SERVICE_CREATED);
+ message = dbus_message_new_signal (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceCreated");
if (message == NULL)
{
return FALSE;
}
- if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
+ if (!dbus_message_set_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))
{
dbus_message_unref (message);
BUS_SET_OOM (error);
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
- message = dbus_message_new_signal (DBUS_MESSAGE_SERVICE_LOST);
+ message = dbus_message_new_signal (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceLost");
if (message == NULL)
{
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
- message = dbus_message_new_signal (DBUS_MESSAGE_SERVICE_ACQUIRED);
+ message = dbus_message_new_signal (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "ServiceAcquired");
if (message == NULL)
{
DBusMessage *message,
DBusError *error);
} message_handlers[] = {
- { DBUS_MESSAGE_ACQUIRE_SERVICE, bus_driver_handle_acquire_service },
- { DBUS_MESSAGE_ACTIVATE_SERVICE, bus_driver_handle_activate_service },
- { DBUS_MESSAGE_HELLO, bus_driver_handle_hello },
- { DBUS_MESSAGE_SERVICE_EXISTS, bus_driver_handle_service_exists },
- { DBUS_MESSAGE_LIST_SERVICES, bus_driver_handle_list_services }
+ { "AcquireService", bus_driver_handle_acquire_service },
+ { "ActivateService", bus_driver_handle_activate_service },
+ { "Hello", bus_driver_handle_hello },
+ { "ServiceExists", bus_driver_handle_service_exists },
+ { "ListServices", bus_driver_handle_list_services }
};
dbus_bool_t
int i;
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
+
+ if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
+ {
+ _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
+ return TRUE; /* we just ignore this */
+ }
+
+ _dbus_assert (dbus_message_get_interface (message) != NULL);
+ _dbus_assert (dbus_message_get_member (message) != NULL);
+
+ name = dbus_message_get_member (message);
+ sender = dbus_message_get_sender (message);
- _dbus_verbose ("Driver got a message: %s\n",
- dbus_message_get_name (message));
+ if (strcmp (dbus_message_get_interface (message),
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS) != 0)
+ {
+ _dbus_verbose ("Driver got message to unknown interface \"%s\"\n",
+ dbus_message_get_interface (message));
+ goto unknown;
+ }
+
+ _dbus_verbose ("Driver got a method call: %s\n",
+ dbus_message_get_member (message));
- name = dbus_message_get_name (message);
- sender = dbus_message_get_sender (message);
-
/* security checks should have kept this from getting here */
- _dbus_assert (sender != NULL || strcmp (name, DBUS_MESSAGE_HELLO) == 0);
+ _dbus_assert (sender != NULL || strcmp (name, "Hello") == 0);
if (dbus_message_get_reply_serial (message) == 0)
{
++i;
}
- _dbus_verbose ("No driver handler for %s\n", name);
+ unknown:
+ _dbus_verbose ("No driver handler for message \"%s\"\n",
+ name);
dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD,
"%s does not understand message %s",
- DBUS_SERVICE_DBUS, name);
+ DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, name);
return FALSE;
}
if (rule->d.send.interface != NULL)
{
- if (!dbus_message_has_interface (message,
- rule->d.send.interface))
+ if (dbus_message_get_interface (message) == NULL ||
+ strcmp (dbus_message_get_interface (message),
+ rule->d.send.interface) != 0)
{
_dbus_verbose (" (policy) skipping rule for different interface\n");
continue;
}
else if (rule->d.send.member != NULL)
{
- if (!dbus_message_has_member (message,
- rule->d.send.member))
+ if (dbus_message_get_member (message) == NULL ||
+ strcmp (dbus_message_get_member (message),
+ rule->d.send.member) != 0)
{
_dbus_verbose (" (policy) skipping rule for different member\n");
continue;
}
else if (rule->d.send.error != NULL)
{
- if (!dbus_message_has_error_name (message,
- rule->d.send.error))
+ if (dbus_message_get_error_name (message) == NULL ||
+ strcmp (dbus_message_get_error_name (message),
+ rule->d.send.error) != 0)
{
_dbus_verbose (" (policy) skipping rule for different error name\n");
continue;
if (rule->d.receive.interface != NULL)
{
- if (!dbus_message_has_interface (message,
- rule->d.receive.interface))
+ if (dbus_message_get_interface (message) == NULL ||
+ strcmp (dbus_message_get_interface (message),
+ rule->d.receive.interface) != 0)
{
_dbus_verbose (" (policy) skipping rule for different interface\n");
continue;
}
else if (rule->d.receive.member != NULL)
{
- if (!dbus_message_has_member (message,
- rule->d.receive.member))
+ if (dbus_message_get_member (message) == NULL ||
+ strcmp (dbus_message_get_member (message),
+ rule->d.receive.member) != 0)
{
_dbus_verbose (" (policy) skipping rule for different member\n");
continue;
}
else if (rule->d.receive.error != NULL)
{
- if (!dbus_message_has_error_name (message,
- rule->d.receive.error))
+ if (dbus_message_get_error_name (message) == NULL ||
+ strcmp (dbus_message_get_error_name (message),
+ rule->d.receive.error) != 0)
{
_dbus_verbose (" (policy) skipping rule for different error name\n");
continue;
DBusMessage *message,
void *user_data)
{
- if (!dbus_message_has_name (message,
- DBUS_MESSAGE_LOCAL_DISCONNECT))
+ if (!dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
_dbus_verbose ("Removing client %p in disconnect handler\n",
goto error;
disconnect_message = dbus_message_new_signal (DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
- "Disconnect");
+ "Disconnected");
if (disconnect_message == NULL)
goto error;
char *key,
void *value)
{
- DBusPreallocatedHash *preallocated;
-
+ DBusHashEntry *entry;
+
_dbus_assert (table->key_type == DBUS_HASH_TWO_STRINGS);
+
+ entry = (* table->find_function) (table, key, TRUE, NULL, NULL);
- preallocated = _dbus_hash_table_preallocate_entry (table);
- if (preallocated == NULL)
- return FALSE;
+ if (entry == NULL)
+ return FALSE; /* no memory */
- _dbus_hash_table_insert_string_preallocated (table, preallocated,
- key, value);
+ if (table->free_key_function && entry->key != key)
+ (* table->free_key_function) (entry->key);
+
+ if (table->free_value_function && entry->value != value)
+ (* table->free_value_function) (entry->value);
+ entry->key = key;
+ entry->value = value;
+
return TRUE;
}
if (value == NULL)
goto out;
- if (!_dbus_hash_table_insert_string (table4,
- key, value))
+ if (!_dbus_hash_table_insert_two_strings (table4,
+ key, value))
goto out;
_dbus_assert (count_entries (table1) == i + 1);
_dbus_assert (value != NULL);
_dbus_assert (strcmp (value, keys[i]) == 0);
- value = _dbus_hash_table_lookup_ulong (table4, i);
+ value = _dbus_hash_table_lookup_two_strings (table4, keys[i]);
_dbus_assert (value != NULL);
- _dbus_assert (strcmp (value, keys[i]) == 0);
+ _dbus_assert (strcmp (value, "Value!") == 0);
++i;
}
return TRUE;
}
+static int
+message_type_from_string (const DBusString *str,
+ int start)
+{
+ const char *s;
+
+ s = _dbus_string_get_const_data_len (str, start,
+ _dbus_string_get_length (str) - start);
+
+ if (strncmp (s, "method_call", strlen ("method_call")) == 0)
+ return DBUS_MESSAGE_TYPE_METHOD_CALL;
+ else if (strncmp (s, "method_return", strlen ("method_return")) == 0)
+ return DBUS_MESSAGE_TYPE_METHOD_RETURN;
+ else if (strncmp (s, "signal", strlen ("signal")) == 0)
+ return DBUS_MESSAGE_TYPE_SIGNAL;
+ else if (strncmp (s, "error", strlen ("error")) == 0)
+ return DBUS_MESSAGE_TYPE_ERROR;
+ else if (strncmp (s, "invalid", strlen ("invalid")) == 0)
+ return DBUS_MESSAGE_TYPE_INVALID;
+ else
+ return -1;
+}
+
/**
* Reads the given filename, which should be in "message description
* language" (look at some examples), and builds up the message data
*
* The file format is:
* @code
- * VALID_HEADER normal header; byte order, padding, header len, body len, serial
+ * VALID_HEADER <type> normal header; byte order, type, padding, header len, body len, serial
* BIG_ENDIAN switch to big endian
* LITTLE_ENDIAN switch to little endian
* OPPOSITE_ENDIAN switch to opposite endian
{
int i;
DBusString name;
+ int message_type;
+
+ if (_dbus_string_get_length (&line) < strlen ("VALID_HEADER "))
+ {
+ _dbus_warn ("no args to VALID_HEADER\n");
+ goto parse_failed;
+ }
if (!_dbus_string_append_byte (dest, endian))
{
goto parse_failed;
}
- if (!_dbus_string_append_byte (dest, DBUS_MESSAGE_TYPE_METHOD_CALL))
+ message_type = message_type_from_string (&line,
+ strlen ("VALID_HEADER "));
+ if (message_type < 0)
+ {
+ _dbus_warn ("VALID_HEADER not followed by space then known message type\n");
+ goto parse_failed;
+ }
+
+ if (!_dbus_string_append_byte (dest, message_type))
{
_dbus_warn ("could not append message type\n");
goto parse_failed;
return get_string_field (message, FIELD_SENDER, NULL);
}
+static dbus_bool_t
+_dbus_message_has_type_interface_member (DBusMessage *message,
+ int type,
+ const char *interface,
+ const char *method)
+{
+ const char *n;
+
+ _dbus_assert (message != NULL);
+ _dbus_assert (interface != NULL);
+ _dbus_assert (method != NULL);
+
+ if (dbus_message_get_type (message) != type)
+ return FALSE;
+
+ /* Optimize by checking the short method name first
+ * instead of the longer interface name
+ */
+
+ n = dbus_message_get_member (message);
+
+ if (n && strcmp (n, method) == 0)
+ {
+ n = dbus_message_get_interface (message);
+
+ if (n && strcmp (n, interface) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/**
- * Checks whether the message has the given interface field. If the
- * message has no interface field or has a different one, returns
- * #FALSE.
+ * Checks whether the message is a method call with the given
+ * interface and member fields. If the message is not
+ * #DBUS_MESSAGE_TYPE_METHOD_CALL, or has a different interface or member field,
+ * returns #FALSE.
*
* @param message the message
* @param interface the name to check (must not be #NULL)
+ * @param method the name to check (must not be #NULL)
*
- * @returns #TRUE if the message has the given name
+ * @returns #TRUE if the message is the specified method call
*/
dbus_bool_t
-dbus_message_has_interface (DBusMessage *message,
- const char *interface)
+dbus_message_is_method_call (DBusMessage *message,
+ const char *interface,
+ const char *method)
{
- const char *n;
-
_dbus_return_val_if_fail (message != NULL, FALSE);
_dbus_return_val_if_fail (interface != NULL, FALSE);
-
- n = dbus_message_get_interface (message);
+ _dbus_return_val_if_fail (method != NULL, FALSE);
- if (n && strcmp (n, interface) == 0)
- return TRUE;
- else
- return FALSE;
+ return _dbus_message_has_type_interface_member (message,
+ DBUS_MESSAGE_TYPE_METHOD_CALL,
+ interface, method);
}
+/**
+ * Checks whether the message is a signal with the given
+ * interface and member fields. If the message is not
+ * #DBUS_MESSAGE_TYPE_SIGNAL, or has a different interface or member field,
+ * returns #FALSE.
+ *
+ * @param message the message
+ * @param interface the name to check (must not be #NULL)
+ * @param signal_name the name to check (must not be #NULL)
+ *
+ * @returns #TRUE if the message is the specified signal
+ */
+dbus_bool_t
+dbus_message_is_signal (DBusMessage *message,
+ const char *interface,
+ const char *signal_name)
+{
+ _dbus_return_val_if_fail (message != NULL, FALSE);
+ _dbus_return_val_if_fail (interface != NULL, FALSE);
+ _dbus_return_val_if_fail (signal_name != NULL, FALSE);
+
+ return _dbus_message_has_type_interface_member (message,
+ DBUS_MESSAGE_TYPE_SIGNAL,
+ interface, signal_name);
+}
/**
- * Checks whether the message has the given member field. If the
- * message has no member field or has a different one, returns #FALSE.
+ * Checks whether the message is an error reply with the given error
+ * name. If the message is not #DBUS_MESSAGE_TYPE_ERROR, or has a
+ * different name, returns #FALSE.
*
* @param message the message
- * @param member the name to check (must not be #NULL)
+ * @param error_name the name to check (must not be #NULL)
*
- * @returns #TRUE if the message has the given name
+ * @returns #TRUE if the message is the specified error
*/
dbus_bool_t
-dbus_message_has_member (DBusMessage *message,
- const char *member)
+dbus_message_is_error (DBusMessage *message,
+ const char *error_name)
{
const char *n;
-
- _dbus_return_val_if_fail (message != NULL, FALSE);
- _dbus_return_val_if_fail (member != NULL, FALSE);
+ _dbus_return_val_if_fail (message != NULL, FALSE);
+ _dbus_return_val_if_fail (error_name != NULL, FALSE);
+
+ if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
+ return FALSE;
+
n = dbus_message_get_member (message);
- if (n && strcmp (n, member) == 0)
+ if (n && strcmp (n, error_name) == 0)
return TRUE;
else
return FALSE;
int type;
if (header_len < 16)
- return FALSE;
+ {
+ _dbus_verbose ("Header length %d is too short\n", header_len);
+ return FALSE;
+ }
i = 0;
while (i < FIELD_LAST)
pos = _DBUS_ALIGN_VALUE (pos, 4);
if ((pos + 4) > header_len)
- return FALSE;
+ {
+ _dbus_verbose ("not enough space remains in header for header field value\n");
+ return FALSE;
+ }
field =_dbus_string_get_const_data_len (data, pos, 4);
pos += 4;
#if 0
_dbus_verbose_bytes_of_string (&loader->data, 0, header_len + body_len);
#endif
- if (!decode_header_data (&loader->data, message_type,
+ if (!decode_header_data (&loader->data,
header_len, byte_order,
+ message_type,
fields, &header_padding))
{
_dbus_verbose ("Header was invalid\n");
printf (" %s\n",
_dbus_string_get_const_data (&filename));
- _dbus_verbose (" expecting %s\n",
+ _dbus_verbose (" expecting %s for %s\n",
validity == _DBUS_MESSAGE_VALID ? "valid" :
(validity == _DBUS_MESSAGE_INVALID ? "invalid" :
- (validity == _DBUS_MESSAGE_INCOMPLETE ? "incomplete" : "unknown")));
+ (validity == _DBUS_MESSAGE_INCOMPLETE ? "incomplete" : "unknown")),
+ _dbus_string_get_const_data (&filename));
if (! (*function) (&full_path, is_raw, validity, user_data))
{
"TestMethod",
"org.freedesktop.DBus.TestService");
_dbus_assert (dbus_message_has_destination (message, "org.freedesktop.DBus.TestService"));
- _dbus_assert (dbus_message_has_interface (message, "Foo.TestInterface"));
- _dbus_assert (dbus_message_has_member (message, "TestMethod"));
+ _dbus_assert (dbus_message_is_method_call (message, "Foo.TestInterface",
+ "TestMethod"));
_dbus_message_set_serial (message, 1234);
dbus_message_set_sender (message, "org.foo.bar");
_dbus_assert (dbus_message_has_sender (message, "org.foo.bar"));
void dbus_message_set_no_reply (DBusMessage *message,
dbus_bool_t no_reply);
dbus_bool_t dbus_message_get_no_reply (DBusMessage *message);
-dbus_bool_t dbus_message_has_interface (DBusMessage *message,
- const char *interface);
-dbus_bool_t dbus_message_has_member (DBusMessage *message,
- const char *member);
-dbus_bool_t dbus_message_has_error_name (DBusMessage *message,
- const char *name);
+dbus_bool_t dbus_message_is_method_call (DBusMessage *message,
+ const char *interface,
+ const char *method);
+dbus_bool_t dbus_message_is_signal (DBusMessage *message,
+ const char *interface,
+ const char *signal_name);
+dbus_bool_t dbus_message_is_error (DBusMessage *message,
+ const char *error_name);
dbus_bool_t dbus_message_has_destination (DBusMessage *message,
const char *service);
dbus_bool_t dbus_message_has_sender (DBusMessage *message,
* allowed to specify this interface).
*/
#define DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL "org.freedesktop.Local"
-
-#if 0
- /* these are a bad idea, FIXME */
-#define DBUS_METHOD_ORG_FREEDESKTOP_DBUS_ACTIVATE_SERVICE "ActivateService"
-#define DBUS_METHOD_ORG_FREEDESKTOP_DBUS_SERVICE_EXISTS "ServiceExists"
-#define DBUS_METHOD_ORG_FREEDESKTOP_DBUS_HELLO "Hello"
-#define DBUS_METHOD_ORG_FREEDESKTOP_DBUS_LIST_SERVICES "ListServices"
-#define DBUS_METHOD_ORG_FREEDESKTOP_DBUS_ACQUIRE_SERVICE "AcquireService"
-
-#define DBUS_SIGNAL_ORG_FREEDESKTOP_DBUS_SERVICE_ACQUIRED "ServiceAcquired"
-#define DBUS_SIGNAL_ORG_FREEDESKTOP_DBUS_SERVICE_CREATED "ServiceCreated"
-#define DBUS_SIGNAL_ORG_FREEDESKTOP_DBUS_SERVICE_DELETED "ServiceDeleted"
-#define DBUS_SIGNAL_ORG_FREEDESKTOP_DBUS_SERVICE_LOST "ServiceLost"
-#endif /* #if 0 */
#ifdef __cplusplus
}
*
* @todo this is inconsistent with most of DBusString in that
* it allows a start,len range that isn't in the string.
+ *
+ * @todo change spec to disallow more things, such as spaces in the
+ * interface name
*
* @param str the string
* @param start first byte index to check
* @todo this is inconsistent with most of DBusString in that
* it allows a start,len range that isn't in the string.
*
+ * @todo change spec to disallow more things, such as spaces in the
+ * member name
+ *
* @param str the string
* @param start first byte index to check
* @param len number of bytes to check
*
* @todo this is inconsistent with most of DBusString in that
* it allows a start,len range that isn't in the string.
+ *
+ * @todo change spec to disallow more things, such as spaces in the
+ * service name
*
* @param str the string
* @param start first byte index to check
(changing get_string to have an error return, and allowing a type error
as a possible return)
- - We might consider returning a "no such operation" error in dbus-connection.c
- for unhandled messages.
-
- The convenience functions in dbus-bus.h should perhaps have
the signatures that they would have if they were autogenerated
stubs. e.g. the acquire service function. We should also evaluate
dbus_connection_setup_with_g_main (connection, NULL);
- message = dbus_message_new_method_call (DBUS_MESSAGE_HELLO,
- DBUS_SERVICE_DBUS);
+ message = dbus_message_new_method_call (DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
+ "Hello",
+ DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);
dbus_error_init (&error);
reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
return 1;
}
- g_print ("reply name: %s\n", dbus_message_get_name (reply));
+ g_print ("reply received\n");
g_main_loop_run (loop);
*
*/
+/* FIXME this test is wacky since both client and server keep
+ * sending each other method calls, but nobody sends
+ * a DBUS_MESSAGE_TYPE_METHOD_RETURN
+ */
+
#include <config.h>
#include <glib.h>
#include "dbus-glib.h"
#define N_CLIENT_THREADS 1
#define N_ITERATIONS 1000
#define PAYLOAD_SIZE 30
-#define ECHO_MESSAGE "org.freedesktop.DBus.Test.EchoProfile"
+#define ECHO_INTERFACE "org.freedekstop.EchoTest"
+#define ECHO_METHOD "EchoProfile"
+
static const char *address;
static unsigned char *payload;
{
DBusMessage *message;
- message = dbus_message_new_method_call (ECHO_MESSAGE, NULL);
+ message = dbus_message_new_method_call (ECHO_INTERFACE, ECHO_METHOD, NULL);
dbus_message_append_args (message,
DBUS_TYPE_STRING, "Hello World!",
DBUS_TYPE_INT32, 123456,
{
int *iterations = user_data;
- if (dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
{
g_printerr ("Client thread disconnected\n");
exit (1);
}
- else if (dbus_message_has_name (message,
- ECHO_MESSAGE))
+ else if (dbus_message_is_method_call (message,
+ ECHO_INTERFACE, ECHO_METHOD))
{
*iterations += 1;
if (*iterations >= N_ITERATIONS)
DBusMessage *message,
void *user_data)
{
- if (dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
{
g_printerr ("Server thread disconnected\n");
exit (1);
}
- else if (dbus_message_has_name (message,
- ECHO_MESSAGE))
+ else if (dbus_message_is_method_call (message,
+ ECHO_INTERFACE,
+ ECHO_METHOD))
{
send_echo_message (connection);
return DBUS_HANDLER_RESULT_HANDLED;
while (1)
{
- message = dbus_message_new_method_call ("org.freedesktop.ThreadTest", NULL);
+ message = dbus_message_new_method_call ("org.freedesktop.ThreadTest",
+ "TestMethod", NULL);
dbus_message_append_iter_init (message, &iter);
GString *counter_str;
int i;
- if (!dbus_message_has_name (message, "org.freedesktop.ThreadTest"))
+ if (!dbus_message_is_method_call (message, "org.freedesktop.ThreadTest",
+ "TestMethod"))
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
dbus_message_iter_init (message, &iter);
DBusMessage *message,
void *user_data)
{
- if (!dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
+ if (!dbus_message_is_signal (message, DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
g_print ("connection disconnected\n");
## message that's missing an expected body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
ALIGN 8
# Message with an array of NIL (not allowed)
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
END_LENGTH Header
ALIGN 8
START_LENGTH Body
# Message with an array of array where the child arrays are of
# different types
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
END_LENGTH Header
ALIGN 8
START_LENGTH Body
## a message with an invalid boolean array
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
## a message with an invalid boolean value
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
BYTE 1
BYTE 0
BYTE 0
+
LENGTH Header
LENGTH Body
-## client serial
-INT32 7
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
+ALIGN 8
+
END_LENGTH Header
+
START_LENGTH Body
END_LENGTH Body
## invalid
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Local'
+FIELD_NAME mebr
TYPE STRING
-STRING 'org.freedesktop.Local.Disconnect'
+STRING 'Disconnected'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
-## a message with dotless name
+## a message with dotless interface
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'NoDotInHere'
+FIELD_NAME mebr
TYPE STRING
-STRING 'NoNamespaceHere'
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
## has one non-nul byte in header padding
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
FIELD_NAME unkn
TYPE STRING
STRING 'a'
## a message with too-long name field
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.foo.bar.this.is.really.long 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200'
+
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
## has one byte missing from header padding
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
FIELD_NAME unkn
TYPE STRING
STRING 'a'
## has one byte extra header padding
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
FIELD_NAME unkn
TYPE STRING
STRING 'a'
## has one byte extra header padding
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
+
+FIELD_NAME ifce
+TYPE STRING
+STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
FIELD_NAME unkn
TYPE STRING
STRING 'a'
# Message with lots of different argument types
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
-END_LENGTH Header
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
+
+END_LENGTH Header
+
START_LENGTH Body
TYPE DICT
LENGTH Dict
# Message with an array of array of uint32
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
ALIGN 8
START_LENGTH Body
# A simple dict
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
ALIGN 8
START_LENGTH Body
# Dict with different values
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
ALIGN 8
END_LENGTH Header
START_LENGTH Body
# Empty arrays and strings
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
ALIGN 8
START_LENGTH Body
# Message with lots of different argument types
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
ALIGN 8
START_LENGTH Body
## Message with no header padding
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
-FIELD_NAME name
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
## this byte array is filled with zeros to the natural length
## of the header
OPPOSITE_ENDIAN
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
-FIELD_NAME rply
-TYPE UINT32
-UINT32 10000
-
-FIELD_NAME name
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
FIELD_NAME unkn
TYPE INT32
## Message with recursive types
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
+VALID_HEADER method_call
-FIELD_NAME name
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
END_LENGTH Header
START_LENGTH Body
LENGTH Body
## client serial
INT32 7
-FIELD_NAME name
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
## simplest possible valid message
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
+
ALIGN 8
END_LENGTH Header
START_LENGTH Body
# Standard org.freedesktop.DBus.AcquireService message
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
-STRING 'org.freedesktop.DBus.AcquireService'
+STRING 'org.freedesktop.DBus'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'AcquireService'
FIELD_NAME srvc
TYPE STRING
STRING 'org.freedesktop.DBus'
# Standard org.freedesktop.DBus.Hello message
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
-STRING 'org.freedesktop.DBus.Hello'
+STRING 'org.freedesktop.DBus'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Hello'
FIELD_NAME srvc
TYPE STRING
STRING 'org.freedesktop.DBus'
# Standard org.freedesktop.DBus.ListServices message
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
-STRING 'org.freedesktop.DBus.ListServices'
+STRING 'org.freedesktop.DBus'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'ListServices'
FIELD_NAME srvc
TYPE STRING
STRING 'org.freedesktop.DBus'
# Standard org.freedesktop.DBus.ServiceExists message
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
-STRING 'org.freedesktop.DBus.ServiceExists'
+STRING 'org.freedesktop.DBus'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'ServiceExists'
FIELD_NAME srvc
TYPE STRING
STRING 'org.freedesktop.DBus'
## message with a 'name' header field and unknown 'unkn' field
## VALID_HEADER includes a LENGTH Header and LENGTH Body
-VALID_HEADER
-FIELD_NAME name
+VALID_HEADER method_call
+FIELD_NAME ifce
TYPE STRING
STRING 'org.freedesktop.Foo'
+FIELD_NAME mebr
+TYPE STRING
+STRING 'Bar'
FIELD_NAME unkn
TYPE INT32
INT32 0xfeeb
DBusMessage *message,
void *user_data)
{
- if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteEcho"))
+ if (dbus_message_is_method_call (message,
+ "org.freedesktop.TestSuite",
+ "Echo"))
return handle_echo (connection, message);
- else if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteExit") ||
- dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
+ else if (dbus_message_is_method_call (message,
+ "org.freedesktop.TestSuite",
+ "Exit") ||
+ dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
{
dbus_connection_disconnect (connection);
quit ();
{
print_message (message);
- if (dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
+ if (dbus_message_is_signal (message,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
+ "Disconnected"))
exit (0);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
message_type = dbus_message_get_type (message);
sender = dbus_message_get_sender (message);
-
- printf ("%s name=%s; sender=%s\n",
- type_to_name (message_type),
- dbus_message_get_name (message),
- sender ? sender : "(no sender)");
-
+
+ switch (message_type)
+ {
+ case DBUS_MESSAGE_TYPE_METHOD_CALL:
+ case DBUS_MESSAGE_TYPE_SIGNAL:
+ printf ("%s interface=%s; member=%s; sender=%s\n",
+ type_to_name (message_type),
+ dbus_message_get_interface (message),
+ dbus_message_get_member (message),
+ sender ? sender : "(no sender)");
+ break;
+
+ case DBUS_MESSAGE_TYPE_METHOD_RETURN:
+ printf ("%s; sender=%s\n",
+ type_to_name (message_type),
+ sender ? sender : "(no sender)");
+ break;
+
+ case DBUS_MESSAGE_TYPE_ERROR:
+ printf ("%s name=%s; sender=%s\n",
+ type_to_name (message_type),
+ dbus_message_get_error_name (message),
+ sender ? sender : "(no sender)");
+ break;
+
+ default:
+ printf ("Message of unknown type %d received\n",
+ message_type);
+ break;
+ }
+
dbus_message_iter_init (message, &iter);
do
Here is an example invocation:
.nf
- dbus-send \-\-dest='org.freedesktop.ExampleService' \\
- org.freedesktop.ExampleMessage \\
+ dbus-send \-\-dest='org.freedesktop.ExampleService' \\
+ org.freedesktop.ExampleInterface.ExampleMethod \\
int32:47 string:'hello world' double:65.32
.fi
+Note that the interface is separated from a method or signal
+name by a dot, though in the actual protocol the interface
+and the interface member are separate fields.
+
.SH OPTIONS
The following options are supported:
.TP
DBusMessageIter iter;
int i;
DBusBusType type = DBUS_BUS_SESSION;
- const char *dest = DBUS_SERVICE_BROADCAST;
+ const char *dest = DBUS_SERVICE_ORG_FREEDESKTOP_BROADCAST;
char *name = NULL;
int message_type = DBUS_MESSAGE_TYPE_SIGNAL;
const char *type_str = NULL;
if (message_type == DBUS_MESSAGE_TYPE_METHOD_CALL)
{
- message = dbus_message_new_method_call (name, NULL);
+ char *last_dot;
+
+ last_dot = strrchr (name, '.');
+ if (last_dot == NULL)
+ {
+ fprintf (stderr, "Must use org.mydomain.Interface.Method notation, no dot in \"%s\"\n",
+ name);
+ exit (1);
+ }
+ *last_dot = '\0';
+
+ message = dbus_message_new_method_call (name,
+ last_dot + 1,
+ NULL);
}
else if (message_type == DBUS_MESSAGE_TYPE_SIGNAL)
{
- message = dbus_message_new_signal (name);
+ char *last_dot;
+
+ last_dot = strrchr (name, '.');
+ if (last_dot == NULL)
+ {
+ fprintf (stderr, "Must use org.mydomain.Interface.Signal notation, no dot in \"%s\"\n",
+ name);
+ exit (1);
+ }
+ *last_dot = '\0';
+
+ message = dbus_message_new_signal (name, last_dot + 1);
}
else
{