From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jan Moringen Newsgroups: gmane.emacs.devel Subject: Re: DBus methods without name grabbing Date: Tue, 04 Jan 2011 03:42:52 +0100 Message-ID: <7758_1294108975_ZZh0g0_f99~qx.00_1294108972.8785.33.camel@gunhead> References: <19384_1294002375_ZZh0g13mCbLkV.00_1294002364.12635.44.camel@gunhead> <87lj32kuyz.fsf@gmx.de> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_aLrE7/CBJ75MK8JFlkuB+g)" X-Trace: dough.gmane.org 1294109015 7275 80.91.229.12 (4 Jan 2011 02:43:35 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 4 Jan 2011 02:43:35 +0000 (UTC) Cc: emacs-devel@gnu.org To: Michael Albinus Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Jan 04 03:43:29 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PZwrj-00024X-En for ged-emacs-devel@m.gmane.org; Tue, 04 Jan 2011 03:43:26 +0100 Original-Received: from localhost ([127.0.0.1]:57071 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PZwri-0003rI-9C for ged-emacs-devel@m.gmane.org; Mon, 03 Jan 2011 21:43:14 -0500 Original-Received: from [140.186.70.92] (port=49928 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PZwrV-0003mt-23 for emacs-devel@gnu.org; Mon, 03 Jan 2011 21:43:03 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PZwrS-0006Dv-N9 for emacs-devel@gnu.org; Mon, 03 Jan 2011 21:43:00 -0500 Original-Received: from mux2-unibi-smtp.hrz.uni-bielefeld.de ([129.70.204.73]:62871) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PZwrS-0006De-3A for emacs-devel@gnu.org; Mon, 03 Jan 2011 21:42:58 -0500 Original-Received: from pmxchannel-daemon.mux2-unibi-smtp.hrz.uni-bielefeld.de by mux2-unibi-smtp.hrz.uni-bielefeld.de (Sun Java(tm) System Messaging Server 6.3-6.03 (built Mar 14 2008; 32bit)) id <0LEH00J008VJBI00@mux2-unibi-smtp.hrz.uni-bielefeld.de> for emacs-devel@gnu.org; Tue, 04 Jan 2011 03:42:55 +0100 (CET) Original-Received: from [192.168.2.100] ([217.25.168.236]) by mux2-unibi-smtp.hrz.uni-bielefeld.de (Sun Java(tm) System Messaging Server 6.3-6.03 (built Mar 14 2008; 32bit)) with ESMTPPSA id <0LEH0005F8VHGS60@mux2-unibi-smtp.hrz.uni-bielefeld.de>; Tue, 04 Jan 2011 03:42:54 +0100 (CET) In-reply-to: <87lj32kuyz.fsf@gmx.de> X-Mailer: Evolution 2.30.3 X-EnvFrom: jan.moringen@uni-bielefeld.de X-PMX-Version: 5.5.9.395186, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2011.1.4.23018, pmx9 X-Connecting-IP: 217.25.168.236 X-detected-operating-system: by eggs.gnu.org: Solaris 10 (beta) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:134234 Archived-At: --Boundary_(ID_aLrE7/CBJ75MK8JFlkuB+g) Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT Hi Michael, thanks for the helpful reply. An updated patch is attached. There seems to be some oddities concerning the ChangeLog, I don't know where these come from. > In general, I agree with your proposal. I have some few comments: > > - The optional parameter in `dbus-register-method' and > `dbus-register-property' shall be called `dont-register-service'. This > would fit the dbus terminology we use so far. Done. > - We might introduce a new function `dbus-register-service' (in dbusbind.c). > It could offer optional argument flags, a list of the supported flags > of "org.freedesktop.DBus.RequestName" > (DBUS_NAME_FLAG_ALLOW_REPLACEMENT, DBUS_NAME_FLAG_REPLACE_EXISTING, > DBUS_NAME_FLAG_DO_NOT_QUEUE). This function shall be called in > `dbus-register-method' and `dbus-register-property' when > `dont-register-service' is nil. Btw, the function > `dbus-unregister-service' exists already ... I would rather tackle this change in a separate patch later. > - It would be great, if you could add also changed doc strings, changed > dbus.texi, ChangeLog and etc/NEWS entries. Done. > > === modified file 'src/dbusbind.c' > > --- src/dbusbind.c 2010-10-01 13:56:33 +0000 > > +++ src/dbusbind.c 2010-10-03 02:17:34 +0000 > > @@ -1983,10 +1983,16 @@ > > > > /* Request the known name from the bus. We can ignore the result, > > it is set to -1 if there is an error - kind of redundancy. */ > > - dbus_error_init (&derror); > > - result = dbus_bus_request_name (connection, SDATA (service), 0, &derror); > > - if (dbus_error_is_set (&derror)) > > - XD_ERROR (derror); > > + if (!dont_request_name || NILP (dont_request_name)) > > dont_request_name is a Lisp object, it is nil when not used in the > call. You shall use > > if (NILP (dont_request_name)) Done. Kind regards, Jan --Boundary_(ID_aLrE7/CBJ75MK8JFlkuB+g) Content-type: text/x-patch; name=dbus-dont-register-service.patch; charset=us-ascii Content-transfer-encoding: 7BIT Content-disposition: attachment; filename=dbus-dont-register-service.patch # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jan.moringen@uni-bielefeld.de-20110104023841-\ # k6faivnl513kq9ng # target_branch: bzr://bzr.savannah.gnu.org/emacs/trunk/ # testament_sha1: f899596030b46b47165b0dff53cb9e67f28ceaff # timestamp: 2011-01-04 03:40:18 +0100 # base_revision_id: yamaoka@jpl.org-20110104022415-mkhshvn1pqc40zw6 # # Begin patch === modified file 'doc/misc/dbus.texi' --- doc/misc/dbus.texi 2010-11-10 08:41:53 +0000 +++ doc/misc/dbus.texi 2011-01-04 02:38:41 +0000 @@ -1264,7 +1264,7 @@ string. @end deffn -@defun dbus-register-method bus service path interface method handler +@defun dbus-register-method bus service path interface method handler dont-register-service With this function, an application registers @var{method} on the D-Bus @var{bus}. @@ -1272,10 +1272,11 @@ @code{:session}. @var{service} is the D-Bus service name of the D-Bus object -@var{method} is registered for. It must be a known name. +@var{method} is registered for. It must be a known name (See +discussion of @var{dont-register-service} below). -@var{path} is the D-Bus object path @var{service} is -registered. +@var{path} is the D-Bus object path @var{service} is registered (See +discussion of @var{dont-register-service} below). @var{interface} is the interface offered by @var{service}. It must provide @var{method}. @@ -1294,6 +1295,13 @@ In case @var{handler} shall return a reply message with an empty argument list, @var{handler} must return the symbol @code{:ignore}. +When @var{dont-register-service} is non-nil, the known name +@var{service} is not registered. This means that other D-Bus clients +have no way of noticing the newly registered method. When interfaces +are constructed incrementally by adding single methods or properties +at a time, @var{dont-register-service} can be use to prevent other +clients from discovering the still incomplete interface. + The default D-Bus timeout when waiting for a message reply is 25 seconds. This value could be even smaller, depending on the calling client. Therefore, @var{handler} shall not last longer than === modified file 'etc/NEWS' --- etc/NEWS 2011-01-03 01:18:33 +0000 +++ etc/NEWS 2011-01-04 02:38:41 +0000 @@ -1,6 +1,6 @@ GNU Emacs NEWS -- history of user-visible changes. -Copyright (C) 2010, 2011 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. See the end of the file for license conditions. Please send Emacs bug reports to bug-gnu-emacs@gnu.org. @@ -556,7 +556,7 @@ *** It is possible now, to access alternative buses than the default system or session bus. - +*** dbus-register-{method,property} do not necessarily register names anymore ** Tramp *** There exists a new inline access method "ksu" (kerberized su). @@ -713,8 +713,8 @@ *** If Emacs is compiled with libxml2 support (which is the default), two new Emacs Lisp-level functions are defined: -`libxml-parse-html-region' (which will parse "real world" HTML) -and `libxml-parse-xml-region' (which parses XML). Both return an +`xml-parse-html-string-internal' (which will parse "real world" HTML) +and `xml-parse-string-internal' (which parses XML). Both return an Emacs Lisp parse tree. FIXME: These should be front-ended by xml.el. === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-01-03 20:50:05 +0000 +++ lisp/ChangeLog 2011-01-04 02:38:41 +0000 @@ -1,3 +1,8 @@ +2011-01-04 Jan Moringen + + * net/dbus.el (dbus-register-property): Added optional parameter + dont-register-service. Updated docstring accordingly. + 2011-01-02 Eli Zaretskii * term/w32-win.el (dynamic-library-alist): Set up correctly for @@ -114,13 +119,6 @@ * mail/mail-utils.el (mail-mbox-from): Handle From: headers with multiple addresses. (Bug#7760) -2011-01-01 Ken Manheimer - - allout.el (allout-auto-fill): Do not infinitely recurse - use - do-auto-fill if everything points back to allout-auto-fill. - (allout-mode-deactivate-hook): Declare obsolete, in favor of - standard-formed minor-mode deactivate hook, allout-mode-off-hook. - 2010-12-31 Michael Albinus * net/tramp-sh.el (tramp-methods): Add recursive options to "scpc" @@ -190,21 +188,6 @@ pretty-printed, so that it is mergeable by line-based text merging, as suggested by Iain Dalton . -2010-12-28 Ken Manheimer - - allout.el (allout-v18/19-file-var-hack): Obsolete, remove. - (allout-mode): Argument "toggle" => "force". - Refine the docstring. - Remove special provisions for reactivation, besides the 'force' - argument. - Consolidate layout provisions coce directly into the activation - condition branch, now that we've removed those provisions. - (allout-unload-function): Explicitly activate the mode before - deactivating, if it's initially deactivated. - (allout-set-buffer-multibyte): Properly prevent byte-compiler - warnings for version of function used only where - set-buffer-multibyte is unavailable. - 2010-12-28 Chong Yidong * tool-bar.el (tool-bar-setup): Remove :enable conditions, which === modified file 'lisp/net/dbus.el' --- lisp/net/dbus.el 2010-11-03 03:49:04 +0000 +++ lisp/net/dbus.el 2011-01-04 02:38:41 +0000 @@ -868,21 +868,23 @@ (add-to-list 'result (cons (car dict) (caadr dict)) 'append))))) (defun dbus-register-property - (bus service path interface property access value &optional emits-signal) + (bus service path interface property access value + &optional emits-signal dont-register-service) "Register property PROPERTY on the D-Bus BUS. BUS is either a Lisp symbol, `:system' or `:session', or a string denoting the bus address. SERVICE is the D-Bus service name of the D-Bus. It must be a -known name. +known name (See discussion of DONT-REGISTER-SERVICE below). -PATH is the D-Bus object path SERVICE is registered. INTERFACE -is the name of the interface used at PATH, PROPERTY is the name -of the property of INTERFACE. ACCESS indicates, whether the -property can be changed by other services via D-Bus. It must be -either the symbol `:read' or `:readwrite'. VALUE is the initial -value of the property, it can be of any valid type (see +PATH is the D-Bus object path SERVICE is registered (See +discussion of DONT-REGISTER-SERVICE below). INTERFACE is the +name of the interface used at PATH, PROPERTY is the name of the +property of INTERFACE. ACCESS indicates, whether the property +can be changed by other services via D-Bus. It must be either +the symbol `:read' or `:readwrite'. VALUE is the initial value +of the property, it can be of any valid type (see `dbus-call-method' for details). If PROPERTY already exists on PATH, it will be overwritten. For @@ -894,12 +896,20 @@ PATH, including a default handler for the \"Get\", \"GetAll\" and \"Set\" methods of this interface. When EMITS-SIGNAL is non-nil, the signal \"PropertiesChanged\" is sent when the property is -changed by `dbus-set-property'." +changed by `dbus-set-property'. + +When DONT-REGISTER-SERVICE is non-nil, the known name SERVICE is +not registered. This means that other D-Bus clients have no way +of noticing the newly registered property. When interfaces are +constructed incrementally by adding single methods or properties +at a time, DONT-REGISTER-SERVICE can be use to prevent other +clients from discovering the still incomplete interface." (unless (member access '(:read :readwrite)) (signal 'dbus-error (list "Access type invalid" access))) ;; Register SERVICE. - (unless (member service (dbus-list-names bus)) + (unless (or dont-register-service + (member service (dbus-list-names bus))) (dbus-call-method bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus "RequestName" service 0)) @@ -907,11 +917,14 @@ ;; Add the handler. We use `dbus-service-emacs' as service name, in ;; order to let unregister SERVICE despite of this default handler. (dbus-register-method - bus service path dbus-interface-properties "Get" 'dbus-property-handler) - (dbus-register-method - bus service path dbus-interface-properties "GetAll" 'dbus-property-handler) - (dbus-register-method - bus service path dbus-interface-properties "Set" 'dbus-property-handler) + bus service path dbus-interface-properties "Get" 'dbus-property-handler + dont-register-service) + (dbus-register-method + bus service path dbus-interface-properties "GetAll" 'dbus-property-handler + dont-register-service) + (dbus-register-method + bus service path dbus-interface-properties "Set" 'dbus-property-handler + dont-register-service) ;; Send the PropertiesChanged signal. (when emits-signal === modified file 'src/ChangeLog' --- src/ChangeLog 2011-01-03 19:35:59 +0000 +++ src/ChangeLog 2011-01-04 02:38:41 +0000 @@ -1,7 +1,7 @@ -2011-01-03 Eli Zaretskii +2011-01-04 Jan Moringen - * image.c (png_jmpbuf): Remove definition. - (my_png_error, png_load): Don't use png_jmpbuf. + * dbusbind.c (dbus-register-method): Added optional parameter + dont-register-service. Updated docstring accordingly. 2011-01-02 Eli Zaretskii === modified file 'src/dbusbind.c' --- src/dbusbind.c 2010-11-10 09:08:05 +0000 +++ src/dbusbind.c 2011-01-04 02:38:41 +0000 @@ -1983,21 +1983,30 @@ } DEFUN ("dbus-register-method", Fdbus_register_method, Sdbus_register_method, - 6, 6, 0, + 6, 7, 0, doc: /* Register for method METHOD on the D-Bus BUS. BUS is either a Lisp symbol, `:system' or `:session', or a string denoting the bus address. SERVICE is the D-Bus service name of the D-Bus object METHOD is -registered for. It must be a known name. - -PATH is the D-Bus object path SERVICE is registered. INTERFACE is the -interface offered by SERVICE. It must provide METHOD. HANDLER is a -Lisp function to be called when a method call is received. It must -accept the input arguments of METHOD. The return value of HANDLER is -used for composing the returning D-Bus message. */) - (Lisp_Object bus, Lisp_Object service, Lisp_Object path, Lisp_Object interface, Lisp_Object method, Lisp_Object handler) +registered for. It must be a known name (See discussion of +DONT-REGISTER-SERVICE below). + +PATH is the D-Bus object path SERVICE is registered (See discussion of +DONT-REGISTER-SERVICE below). INTERFACE is the interface offered by +SERVICE. It must provide METHOD. HANDLER is a Lisp function to be +called when a method call is received. It must accept the input +arguments of METHOD. The return value of HANDLER is used for +composing the returning D-Bus message. + +When DONT-REGISTER-SERVICE is non-nil, the known name SERVICE is not +registered. This means that other D-Bus clients have no way of +noticing the newly registered method. When interfaces are constructed +incrementally by adding single methods or properties at a time, +DONT-REGISTER-SERVICE can be use to prevent other clients from +discovering the still incomplete interface.*/) + (Lisp_Object bus, Lisp_Object service, Lisp_Object path, Lisp_Object interface, Lisp_Object method, Lisp_Object handler, Lisp_Object dont_register_service) { Lisp_Object key, key1, value; DBusConnection *connection; @@ -2019,10 +2028,16 @@ /* Request the known name from the bus. We can ignore the result, it is set to -1 if there is an error - kind of redundancy. */ - dbus_error_init (&derror); - result = dbus_bus_request_name (connection, SDATA (service), 0, &derror); - if (dbus_error_is_set (&derror)) - XD_ERROR (derror); + if (NILP (dont_register_service)) + { + dbus_error_init (&derror); + result = dbus_bus_request_name (connection, SDATA (service), 0, &derror); + if (dbus_error_is_set (&derror)) + XD_ERROR (derror); + + /* Cleanup. */ + dbus_error_free (&derror); + } /* Create a hash table entry. We use nil for the unique name, because the method might be called from anybody. */ @@ -2033,9 +2048,6 @@ if (NILP (Fmember (key1, value))) Fputhash (key, Fcons (key1, value), Vdbus_registered_objects_table); - /* Cleanup. */ - dbus_error_free (&derror); - /* Return object. */ return list2 (key, list3 (service, path, handler)); } # Begin bundle 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 h8641BlGB26NMyyaf+LuSKcKEhTJ/5Ng --Boundary_(ID_aLrE7/CBJ75MK8JFlkuB+g)--