diff options
| author | Havoc Pennington <hp@redhat.com> | 2003-09-30 02:33:11 +0000 | 
|---|---|---|
| committer | Havoc Pennington <hp@redhat.com> | 2003-09-30 02:33:11 +0000 | 
| commit | dfd1292d525d01914141cc86013589c6e0ea9d5c (patch) | |
| tree | fd0c5dd4296d970abcd70f16dd39cca711177df0 /dbus/dbus-hash.c | |
| parent | c30e28fdae3863651cfd7b5d3d0721a1b21a6919 (diff) | |
| parent | 626db3fc5c36879186315fcc6de78824a7b75e9b (diff) | |
2003-09-29  Havoc Pennington  <hp@pobox.com>
	* Merge dbus-object-names branch. To see the entire patch
	do cvs diff -r DBUS_OBJECT_NAMES_BRANCHPOINT -r dbus-object-names,
	it's huuuuge though.
	To revert, I tagged DBUS_BEFORE_OBJECT_NAMES_MERGE.
2003-09-28  Havoc Pennington  <hp@pobox.com>
	* HACKING: update to reflect new server
2003-09-26  Seth Nickell  <seth@gnome.org>
	* python/dbus.py:
	* python/examples/example-signals.py:
	Start implementing some notions of signals. The API
	is really terrible, but they sort of work (with the
	exception of being able to filter by service, and to
	transmit signals *as* a particular service). Need to
	figure out how to make messages come from the service
	we registered :-(
	* python/dbus_bindings.pyx.in:
	Removed duplicate message_handler callbacks.
2003-09-25  Havoc Pennington  <hp@redhat.com>
	* bus/session.conf.in: fix my mess
2003-09-25  Havoc Pennington  <hp@pobox.com>
	* bus/session.conf.in: fix security policy, reported by Seth Nickell
2003-09-25  Seth Nickell  <seth@gnome.org>
	* python/examples/example-service.py:
	Johan notices complete wrong code in example-service, but
	completely wrong in a way that works exactly the same (!).
	Johan is confused, how could this possibly work? Example
	code fails to serve purpose of making things clear.
	Seth fixes.
2003-09-25  Mark McLoughlin  <mark@skynet.ie>
	* doc/dbus-specification.sgml: don't require header fields
	to be 4-byte aligned and specify that fields should be
	distinguished from padding by the fact that zero is not
	a valid field name.
	* doc/TODO: remove re-alignment item and add item to doc
	the OBJECT_PATH type.
	* dbus/dbus-message.c:
	(HeaderField): rename the original member to value_offset
	and introduce a name_offset member to keep track of where
	the field actually begins.
	(adjust_field_offsets): remove.
	(append_int_field), (append_uint_field),
	(append_string_field): don't align the start of the header
	field to a 4-byte boundary.
	(get_next_field): impl finding the next marhsalled field
	after a given field.
	(re_align_field_recurse): impl re-aligning a number of
	already marshalled fields.
	(delete_field): impl deleting a field of any type and
	re-aligning any following fields.
	(delete_int_or_uint_field), (delete_string_field): remove.
	(set_int_field), (set_uint_field): no need to re-check
	that we have the correct type for the field.
	(set_string_field): ditto and impl re-aligning any
	following fields.
	(decode_header_data): update to take into account that
	the fields aren't 4-byte aligned any more and the new
	way to distinguish padding from header fields. Also,
	don't exit when there is too much header padding.
	(process_test_subdir): print the directory.
	(_dbus_message_test): add test to make sure a following
	field is re-aligned correctly after field deletion.
	* dbus/dbus-string.[ch]:
	(_dbus_string_insert_bytes): rename from insert_byte and
	allow the insert of multiple bytes.
	(_dbus_string_test): test inserting multiple bytes.
	* dbus/dbus-marshal.c: (_dbus_marshal_set_string): add
	warning note to docs about having to re-align any
	marshalled values following the string.
	* dbus/dbus-message-builder.c:
	(append_string_field), (_dbus_message_data_load):
	don't align the header field.
	* dbus/dbus-auth.c: (process_test_subdir): print the
	directory.
	* test/break-loader.c: (randomly_add_one_byte): upd. for
	insert_byte change.
	* test/data/invalid-messages/bad-header-field-alignment.message:
	new test case.
	* test/data/valid-messages/unknown-header-field.message: shove
	a dict in the unknown field.
2003-09-25  Seth Nickell  <seth@gnome.org>
	* python/dbus.py:
	* python/dbus_bindings.pyx.in:
	Handle return values.
	* python/examples/example-client.py:
	* python/examples/example-service.py:
	Pass back return values from the service to the client.
2003-09-24  Seth Nickell  <seth@gnome.org>
	* python/dbus.py:
	Connect Object methods (when you are sharing an object) up... pass
	in a list of methods to be shared. Sharing all the methods just
	worked out too weird. You can now create nice Services over the
	DBus in Python. :-)
	* python/dbus_bindings.pyx.in:
	Keep references to user_data tuples passed into C functions so
	Python doesn't garbage collect on us.
	Implement MethodReturn and Error subclasses of Message for creating
	DBusMessage's of those types.
	* python/examples/example-client.py:
	* python/examples/example-service.py:
	Simple example code showing both how create DBus services and objects,
	and how to use them.
2003-09-23  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gproxy.c (dbus_gproxy_manager_filter): implement
2003-09-23  Havoc Pennington  <hp@redhat.com>
	* glib/dbus-gproxy.c (dbus_gproxy_connect_signal): implement
	(dbus_gproxy_disconnect_signal): implement
	(dbus_gproxy_manager_remove_signal_match): implement
	(dbus_gproxy_manager_add_signal_match): implement
	(dbus_gproxy_oneway_call): implement
2003-09-23  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gproxy.c (struct DBusGProxy): convert to a GObject
	subclass. This means dropping the transparent thread safety of the
	proxy; you now need a separate proxy per-thread, or your own
	locking on the proxy. Probably right anyway.
	(dbus_gproxy_ref, dbus_gproxy_unref): nuke, just use g_object_ref
2003-09-22  Havoc Pennington  <hp@redhat.com>
	* glib/dbus-gproxy.c (dbus_gproxy_manager_get): implement
2003-09-21  Seth Nickell  <seth@gnome.org>
        First checkin of the Python bindings.
	* python/.cvsignore:
	* python/Makefile.am:
	* python/dbus_bindings.pyx.in:
	* python/dbus_h_wrapper.h:
	Pieces for Pyrex to operate on, building a dbus_bindings.so
	python module for low-level access to the DBus APIs.
	* python/dbus.py:
	High-level Python module for accessing DBus objects.
	* configure.in:
	* Makefile.am:
	Build stuff for the python bindings.
	* acinclude.m4:
	Extra macro needed for finding the Python C header files.
2003-09-21  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gproxy.c (dbus_gproxy_manager_new): start
	implementing the proxy manager, didn't get very far.
	* dbus/dbus-bus.c (dbus_bus_add_match): new
	(dbus_bus_remove_match): new
	* glib/dbus-gproxy.c (dbus_gproxy_new_for_service): add a
	path_name argument; adjust the other not-yet-implemented
	gproxy constructors to be what I think they should be.
2003-09-21  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-bus.c (dbus_bus_get): set exit_on_disconnect to TRUE
	by default for message bus connections.
	* dbus/dbus-connection.c (dbus_connection_dispatch): exit if
	exit_on_disconnect flag is set and we process the disconnected
	signal.
	(dbus_connection_set_exit_on_disconnect): new function
2003-09-21  Havoc Pennington  <hp@pobox.com>
	Get matching rules mostly working in the bus; only actually
	parsing the rule text remains. However, the client side of
	"signal connections" hasn't been started, this patch is only the
	bus side.
	* dbus/dispatch.c: fix for the matching rules changes
	* bus/driver.c (bus_driver_handle_remove_match)
	(bus_driver_handle_add_match): send an ack reply from these
	method calls
	* glib/dbus-gproxy.c (dbus_gproxy_begin_call): fix order of
	arguments, reported by Seth Nickell
	* bus/config-parser.c (append_rule_from_element): support
	eavesdrop=true|false attribute on policies so match rules
	can be prevented from snooping on the system bus.
	* bus/dbus-daemon-1.1.in: consistently use terminology "sender"
	and "destination" in attribute names; fix some docs bugs;
	add eavesdrop=true|false attribute
	* bus/driver.c (bus_driver_handle_add_match)
	(bus_driver_handle_remove_match): handle AddMatch, RemoveMatch
	messages
	* dbus/dbus-protocol.h (DBUS_SERVICE_ORG_FREEDESKTOP_BROADCAST): get
	rid of broadcast service concept, signals are just always broadcast
	* bus/signals.c, bus/dispatch.c, bus/connection.c, bus/bus.c:
	mostly implement matching rules stuff (currently only exposed as signal
	connections)
2003-09-21  Mark McLoughlin  <mark@skynet.ie>
	* doc/dbus-specification.sgml: Change the header field name
	to be an enum and update the rest of the spec to reference
	the fields using the conventinal name.
	* dbus/dbus-protocol.h: update to reflect the spec.
	* doc/TODO: add item to remove the 4 byte alignment requirement.
	* dbus/dbus-message.c: Remove the code to generalise the
	header/body length and serial number header fields as named
	header fields so we can reference field names using the
	protocol values.
	(append_int_field), (append_uint_field), (append_string_field):
	Append the field name as a byte rather than four chars.
	(delete_int_or_uint_field), (delete_string_field): reflect the
	fact that the field name and typecode now occupy 4 bytes instead
	of 8.
	(decode_string_field), (decode_header_data): update to reflect
	protocol changes and move the field specific encoding from
	decode_string_field() back into decode_header_data().
	* dbus/dbus-internals.[ch]: (_dbus_header_field_to_string):
	Add utility to aid debugging.
	* dbus/dbus-message-builder.c:
	(append_string_field), (_dbus_message_data_load): Update to
	reflect protocol changes; Change the FIELD_NAME directive
	to HEADER_FIELD and allow it to take the field's conventional
	name rather than the actual value.
	* test/data/*/*.message: Update to use HEADER_FIELD instead
	of FIELD_NAME; Always align the header on an 8 byte boundary
	*before* updating the header length.
2003-09-15  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-pending-call.c: add the get/set object data
	boilerplate as for DBusConnection, etc. Use generic object data
	for the notify callback.
	* glib/dbus-gparser.c (parse_node): parse child nodes
	* tools/dbus-viewer.c: more hacking on the dbus-viewer
	* glib/dbus-gutils.c (_dbus_gutils_split_path): add a file to
	contain functions shared between the convenience lib and the
	installed lib
	* glib/Makefile.am (libdbus_glib_1_la_LDFLAGS): add
	-export-symbols-regex to the GLib library
	* dbus/dbus-object-tree.c (_dbus_object_tree_dispatch_and_unlock):
	fix the locking in here, and add a default handler for
	Introspect() that just returns sub-nodes.
2003-09-14  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gthread.c (dbus_g_thread_init): rename to make g_foo
	rather than gfoo consistent
	* glib/dbus-gproxy.h: delete for now, move contents to
	dbus-glib.h, because the include files don't work right since we
	aren't in the dbus/ subdir.
	* glib/dbus-gproxy.c (dbus_gproxy_send): finish implementing
	(dbus_gproxy_end_call): finish
	(dbus_gproxy_begin_call): finish
	* glib/dbus-gmain.c (dbus_set_g_error): new
	* glib/dbus-gobject.c (handle_introspect): include information
	about child nodes in the introspection
	* dbus/dbus-connection.c (dbus_connection_list_registered): new
	function to help in implementation of introspection
	* dbus/dbus-object-tree.c
	(_dbus_object_tree_list_registered_and_unlock): new function
2003-09-12  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gidl.h: add common base class for all the foo_info
	types
        * tools/dbus-viewer.c: add GTK-based introspection UI thingy
	similar to kdcop
	* test/Makefile.am: try test srcdir -ef . in addition to test
	srcdir = ., one of them should work (yeah lame)
        * glib/Makefile.am: build the "idl" parser stuff as a convenience
	library
	* glib/dbus-gparser.h: make description_load routines return
	NodeInfo* not Parser*
	* Makefile.am (SUBDIRS): build test dir after all library dirs
	* configure.in: add GTK+ detection
2003-09-07  Havoc Pennington  <hp@pobox.com>
	* Make Doxygen contented.
2003-09-07  Havoc Pennington  <hp@pobox.com>
	* doc/dbus-specification.sgml: more updates
2003-09-06  Havoc Pennington  <hp@pobox.com>
	* doc/dbus-specification.sgml: partial updates
	* bus/dbus-daemon-1.1.in: fix the config file docs for the
	zillionth time; hopefully I edited the right file this time.
	* bus/config-parser.c (append_rule_from_element): support
	send_type, send_path, receive_type, receive_path
	* bus/policy.c: add message type and path to the list of things
	that can be "firewalled"
2003-09-06  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-connection.c (dbus_connection_register_fallback): add this
	(dbus_connection_register_object_path): make this not handle
	messages to paths below the given path
2003-09-03  Havoc Pennington  <hp@pobox.com>
	* test/glib/Makefile.am: add this with random glib-linked test
	programs
	* glib/Makefile.am: remove the random test programs from here,
	leave only the unit tests
	* glib/dbus-gobject.c (_dbus_gobject_test): add test for
	uscore/javacaps conversion, and fix
	(get_object_property, set_object_property): change to .NET
	convention for mapping props to methods, set_FooBar/get_FooBar,
	since one language has such a convention we may as well copy it.
	Plus real methods in either getFooBar or get_foo_bar style won't
	collide with this convention.
2003-09-01  Havoc Pennington  <hp@pobox.com>
	* glib/dbus-gparser.c: implement
	* glib/dbus-gobject.c: start implementing skeletons support
	* configure.in: when disabling checks/assert, also define
	G_DISABLE_ASSERT and G_DISABLE_CHECKS
2003-09-01  Havoc Pennington  <hp@pobox.com>
	* glib/Makefile.am: rearrange a bunch of files and get "make
	check" framework set up
2003-08-31  Havoc Pennington  <hp@pobox.com>
	* fix build with --disable-tests
2003-08-30  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-connection.c: purge DBusMessageHandler
	* dbus/dbus-message-handler.c: remove DBusMessageHandler, just
	use callbacks everywhere
2003-08-30  Havoc Pennington  <hp@pobox.com>
	* test/data/valid-config-files/system.d/test.conf: change to
	root for the user so warnings don't get printed
	* dbus/dbus-message.c: add dbus_message_get_path,
	dbus_message_set_path
	* dbus/dbus-object-tree.c (do_test_dispatch): add test of
	dispatching to a path
	* dbus/dbus-string.c (_dbus_string_validate_path): add
	* dbus/dbus-marshal.c (_dbus_demarshal_object_path): implement
	(_dbus_marshal_object_path): implement
	* dbus/dbus-protocol.h (DBUS_HEADER_FIELD_PATH): new header field
	to contain the path to the target object
	(DBUS_HEADER_FIELD_SENDER_SERVICE): rename
	DBUS_HEADER_FIELD_SENDER to explicitly say it's the sender service
2003-08-30  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-tree.c: write tests and fix the discovered bugs
2003-08-29  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-tree.c: modify to allow overlapping paths to be
	registered
	(struct DBusObjectSubtree): shrink this
	a lot, since we may have a lot of them
	(_dbus_object_tree_free_all_unlocked): implement
	(_dbus_object_tree_dispatch_and_unlock): implement
2003-08-29  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-internals.h: fix _DBUS_N_GLOBAL_LOCKS
2003-08-28  Havoc Pennington  <hp@pobox.com>
	purge DBusObjectID
	* dbus/dbus-connection.c: port to no ObjectID, create a
	DBusObjectTree, rename ObjectTree to ObjectPath in public API
	* dbus/dbus-connection.h (struct DBusObjectTreeVTable): delete
	everything except UnregisterFunction and MessageFunction
	* dbus/dbus-marshal.c: port away from DBusObjectID,
	add DBUS_TYPE_OBJECT_PATH
	* dbus/dbus-object-registry.[hc], dbus/dbus-object.[hc],
	dbus/dbus-objectid.[hc]: remove these, we are moving to
	path-based object IDs
2003-08-25  Havoc Pennington  <hp@pobox.com>
        Just noticed that dbus_message_test is hosed, I wonder when I
	broke that. I thought make check was passing earlier...
	* dbus/dbus-object-tree.c: add new "object tree" to match DCOP
	container tree, will replace most of dbus-object-registry
	* dbus/dbus-string.c (_dbus_string_append_printf_valist): fix C99
	screwup
2003-08-19  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-message.c (decode_string_field): support FIELD_SENDER
	(dbus_message_is_error): fix this function
	* bus/dbus-daemon-1.1: clarify logic on when <deny>/<allow> rules
	match
	* bus/policy.c (bus_client_policy_check_can_receive): fix code to
	reflect clarified man page
	(bus_client_policy_check_can_send): ditto
	* bus/session.conf.in: fixup
	* bus/system.conf.in: fixup
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
	work. What are branches for if not broken code? ;-)
	* dbus/dbus-protocol.h: remove DBUS_HEADER_FIELD_NAME, add
	DBUS_HEADER_FIELD_INTERFACE, DBUS_HEADER_FIELD_MEMBER,
	DBUS_HEADER_FIELD_ERROR_NAME
	* dbus/dbus-hash.c: Introduce DBUS_HASH_TWO_STRINGS as hack to use
	for the interface+member pairs
	(string_hash): change to use g_str_hash algorithm
	(find_direct_function, find_string_function): refactor these to
	share most code.
	* dbus/dbus-message.c: port all of this over to support
	interface/member fields instead of name field
	* dbus/dbus-object-registry.c: port over
	* dbus/dbus-string.c (_dbus_string_validate_interface): rename
	from _dbus_string_validate_name
	* bus/dbus-daemon-1.1: change file format for the
	<deny>/<allow> stuff to match new message naming scheme
	* bus/policy.c: port over
	* bus/config-parser.c: parse new format
2003-08-16  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-registry.c (add_and_remove_objects): remove
	broken assertion
	* glib/dbus-gproxy.c: some hacking
2003-08-15  Havoc Pennington  <hp@redhat.com>
	* dbus/dbus-pending-call.c (dbus_pending_call_block): implement
	* dbus/dbus-connection.c
	(dbus_connection_send_with_reply_and_block): factor out internals;
	change to convert any error replies to DBusError instead of
	returning them as a message
2003-08-15  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-connection.c,
	dbus/dbus-pending-call.c: Finish the pending call stuff
2003-08-14  Havoc Pennington  <hp@redhat.com>
	* dbus/dbus-pending-call.c: start on new object that will replace
	DBusMessageHandler and ReplyHandlerData for tracking outstanding
	replies
	* dbus/dbus-gproxy.c: start on proxy object used to communicate
	with remote interfaces
	* dbus/dbus-gidl.c: do the boring boilerplate in here
2003-08-12  Havoc Pennington  <hp@pobox.com>
	* bus/dispatch.c (bus_dispatch): make this return proper
	DBusHandlerResult to avoid DBUS_ERROR_UNKNOWN_METHOD
	* dbus/dbus-errors.c (dbus_set_error): use
	_dbus_string_append_printf_valist
	* dbus/dbus-string.c (_dbus_string_append_printf_valist)
	(_dbus_string_append_printf): new
	* dbus/dbus-errors.h (DBUS_ERROR_UNKNOWN_MESSAGE): change to
	UNKNOWN_METHOD
	* dbus/dbus-connection.c (dbus_connection_dispatch): handle
	DBUS_HANDLER_RESULT_NEED_MEMORY; send default error reply if a
	message is unhandled.
2003-08-11  Havoc Pennington  <hp@pobox.com>
	* bus/test.c (client_disconnect_handler): change to return
	HANDLED (would have been REMOVE_MESSAGE)
	* dbus/dbus-object.h (enum DBusHandlerResult): rename to
	HANDLED/NOT_YET_HANDLED instead of
	REMOVE_MESSAGE/ALLOW_MORE_HANDLERS to make it clearer how it
	should be used.
2003-08-10  Havoc Pennington  <hp@pobox.com>
	* tools/dbus-send.c (main): add --type argument, for now
	supporting only method_call and signal types.
	* tools/dbus-print-message.c: print message type
	* dbus/dbus-connection.c (_dbus_connection_new_for_transport):
	init connection->objects
	* doc/dbus-specification.sgml: fix sgml
	* bus/*.c: port over to object-instance API changes
	* test/test-service.c: ditto
	* dbus/dbus-message.c (dbus_message_create_header): allow #NULL
	name, we will have to fix up the rest of the code to also handle
	this
	(dbus_message_new): generic message-creation call
	(set_string_field): allow appending name field
2003-08-06  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-registry.c: implement signal connection
	and dispatch
	* dbus/dbus-connection.c (_dbus_connection_unref_unlocked): new
	* dbus/dbus-internals.c (_dbus_memdup): new function
2003-08-02  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-message.c (dbus_message_get_no_reply)
	(dbus_message_set_no_reply): add these and remove
	set_is_error/get_is_error
	* dbus/dbus-protocol.h, doc/dbus-specification.sgml:
	remove the ERROR flag, since there's now an ERROR type
2003-08-01  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-registry.c (_dbus_object_registry_handle_and_unlock):
	implement
	* dbus/dbus-message.c (dbus_message_get_type): new function
	* doc/dbus-specification.sgml: add "type" byte to messages
2003-08-01  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-protocol.h (DBUS_MESSAGE_TYPE_*): introduce
	a message type enum to distinguish kinds of message
	(DBUS_HEADER_FLAG_NO_REPLY_EXPECTED): flag for a message
	that need not be replied to
2003-08-01  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-marshal.c: adapt to DBusObjectID changes
	(unpack_8_octets): fix no-64-bit-int bug
	* dbus/dbus-object-registry.c (validate_id): validate the
	connection ID bits, not just the instance ID.
	* dbus/dbus-connection.c (_dbus_connection_init_id): initialize
	the connection-global 33 bits of the object ID
	* dbus/dbus-object-registry.c (info_from_entry): fill in
	object ID in the new way
	* dbus/dbus-objectid.h: rather than high/low bits, specifically
	define server/client/instance bits.
2003-07-30  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-connection.c (dbus_connection_register_object): fix
	build
2003-07-13  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object.h (struct DBusObjectVTable): add padding
	fields to DBusObjectVTable and DBusObjectInfo
2003-07-12  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object-registry.c: implement unit test,
	fix bugs discovered in process
	* dbus/dbus-connection.c: remove handler_table and
	register_handler(), add DBusObjectRegistry usage
	* dbus/dbus-objectid.c (dbus_object_id_is_null)
	(dbus_object_id_set_null): new functions
2003-07-08  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object.c: implement some of this
	* dbus/dbus-object-registry.c
	(_dbus_object_registry_add_and_unlock): fill in the object_id out
	param
	(_dbus_object_registry_new): handle OOM
2003-07-08  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-object.h: sketch out an API for registering objects
	with a connection, that allows us to use as little as 24 bytes
	per object and lets application code represent an object in
	any conceivable way.
	* dbus/dbus-object-registry.c: implement the hard bits of the
	DBusConnection aspect of object API. Not yet wired up.
2003-07-06  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-marshal.c (_dbus_marshal_set_object_id): new function
	(_dbus_marshal_object_id): new
	(_dbus_demarshal_object_id): new
	(_dbus_marshal_get_arg_end_pos): support object ID type, and
	consolidate identical switch cases. Don't conditionalize handling
	of DBUS_TYPE_UINT64, need to handle the type always.
	(_dbus_marshal_validate_arg): consolidate identical cases, and
	handle DBUS_TYPE_OBJECT_ID
	* dbus/dbus-objectid.c: new file with DBusObjectID data type.
	* dbus/dbus-protocol.h: add DBUS_TYPE_OBJECT_ID
2003-09-28  Havoc Pennington  <hp@pobox.com>
	* real 0.13 release
2003-09-28  Havoc Pennington  <hp@pobox.com>
	* doc/Makefile.am (dbus-specification.html): testing a funky hack
	to work with Debian db2html
2003-09-28  Havoc Pennington  <hp@pobox.com>
	* configure.in: 0.13
	* doc/Makefile.am (dbus-test-plan.html): accept nonexistence of
	stylesheet-images for benefit of Debian
	Change back to using filesystem-linked sockets for the system
	bus, so only root can create the default system bus address.
	* bus/system.conf.in: change to use
	DBUS_SYSTEM_BUS_DEFAULT_ADDRESS
	* dbus/Makefile.am (INCLUDES): remove DBUS_SYSTEM_BUS_PATH define
	from here.
	* configure.in: define DBUS_SYSTEM_BUS_DEFAULT_ADDRESS
	here, and AC_DEFINE DBUS_SYSTEM_PATH
2003-08-09  Anders Carlsson  <andersca@codefactory.se>
	* doc/TODO:
	* doc/busconfig.dtd:
	Add busconfig DTD.
2003-08-09  Anders Carlsson  <andersca@codefactory.se>
	* doc/dbus-specification.sgml:
	Add activation reply values.
2003-08-05  Havoc Pennington  <hp@redhat.com>
	* configure.in: 0.12
2003-08-05  Anders Carlsson  <andersca@codefactory.se>
	* glib/dbus-gmain.c: (watch_fd_new), (watch_fd_ref),
	(watch_fd_unref), (dbus_gsource_check), (dbus_gsource_dispatch),
	(add_watch), (remove_watch), (create_source):
	Refcount fds, fixes some reentrancy issues.
2003-07-30  Havoc Pennington  <hp@redhat.com>
	* dbus/dbus-bus.c (init_connections_unlocked): fix default system
	bus address to be abstract if we have abstract sockets
	* NEWS: update
2003-07-28  Havoc Pennington  <hp@redhat.com>
	* bus/messagebus.in: fix to avoid processname/servicename
	confusion, from Michael Kearey
	https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=100965
2003-07-23  Havoc Pennington  <hp@pobox.com>
	* dbus/dbus-message.c (dbus_message_iter_get_named):
	fix from Andy Hanton to remove broken "+1"
2003-07-16  Havoc Pennington  <hp@pobox.com>
	* tools/dbus-launch.c (babysit): close stdout/stderr in the
	babysitter process, as suggested by Thomas Leonard, so
	an "eval `dbus-launch --exit-with-session`" will actually
	return
2003-07-16  Havoc Pennington  <hp@pobox.com>
	* configure.in: print out EXPANDED_* variables in the summary at
	the end; clean up the code that computes EXPANDED_ variables and
	get the ones using exec_prefix right. Should make things work
	when you build without --prefix
Diffstat (limited to 'dbus/dbus-hash.c')
| -rw-r--r-- | dbus/dbus-hash.c | 386 | 
1 files changed, 298 insertions, 88 deletions
| diff --git a/dbus/dbus-hash.c b/dbus/dbus-hash.c index 2c410010..d35087b4 100644 --- a/dbus/dbus-hash.c +++ b/dbus/dbus-hash.c @@ -221,26 +221,32 @@ typedef struct    int n_entries_on_init;     /**< used to detect table resize since initialization */  } DBusRealHashIter; -static DBusHashEntry* find_direct_function (DBusHashTable          *table, -                                            void                   *key, -                                            dbus_bool_t             create_if_not_found, -                                            DBusHashEntry        ***bucket, -                                            DBusPreallocatedHash   *preallocated); -static DBusHashEntry* find_string_function (DBusHashTable          *table, -                                            void                   *key, -                                            dbus_bool_t             create_if_not_found, -                                            DBusHashEntry        ***bucket, -                                            DBusPreallocatedHash   *preallocated); -static unsigned int   string_hash          (const char             *str); -static void           rebuild_table        (DBusHashTable          *table); -static DBusHashEntry* alloc_entry          (DBusHashTable          *table); -static void           remove_entry         (DBusHashTable          *table, -                                            DBusHashEntry         **bucket, -                                            DBusHashEntry          *entry); -static void           free_entry           (DBusHashTable          *table, -                                            DBusHashEntry          *entry); -static void           free_entry_data      (DBusHashTable          *table, -                                            DBusHashEntry          *entry); +static DBusHashEntry* find_direct_function      (DBusHashTable          *table, +                                                 void                   *key, +                                                 dbus_bool_t             create_if_not_found, +                                                 DBusHashEntry        ***bucket, +                                                 DBusPreallocatedHash   *preallocated); +static DBusHashEntry* find_string_function      (DBusHashTable          *table, +                                                 void                   *key, +                                                 dbus_bool_t             create_if_not_found, +                                                 DBusHashEntry        ***bucket, +                                                 DBusPreallocatedHash   *preallocated); +static DBusHashEntry* find_two_strings_function (DBusHashTable          *table, +                                                 void                   *key, +                                                 dbus_bool_t             create_if_not_found, +                                                 DBusHashEntry        ***bucket, +                                                 DBusPreallocatedHash   *preallocated); +static unsigned int   string_hash               (const char             *str); +static unsigned int   two_strings_hash          (const char             *str); +static void           rebuild_table             (DBusHashTable          *table); +static DBusHashEntry* alloc_entry               (DBusHashTable          *table); +static void           remove_entry              (DBusHashTable          *table, +                                                 DBusHashEntry         **bucket, +                                                 DBusHashEntry          *entry); +static void           free_entry                (DBusHashTable          *table, +                                                 DBusHashEntry          *entry); +static void           free_entry_data           (DBusHashTable          *table, +                                                 DBusHashEntry          *entry);  /** @} */ @@ -323,6 +329,9 @@ _dbus_hash_table_new (DBusHashType     type,      case DBUS_HASH_STRING:        table->find_function = find_string_function;        break; +    case DBUS_HASH_TWO_STRINGS: +      table->find_function = find_two_strings_function; +      break;      default:        _dbus_assert_not_reached ("Unknown hash table type");        break; @@ -685,6 +694,24 @@ _dbus_hash_iter_get_string_key (DBusHashIter *iter)  }  /** + * Gets the key for the current entry. + * Only works for hash tables of type #DBUS_HASH_TWO_STRINGS + * @param iter the hash table iterator. + */ +const char* +_dbus_hash_iter_get_two_strings_key (DBusHashIter *iter) +{ +  DBusRealHashIter *real; + +  real = (DBusRealHashIter*) iter; + +  _dbus_assert (real->table != NULL); +  _dbus_assert (real->entry != NULL); + +  return real->entry->key; +} + +/**   * A low-level but efficient interface for manipulating the hash   * table.  It's efficient because you can get, set, and optionally   * create the hash entry while only running the hash function one @@ -803,64 +830,64 @@ add_entry (DBusHashTable        *table,    return entry;  } +/* This is g_str_hash from GLib which was + * extensively discussed/tested/profiled + */  static unsigned int  string_hash (const char *str)  { -  register unsigned int result; -  register int c; +  const char *p = str; +  unsigned int h = *p; -  /* -   * I tried a zillion different hash functions and asked many other -   * people for advice.  Many people had their own favorite functions, -   * all different, but no-one had much idea why they were good ones. -   * I chose the one below (multiply by 9 and add new character) -   * because of the following reasons: -   * -   * 1. Multiplying by 10 is perfect for keys that are decimal strings, -   *    and multiplying by 9 is just about as good. -   * 2. Times-9 is (shift-left-3) plus (old).  This means that each -   *    character's bits hang around in the low-order bits of the -   *    hash value for ever, plus they spread fairly rapidly up to -   *    the high-order bits to fill out the hash value.  This seems -   *    works well both for decimal and non-decimal strings. -   */ +  if (h) +    for (p += 1; *p != '\0'; p++) +      h = (h << 5) - h + *p; -  /* FIXME the hash function in GLib is better than this one */ -   -  result = 0; -  while (TRUE) -    { -      c = *str; -      str++; -      if (c == 0) -        break; -       -      result += (result << 3) + c; -    } +  return h; +} + +/* This hashes a memory block with two nul-terminated strings + * in it, used in dbus-object-registry.c at the moment. + */ +static unsigned int +two_strings_hash (const char *str) +{ +  const char *p = str; +  unsigned int h = *p; + +  if (h) +    for (p += 1; *p != '\0'; p++) +      h = (h << 5) - h + *p; + +  for (p += 1; *p != '\0'; p++) +    h = (h << 5) - h + *p; -  return result; +  return h;  } +/** Key comparison function */ +typedef int (* KeyCompareFunc) (const void *key_a, const void *key_b); +  static DBusHashEntry* -find_string_function (DBusHashTable        *table, -                      void                 *key, -                      dbus_bool_t           create_if_not_found, -                      DBusHashEntry      ***bucket, -                      DBusPreallocatedHash *preallocated) +find_generic_function (DBusHashTable        *table, +                       void                 *key, +                       unsigned int          idx, +                       KeyCompareFunc        compare_func, +                       dbus_bool_t           create_if_not_found, +                       DBusHashEntry      ***bucket, +                       DBusPreallocatedHash *preallocated)  {    DBusHashEntry *entry; -  unsigned int idx;    if (bucket)      *bucket = NULL; -   -  idx = string_hash (key) & table->mask;    /* Search all of the entries in this bucket. */    entry = table->buckets[idx];    while (entry != NULL)      { -      if (strcmp (key, entry->key) == 0) +      if ((compare_func == NULL && key == entry->key) || +          (compare_func != NULL && (* compare_func) (key, entry->key) == 0))          {            if (bucket)              *bucket = &(table->buckets[idx]); @@ -878,50 +905,75 @@ find_string_function (DBusHashTable        *table,      entry = add_entry (table, idx, key, bucket, preallocated);    else if (preallocated)      _dbus_hash_table_free_preallocated_entry (table, preallocated); - +      return entry;  }  static DBusHashEntry* -find_direct_function (DBusHashTable        *table, +find_string_function (DBusHashTable        *table,                        void                 *key,                        dbus_bool_t           create_if_not_found,                        DBusHashEntry      ***bucket,                        DBusPreallocatedHash *preallocated)  { -  DBusHashEntry *entry;    unsigned int idx; +   +  idx = string_hash (key) & table->mask; -  if (bucket) -    *bucket = NULL; +  return find_generic_function (table, key, idx, +                                (KeyCompareFunc) strcmp, create_if_not_found, bucket, +                                preallocated); +} + +static int +two_strings_cmp (const char *a, +                 const char *b) +{ +  size_t len_a; +  size_t len_b; +  int res; -  idx = RANDOM_INDEX (table, key) & table->mask; +  res = strcmp (a, b); +  if (res != 0) +    return res; -  /* Search all of the entries in this bucket. */ -  entry = table->buckets[idx]; -  while (entry != NULL) -    { -      if (key == entry->key) -        { -          if (bucket) -            *bucket = &(table->buckets[idx]); +  len_a = strlen (a); +  len_b = strlen (b); -          if (preallocated) -            _dbus_hash_table_free_preallocated_entry (table, preallocated); -           -          return entry; -        } -       -      entry = entry->next; -    } +  return strcmp (a + len_a + 1, b + len_b + 1); +} -  /* Entry not found.  Add a new one to the bucket. */ -  if (create_if_not_found) -    entry = add_entry (table, idx, key, bucket, preallocated); -  else if (preallocated) -    _dbus_hash_table_free_preallocated_entry (table, preallocated); +static DBusHashEntry* +find_two_strings_function (DBusHashTable        *table, +                           void                 *key, +                           dbus_bool_t           create_if_not_found, +                           DBusHashEntry      ***bucket, +                           DBusPreallocatedHash *preallocated) +{ +  unsigned int idx; +   +  idx = two_strings_hash (key) & table->mask; -  return entry; +  return find_generic_function (table, key, idx, +                                (KeyCompareFunc) two_strings_cmp, create_if_not_found, bucket, +                                preallocated); +} + +static DBusHashEntry* +find_direct_function (DBusHashTable        *table, +                      void                 *key, +                      dbus_bool_t           create_if_not_found, +                      DBusHashEntry      ***bucket, +                      DBusPreallocatedHash *preallocated) +{ +  unsigned int idx; +   +  idx = RANDOM_INDEX (table, key) & table->mask; + + +  return find_generic_function (table, key, idx, +                                NULL, create_if_not_found, bucket, +                                preallocated);  }  static void @@ -1021,6 +1073,9 @@ rebuild_table (DBusHashTable *table)              case DBUS_HASH_STRING:                idx = string_hash (entry->key) & table->mask;                break; +            case DBUS_HASH_TWO_STRINGS: +              idx = two_strings_hash (entry->key) & table->mask; +              break;              case DBUS_HASH_INT:              case DBUS_HASH_ULONG:              case DBUS_HASH_POINTER: @@ -1070,6 +1125,31 @@ _dbus_hash_table_lookup_string (DBusHashTable *table,  }  /** + * Looks up the value for a given string in a hash table + * of type #DBUS_HASH_TWO_STRINGS. Returns %NULL if the value + * is not present. (A not-present entry is indistinguishable + * from an entry with a value of %NULL.) + * @param table the hash table. + * @param key the string to look up. + * @returns the value of the hash entry. + */ +void* +_dbus_hash_table_lookup_two_strings (DBusHashTable *table, +                                     const char    *key) +{ +  DBusHashEntry *entry; + +  _dbus_assert (table->key_type == DBUS_HASH_TWO_STRINGS); +   +  entry = (* table->find_function) (table, (char*) key, FALSE, NULL, NULL); + +  if (entry) +    return entry->value; +  else +    return NULL; +} + +/**   * Looks up the value for a given integer in a hash table   * of type #DBUS_HASH_INT. Returns %NULL if the value   * is not present. (A not-present entry is indistinguishable @@ -1184,6 +1264,34 @@ _dbus_hash_table_remove_string (DBusHashTable *table,   * @returns #TRUE if the entry existed   */  dbus_bool_t +_dbus_hash_table_remove_two_strings (DBusHashTable *table, +                                     const char    *key) +{ +  DBusHashEntry *entry; +  DBusHashEntry **bucket; +   +  _dbus_assert (table->key_type == DBUS_HASH_TWO_STRINGS); +   +  entry = (* table->find_function) (table, (char*) key, FALSE, &bucket, NULL); + +  if (entry) +    { +      remove_entry (table, bucket, entry); +      return TRUE; +    } +  else +    return FALSE; +} + +/** + * Removes the hash entry for the given key. If no hash entry + * for the key exists, does nothing. + * + * @param table the hash table. + * @param key the hash key. + * @returns #TRUE if the entry existed + */ +dbus_bool_t  _dbus_hash_table_remove_int (DBusHashTable *table,                               int            key)  { @@ -1312,6 +1420,47 @@ _dbus_hash_table_insert_string (DBusHashTable *table,   * @param value the hash entry value.   */  dbus_bool_t +_dbus_hash_table_insert_two_strings (DBusHashTable *table, +                                     char          *key, +                                     void          *value) +{ +  DBusHashEntry *entry; +   +  _dbus_assert (table->key_type == DBUS_HASH_TWO_STRINGS); +   +  entry = (* table->find_function) (table, key, TRUE, NULL, NULL); + +  if (entry == NULL) +    return FALSE; /* no memory */ + +  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; +} + +/** + * Creates a hash entry with the given key and value. + * The key and value are not copied; they are stored + * in the hash table by reference. If an entry with the + * given key already exists, the previous key and value + * are overwritten (and freed if the hash table has + * a key_free_function and/or value_free_function). + * + * Returns #FALSE if memory for the new hash entry + * can't be allocated. + *  + * @param table the hash table. + * @param key the hash entry key. + * @param value the hash entry value. + */ +dbus_bool_t  _dbus_hash_table_insert_int (DBusHashTable *table,                               int            key,                               void          *value) @@ -1536,6 +1685,28 @@ count_entries (DBusHashTable *table)    return count;  } +/* Copy the foo\0bar\0 double string thing */ +static char* +_dbus_strdup2 (const char *str) +{ +  size_t len; +  char *copy; +   +  if (str == NULL) +    return NULL; +   +  len = strlen (str); +  len += strlen ((str + len + 1)); + +  copy = dbus_malloc (len + 2); +  if (copy == NULL) +    return NULL; + +  memcpy (copy, str, len + 2); +   +  return copy; +} +  /**   * @ingroup DBusHashTableInternals   * Unit test for DBusHashTable @@ -1548,6 +1719,7 @@ _dbus_hash_test (void)    DBusHashTable *table1;    DBusHashTable *table2;    DBusHashTable *table3; +  DBusHashTable *table4;    DBusHashIter iter;  #define N_HASH_KEYS 5000    char **keys; @@ -1569,7 +1741,16 @@ _dbus_hash_test (void)    i = 0;    while (i < N_HASH_KEYS)      { -      sprintf (keys[i], "Hash key %d", i);  +      int len; + +      /* all the hash keys are TWO_STRINGS, but +       * then we can also use those as regular strings. +       */ +       +      len = sprintf (keys[i], "Hash key %d", i); +      sprintf (keys[i] + len + 1, "Two string %d", i); +      _dbus_assert (*(keys[i] + len) == '\0'); +      _dbus_assert (*(keys[i] + len + 1) != '\0');        ++i;      }    printf ("... done.\n"); @@ -1588,6 +1769,12 @@ _dbus_hash_test (void)                                   NULL, dbus_free);    if (table3 == NULL)      goto out; + +  table4 = _dbus_hash_table_new (DBUS_HASH_TWO_STRINGS, +                                 dbus_free, dbus_free); +  if (table4 == NULL) +    goto out; +    /* Insert and remove a bunch of stuff, counting the table in between     * to be sure it's not broken and that iteration works @@ -1624,10 +1811,22 @@ _dbus_hash_test (void)        if (!_dbus_hash_table_insert_ulong (table3,                                            i, value))          goto out; + +      key = _dbus_strdup2 (keys[i]); +      if (key == NULL) +        goto out; +      value = _dbus_strdup ("Value!"); +      if (value == NULL) +        goto out; +       +      if (!_dbus_hash_table_insert_two_strings (table4, +                                                key, value)) +        goto out;        _dbus_assert (count_entries (table1) == i + 1);        _dbus_assert (count_entries (table2) == i + 1);        _dbus_assert (count_entries (table3) == i + 1); +      _dbus_assert (count_entries (table4) == i + 1);        value = _dbus_hash_table_lookup_string (table1, keys[i]);        _dbus_assert (value != NULL); @@ -1640,6 +1839,10 @@ _dbus_hash_test (void)        value = _dbus_hash_table_lookup_ulong (table3, i);        _dbus_assert (value != NULL);        _dbus_assert (strcmp (value, keys[i]) == 0); + +      value = _dbus_hash_table_lookup_two_strings (table4, keys[i]); +      _dbus_assert (value != NULL); +      _dbus_assert (strcmp (value, "Value!") == 0);        ++i;      } @@ -1654,9 +1857,13 @@ _dbus_hash_test (void)        _dbus_hash_table_remove_ulong (table3, i);  +      _dbus_hash_table_remove_two_strings (table4, +                                           keys[i]); +              _dbus_assert (count_entries (table1) == i);        _dbus_assert (count_entries (table2) == i);        _dbus_assert (count_entries (table3) == i); +      _dbus_assert (count_entries (table4) == i);        --i;      } @@ -1664,12 +1871,15 @@ _dbus_hash_test (void)    _dbus_hash_table_ref (table1);    _dbus_hash_table_ref (table2);    _dbus_hash_table_ref (table3); +  _dbus_hash_table_ref (table4);    _dbus_hash_table_unref (table1);    _dbus_hash_table_unref (table2);    _dbus_hash_table_unref (table3); +  _dbus_hash_table_unref (table4);    _dbus_hash_table_unref (table1);    _dbus_hash_table_unref (table2);    _dbus_hash_table_unref (table3); +  _dbus_hash_table_unref (table4);    table3 = NULL;    /* Insert a bunch of stuff then check | 
