* DBus methods without name grabbing @ 2011-01-02 21:06 Jan Moringen 2011-01-03 12:55 ` Michael Albinus 0 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-02 21:06 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1072 bytes --] Hi, recently I ran into the following DBus-related problem: In order to write a telepathy client [1], it is required to provide a certain DBus-Interface under a special well-known name. Some telepathy component seems to start calling methods immediately after the well-known name is taken. Since the interface consists of multiple methods/properties, it cannot be ensured that the interface is completely available when the name is taken and the first calls are made using Emacs' current DBus-interface. This is due to the fact that the function `dbus-register-method' immediately takes the name. To allow Emacs to work with this kind of DBus-interfaces, I suggest the changes implemented in the attached patch. I don't known the Emacs C code well very well, so it probably needs revision. An example for which this change is necessary can be found in the function `telepathy-client-register' in the attached file client.el from my telepathy bindings. Do you think this patch could be applied? Kind regards, Jan [1] http://telepathy.freedesktop.org/spec/Client.html [-- Attachment #2: dbus-dont-request-name.diff --] [-- Type: text/x-patch, Size: 3732 bytes --] === modified file 'lisp/net/dbus.el' --- lisp/net/dbus.el 2010-08-30 13:03:05 +0000 +++ lisp/net/dbus.el 2010-10-03 02:25:51 +0000 @@ -868,7 +868,8 @@ (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-request-name) "Register property PROPERTY on the D-Bus BUS. BUS is either a Lisp symbol, `:system' or `:session', or a string @@ -899,7 +900,8 @@ (signal 'dbus-error (list "Access type invalid" access))) ;; Register SERVICE. - (unless (member service (dbus-list-names bus)) + (unless (or dont-request-name + (member service (dbus-list-names bus))) (dbus-call-method bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus "RequestName" service 0)) @@ -907,11 +909,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) + bus service path dbus-interface-properties "Get" 'dbus-property-handler + dont-request-name) (dbus-register-method - bus service path dbus-interface-properties "GetAll" 'dbus-property-handler) + bus service path dbus-interface-properties "GetAll" 'dbus-property-handler + dont-request-name) (dbus-register-method - bus service path dbus-interface-properties "Set" 'dbus-property-handler) + bus service path dbus-interface-properties "Set" 'dbus-property-handler + dont-request-name) ;; Send the PropertiesChanged signal. (when emits-signal === 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 @@ -1947,7 +1947,7 @@ } 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 @@ -1961,7 +1961,7 @@ 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) + (Lisp_Object bus, Lisp_Object service, Lisp_Object path, Lisp_Object interface, Lisp_Object method, Lisp_Object handler, Lisp_Object dont_request_name) { Lisp_Object key, key1, value; DBusConnection *connection; @@ -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)) + { + 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. */ @@ -1997,9 +2003,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)); } [-- Attachment #3: client.el --] [-- Type: text/x-emacs-lisp, Size: 8494 bytes --] ;;; client.el --- ;; ;; Copyright (C) 2010, 2011 Jan Moringen ;; ;; Author: Jan Moringen <jmoringe@techfak.uni-bielefeld.de> ;; Keywords: telepathy, communication, instant messaging ;; ;; This Program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; ;; This Program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see <http://www.gnu.org/licenses>. \f ;;; Commentary: ;; \f ;;; History: ;; ;; 0.1 - Initial version \f ;;; Code: ;; (require 'dbus) (require 'telepathy/util) \f ;;; ;; (defconst telepathy-client-introspection-data "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\" \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\"> <node name=\"/org/freedesktop/Telepathy/Client/%s\"> <interface name=\"org.freedesktop.DBus.Introspectable\"> <method name=\"Introspect\"> <arg name=\"data\" direction=\"out\" type=\"s\"/> </method> </interface> <interface name=\"org.freedesktop.DBus.Properties\"> <method name=\"Get\"> <arg name=\"interface\" direction=\"in\" type=\"s\"/> <arg name=\"propname\" direction=\"in\" type=\"s\"/> <arg name=\"value\" direction=\"out\" type=\"v\"/> </method> <method name=\"Set\"> <arg name=\"interface\" direction=\"in\" type=\"s\"/> <arg name=\"propname\" direction=\"in\" type=\"s\"/> <arg name=\"value\" direction=\"in\" type=\"v\"/> </method> <method name=\"GetAll\"> <arg name=\"interface\" direction=\"in\" type=\"s\"/> <arg name=\"props\" direction=\"out\" type=\"a{sv}\"/> </method> </interface> <interface name=\"org.freedesktop.Telepathy.Client.Handler\"> <method name=\"HandleChannels\"> <arg name=\"Account\" type=\"o\" direction=\"in\"/> <arg name=\"Connection\" type=\"o\" direction=\"in\"/> <arg name=\"Channels\" type=\"a(oa{sv})\" direction=\"in\"/> <arg name=\"Requests_Satisfied\" type=\"ao\" direction=\"in\"/> <arg name=\"User_Action_Time\" type=\"t\" direction=\"in\"/> <arg name=\"Handler_Info\" type=\"a{sv}\" direction=\"in\"/> </method> </interface> </node>" "") \f ;;; ;; (defvar telepathy-client-handlers (make-hash-table :test 'equal) "") (defun telepathy-client-handler-services () "" (let ((result)) (maphash (lambda (key value) (push key result)) telepathy-client-handlers) result)) (defun telepathy-client-add-handler (service handler &optional client) "" (unless client (setq client "Emacs")) (unless (zerop (hash-table-count telepathy-client-handlers)) (telepathy-client-unregister client)) (puthash service handler telepathy-client-handlers) (telepathy-client-register client)) (defun telepathy-client-remove-handler (service &optional client) "" (unless client (setq client "Emacs")) (unless (zerop (hash-table-count telepathy-client-handlers)) (telepathy-client-unregister client)) (remhash service telepathy-client-handlers) (unless (zerop (hash-table-count telepathy-client-handlers)) (telepathy-client-register client))) \f ;;; ;; (defun telepath-client-channel-handler (account connection-path channels &rest args) "" (dolist (channel-data channels) (let* ((connection (telepathy-make-remote-proxy-from-path :session connection-path)) ;; Analyze the properties of the channel. (channel-properties (second channel-data)) (contact-handle (telepathy-prop-get telepathy-key-target-handle channel-properties)) (contact (telepathy-make-contact connection contact-handle)) (service (telepathy-prop-get telepathy-key-service channel-properties)) (handler (gethash service telepathy-client-handlers)) ;; Obtain object path of channel object. (channel-path (first channel-data)) (channel-service (let ((bla (telepathy-path->service channel-path))) (substring bla 0 (position ?. bla :from-end t)))) (channel-object (dbus-proxy-make-remote-proxy :session channel-service channel-path nil 'telepathy-tube))) ;; TODO could be a different kind of channel (oset channel-object :contact contact) (message "Channel") (message " Path %s" channel-path) (message " Service %s" service) (message " Contact %s" contact) (funcall handler channel-object))) :ignore) (defun telepathy-client-register (name) "" ;; Create a DBus object to handle tube requests. (let ((service (format "org.freedesktop.Telepathy.Client.%s" name)) (path (format "/org/freedesktop/Telepathy/Client/%s" name))) ;; Install introspection information. (lexical-let ((introspection-data (format telepathy-client-introspection-data name))) (dbus-register-method :session service path "org.freedesktop.DBus.Introspectable" "Introspect" (lambda (&rest args) introspection-data) t)) ;; don't request the name, yet ;; Register all properties belonging to the handler object. (dolist (name-and-value `(("HandlerChannelFilter" ,(mapcar #'telepathy-client-make-channel-filter (telepathy-client-handler-services))) ("BypassApproval" t) ;; TODO was nil ("Capabilities" (:array :signature "as")) ("HandledChannels" (:array :signature "ao")))) (destructuring-bind (name value) name-and-value (dbus-register-property :session service path "org.freedesktop.Telepathy.Client.Handler" name :read value nil t))) ;; don't request the name, yet ;; TODO store the dbus objects for unregistering? (dbus-register-method :session service path "org.freedesktop.Telepathy.Client.Handler" "HandleChannels" #'telepath-client-channel-handler t) ;; don't request the name, yet (dbus-register-property :session service path "org.freedesktop.Telepathy.Client" "Interfaces" :read '("org.freedesktop.Telepathy.Client.Handler") nil t) ;; don't request the name, yet ;; Now that everything is in place, request the name. (dbus-call-method :session dbus-service-dbus dbus-path-dbus dbus-interface-dbus "RequestName" service 0))) ;; (/org/freedesktop/Telepathy/Connection/gabble/jabber/scymtym_2dtest_40jabber_2eorg_2fbe153d1c/StreamTubeChannel_2_1273735221 ;; ((org.freedesktop.Telepathy.Channel.InitiatorID ;; (scymtym@jabber.org)) ;; (org.freedesktop.Telepathy.Channel.TargetHandleType ;; (1)) ;; (org.freedesktop.Telepathy.Channel.TargetHandle ;; (2)) ;; (org.freedesktop.Telepathy.Channel.TargetID ;; (scymtym@jabber.org)) ;; (org.freedesktop.Telepathy.Channel.Requested ;; (nil)) ;; (org.freedesktop.Telepathy.Channel.Type.StreamTube.SupportedSocketTypes ;; (((0 (0 3)) (2 (0 1)) (3 (0 1))))) ;; (org.freedesktop.Telepathy.Channel.Type.StreamTube.Service ;; (org.gnu.emacs.rudel.announce)) ;; (org.freedesktop.Telepathy.Channel.Interface.Tube.Parameters ;; (nil)) ;; (org.freedesktop.Telepathy.Channel.ChannelType ;; (org.freedesktop.Telepathy.Channel.Type.StreamTube)) ;; (org.freedesktop.Telepathy.Channel.InitiatorHandle ;; (2)) ;; (org.freedesktop.Telepathy.Channel.Interfaces ;; ((org.freedesktop.Telepathy.Channel.Interface.Tube))))) (defun telepathy-client-unregister (name) "" (dbus-unregister-service :session (format "org.freedesktop.Telepathy.Client.%s" name))) \f ;;; Helper functions ;; (defun telepathy-client-make-channel-filter (service) "" `((:dict-entry "org.freedesktop.Telepathy.Channel.ChannelType" (:variant :string "org.freedesktop.Telepathy.Channel.Type.StreamTube")) (:dict-entry "org.freedesktop.Telepathy.Channel.TargetHandleType" (:variant :uint32 1)) (:dict-entry "org.freedesktop.Telepathy.Channel.Requested" (:variant :boolean nil)) (:dict-entry "org.freedesktop.Telepathy.Channel.Type.StreamTube.Service" (:variant :string ,service)) )) (provide 'telepathy/client) ;;; client.el ends here ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-02 21:06 DBus methods without name grabbing Jan Moringen @ 2011-01-03 12:55 ` Michael Albinus 2011-01-04 2:42 ` Jan Moringen 0 siblings, 1 reply; 13+ messages in thread From: Michael Albinus @ 2011-01-03 12:55 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > Hi, Hi Jan, > recently I ran into the following DBus-related problem: In order to > write a telepathy client [1], it is required to provide a certain > DBus-Interface under a special well-known name. Some telepathy component > seems to start calling methods immediately after the well-known name is > taken. Since the interface consists of multiple methods/properties, it > cannot be ensured that the interface is completely available when the > name is taken and the first calls are made using Emacs' current > DBus-interface. This is due to the fact that the function > `dbus-register-method' immediately takes the name. 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. - 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 ... - It would be great, if you could add also changed doc strings, changed dbus.texi, ChangeLog and etc/NEWS entries. > To allow Emacs to work with this kind of DBus-interfaces, I suggest the > changes implemented in the attached patch. I don't known the Emacs C > code well very well, so it probably needs revision. > > === 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)) Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-03 12:55 ` Michael Albinus @ 2011-01-04 2:42 ` Jan Moringen 2011-01-04 10:10 ` Michael Albinus 0 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-04 2:42 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1837 bytes --] 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 [-- Attachment #2: dbus-dont-register-service.patch --] [-- Type: text/x-patch, Size: 16782 bytes --] # 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 <jan.moringen@uni-bielefeld.de> + + * net/dbus.el (dbus-register-property): Added optional parameter + dont-register-service. Updated docstring accordingly. + 2011-01-02 Eli Zaretskii <eliz@gnu.org> * 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 <ken.manheimer@gmail.com> - - 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 <michael.albinus@gmx.de> * 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 <iain.dalton {_AT_} gmail.com>. -2010-12-28 Ken Manheimer <ken.manheimer@gmail.com> - - 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 <cyd@stupidchicken.com> * 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 <eliz@gnu.org> +2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> - * 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 <eliz@gnu.org> === 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 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-04 2:42 ` Jan Moringen @ 2011-01-04 10:10 ` Michael Albinus 2011-01-04 10:29 ` Jan Moringen ` (2 more replies) 0 siblings, 3 replies; 13+ messages in thread From: Michael Albinus @ 2011-01-04 10:10 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > Hi Michael, Hi Jan, > An updated patch is attached. Looks OK to me. Do you have commit rights, or shall I commit it for you? >> - 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. OK, I'll do it next days (except you want to do it yourself :-) > Kind regards, > Jan Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-04 10:10 ` Michael Albinus @ 2011-01-04 10:29 ` Jan Moringen 2011-01-04 13:09 ` Michael Albinus 2011-01-05 4:17 ` Jan Moringen [not found] ` <1294201048.2508.1.camel@gunhead> 2 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-04 10:29 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel, Jan Moringen On Tue, 2011-01-04 at 11:10 +0100, Michael Albinus wrote: > Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > > > Hi Michael, > > Hi Jan, > > > An updated patch is attached. > > Looks OK to me. Do you have commit rights, or shall I commit it for you? No and yes, please. > >> - 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. > > OK, I'll do it next days (except you want to do it yourself :-) I would do it, but I don't know when I will get to it. Kind regards, Jan ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-04 10:29 ` Jan Moringen @ 2011-01-04 13:09 ` Michael Albinus 0 siblings, 0 replies; 13+ messages in thread From: Michael Albinus @ 2011-01-04 13:09 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel, Jan Moringen Jan Moringen <jmoringen@uni-bielefeld.de> writes: Hi Jan, >> Looks OK to me. Do you have commit rights, or shall I commit it for you? > > No and yes, please. Done, with some minor tweakings. >> > I would rather tackle this change in a separate patch later. >> >> OK, I'll do it next days (except you want to do it yourself :-) > > I would do it, but I don't know when I will get to it. So I let it to you. That endorses my laziness ... > Kind regards, > Jan Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-04 10:10 ` Michael Albinus 2011-01-04 10:29 ` Jan Moringen @ 2011-01-05 4:17 ` Jan Moringen 2011-01-05 11:45 ` Michael Albinus [not found] ` <1294201048.2508.1.camel@gunhead> 2 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-05 4:17 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 782 bytes --] Hi Michael. > >> - 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. > > OK, I'll do it next days (except you want to do it yourself :-) I gave it a shot. See attached patch. Like the last patch, this probably needs revision. Kind regards, Jan [-- Attachment #2: dbus-register-service.patch --] [-- Type: text/x-patch, Size: 8026 bytes --] # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jan.moringen@uni-bielefeld.de-20110105040922-\ # vc2ma9x9190gle92 # target_branch: bzr://bzr.savannah.gnu.org/emacs/trunk/ # testament_sha1: 951371c07f78adb5726378a78265e35c8e00f263 # timestamp: 2011-01-05 05:09:46 +0100 # base_revision_id: ken.manheimer@gmail.com-20110104195021-\ # 1x68s956czngphh2 # # Begin patch === modified file 'doc/misc/dbus.texi' --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 +++ doc/misc/dbus.texi 2011-01-05 04:09:22 +0000 @@ -1491,6 +1491,16 @@ to the service from D-Bus. @end defun +@defun dbus-register-service bus service +Register the known name @var{service} on D-Bus @var{bus}. + +@var{bus} is either the symbol @code{:system} or the symbol +@code{:session}. + +@var{service} is the service name to be registered on the D-Bus. It +must be a known name. +@end defun + @defun dbus-unregister-service bus service Unregister all objects from D-Bus @var{bus}, registered by Emacs for @var{service}. === modified file 'etc/NEWS' --- etc/NEWS 2011-01-04 16:57:45 +0000 +++ etc/NEWS 2011-01-05 04:09:22 +0000 @@ -558,7 +558,9 @@ system or session bus. *** dbus-register-{method,property} do not necessarily register names anymore. - +*** New function dbus-register-service + Register a service known name on a D-Bus without simultaneously + registering a property or a method ** Tramp *** There exists a new inline access method "ksu" (kerberized su). === modified file 'src/ChangeLog' --- src/ChangeLog 2011-01-04 11:11:43 +0000 +++ src/ChangeLog 2011-01-05 04:09:22 +0000 @@ -1,3 +1,14 @@ +2011-01-05 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + Added function dbus-register-service in dbusbind.c + * dbusbind.c (Qdbus_register_service): new variable; holds + function dbus-register-service + (Fdbus_register_service): new function; register a service known + name on a D-Bus + (Fdbus_register_method): use Fdbus_register_service to register + the service name + (syms_of_dbusbind): added symbol `dbus-register-service' + 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> * dbusbind.c (Fdbus_register_method): Added optional parameter === modified file 'src/dbusbind.c' --- src/dbusbind.c 2011-01-04 11:11:43 +0000 +++ src/dbusbind.c 2011-01-05 04:09:22 +0000 @@ -38,6 +38,7 @@ Lisp_Object Qdbus_method_return_internal; Lisp_Object Qdbus_method_error_internal; Lisp_Object Qdbus_send_signal; +Lisp_Object Qdbus_register_service; Lisp_Object Qdbus_register_signal; Lisp_Object Qdbus_register_method; @@ -1835,6 +1836,43 @@ xd_in_read_queued_messages = 0; } +DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, + 2, 2, 0, + doc: /* Register known name SERVICE 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 that should be registered. It must +be a known name. + +Return nil.*/) + (Lisp_Object bus, Lisp_Object service) +{ + DBusConnection *connection; + int result; + DBusError derror; + + /* Check parameters. */ + CHECK_STRING (service); + + /* Open a connection to the bus. */ + connection = xd_initialize (bus, TRUE); + + /* 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); + + /* Cleanup. */ + dbus_error_free (&derror); + + /* Return object. */ + return Qnil; +} + DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal, 6, MANY, 0, doc: /* Register for signal SIGNAL on the D-Bus BUS. @@ -2028,18 +2066,8 @@ /* Open a connection to the bus. */ connection = xd_initialize (bus, TRUE); - /* 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. */ - 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); - } + /* Request the name. */ + Fdbus_register_service (bus, service); /* Create a hash table entry. We use nil for the unique name, because the method might be called from anybody. */ @@ -2091,6 +2119,10 @@ staticpro (&Qdbus_send_signal); defsubr (&Sdbus_send_signal); + Qdbus_register_service = intern_c_string ("dbus-register-service"); + staticpro (&Qdbus_register_service); + defsubr (&Sdbus_register_service); + Qdbus_register_signal = intern_c_string ("dbus-register-signal"); staticpro (&Qdbus_register_signal); defsubr (&Sdbus_register_signal); # Begin bundle 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 LPS36A== ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-05 4:17 ` Jan Moringen @ 2011-01-05 11:45 ` Michael Albinus 2011-01-08 5:48 ` Jan Moringen 0 siblings, 1 reply; 13+ messages in thread From: Michael Albinus @ 2011-01-05 11:45 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > Hi Michael. Hi Jan, > I gave it a shot. See attached patch. Like the last patch, this probably > needs revision. Thanks! > --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 > +++ doc/misc/dbus.texi 2011-01-05 04:09:22 +0000 > @@ -1491,6 +1491,16 @@ > to the service from D-Bus. > @end defun > > +@defun dbus-register-service bus service > +Register the known name @var{service} on D-Bus @var{bus}. > + > +@var{bus} is either the symbol @code{:system} or the symbol > +@code{:session}. > + > +@var{service} is the service name to be registered on the D-Bus. It > +must be a known name. > +@end defun > + > @defun dbus-unregister-service bus service > Unregister all objects from D-Bus @var{bus}, registered by Emacs for > @var{service}. Maybe we shall rearrange the whole node a little bit. In the introductionary paragraph, service names could be described more detailed, especially their registration policies. Afterwards, dbus-register-service shall follow. The explanation of dont-register-service in dbus-register-method and dbus-register-property could be shortened, referring to the explanation in dbus-register-service. > --- etc/NEWS 2011-01-04 16:57:45 +0000 > +++ etc/NEWS 2011-01-05 04:09:22 +0000 > @@ -558,7 +558,9 @@ > *** dbus-register-{method,property} do not necessarily register names anymore. > - > +*** New function dbus-register-service > + Register a service known name on a D-Bus without simultaneously > + registering a property or a method I guess we could join both entries. > --- src/dbusbind.c 2011-01-04 11:11:43 +0000 > +++ src/dbusbind.c 2011-01-05 04:09:22 +0000 > +DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, > + 2, 2, 0, > + doc: /* Register known name SERVICE 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 that should be registered. It must > +be a known name. > + > +Return nil.*/) > + (Lisp_Object bus, Lisp_Object service) Your implementation looks OK to me. However, I have a more general function in mind. Something like this: --8<---------------cut here---------------start------------->8--- DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, 2, MANY, 0, doc: /* Register known name SERVICE 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 that should be registered. FLAGS are integers, which control how the service name is registered. The following integer constants could be used: `dbus-service-allow-replacement': Allow another service to become the primary owner if requested. `dbus-service-replace-existing': Request to replace the current primary owner. `dbus-service-do-not-queue': If we can not become the primary owner do not place us in the queue. The function returns an integer, indicating the result of the operation. There are predefined constants to check: `dbus-service-primary-owner': Service has become the primary owner of the requested name. `dbus-service-in-queue': Service could not become the primary owner and has been placed in the queue. `dbus-service-exists': Service is already in the queue. `dbus-service-already-owner': Service is already the primary owner. Example: \(dbus-register-service :session dbus-service-emacs) => 1 ;; This is `dbus-service-primary-owner'. \(dbus-register-service :session "org.freedesktop.TextEditor" dbus-service-allow-replacement dbus-service-replace-existing) => 4 ;; This is `dbus-service-already-owner'. usage: (dbus-register-service BUS SERVICE &rest FLAGS) */) (int nargs, register Lisp_Object *args) --8<---------------cut here---------------end--------------->8--- The constants shall be declared as well, for initialization you could use DBUS_NAME_FLAG* and DBUS_REQUEST_NAME_REPLY* from dbus-shared.h. And while we are at this, maybe dbus-unregister-service could also return a similar result, based on DBUS_RELEASE_NAME_REPLY*. > @@ -2028,18 +2066,8 @@ > + /* Request the name. */ > + Fdbus_register_service (bus, service); As you have said the other message, the check for dont-register-service is missing. Furthermore, I would also propose to use dbus-register-service in dbus-register-property (in dbus.el). > Kind regards, > Jan Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-05 11:45 ` Michael Albinus @ 2011-01-08 5:48 ` Jan Moringen 2011-01-09 9:42 ` Michael Albinus 0 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-08 5:48 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 4798 bytes --] Hi, I finally got to improving my patch. Feedback would be appreciated. > > --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 > > +++ doc/misc/dbus.texi 2011-01-05 04:09:22 +0000 > > @@ -1491,6 +1491,16 @@ > > to the service from D-Bus. > > @end defun > > > > +@defun dbus-register-service bus service > > +Register the known name @var{service} on D-Bus @var{bus}. > > + > > +@var{bus} is either the symbol @code{:system} or the symbol > > +@code{:session}. > > + > > +@var{service} is the service name to be registered on the D-Bus. It > > +must be a known name. > > +@end defun > > + > > @defun dbus-unregister-service bus service > > Unregister all objects from D-Bus @var{bus}, registered by Emacs for > > @var{service}. > > Maybe we shall rearrange the whole node a little bit. In the > introductionary paragraph, service names could be described more > detailed, especially their registration policies. Afterwards, > dbus-register-service shall follow. Done. > The explanation of dont-register-service in dbus-register-method and > dbus-register-property could be shortened, referring to the explanation > in dbus-register-service. I don't see which parts of the these discussions could be shortened. > > --- etc/NEWS 2011-01-04 16:57:45 +0000 > > +++ etc/NEWS 2011-01-05 04:09:22 +0000 > > @@ -558,7 +558,9 @@ > > *** dbus-register-{method,property} do not necessarily register names anymore. > > - > > +*** New function dbus-register-service > > + Register a service known name on a D-Bus without simultaneously > > + registering a property or a method > > I guess we could join both entries. Done. > > --- src/dbusbind.c 2011-01-04 11:11:43 +0000 > > +++ src/dbusbind.c 2011-01-05 04:09:22 +0000 > > +DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, > > + 2, 2, 0, > > + doc: /* Register known name SERVICE 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 that should be registered. It must > > +be a known name. > > + > > +Return nil.*/) > > + (Lisp_Object bus, Lisp_Object service) > > Your implementation looks OK to me. However, I have a more general > function in mind. Something like this: > > --8<---------------cut here---------------start------------->8--- > DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, > 2, MANY, 0, doc: /* Register known name SERVICE 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 that should be registered. > > FLAGS are integers, which control how the service name is registered. > The following integer constants could be used: > > `dbus-service-allow-replacement': Allow another service to become the > primary owner if requested. > > `dbus-service-replace-existing': Request to replace the current > primary owner. > > `dbus-service-do-not-queue': If we can not become the primary owner do > not place us in the queue. > > The function returns an integer, indicating the result of the > operation. There are predefined constants to check: > > `dbus-service-primary-owner': Service has become the primary owner of > the requested name. > > `dbus-service-in-queue': Service could not become the primary owner > and has been placed in the queue. > > `dbus-service-exists': Service is already in the queue. > > `dbus-service-already-owner': Service is already the primary owner. > > Example: > > \(dbus-register-service :session dbus-service-emacs) > > => 1 ;; This is `dbus-service-primary-owner'. > > \(dbus-register-service > :session "org.freedesktop.TextEditor" > dbus-service-allow-replacement dbus-service-replace-existing) > > => 4 ;; This is `dbus-service-already-owner'. > > usage: (dbus-register-service BUS SERVICE &rest FLAGS) */) > (int nargs, register Lisp_Object *args) > --8<---------------cut here---------------end--------------->8--- > > The constants shall be declared as well, for initialization you could > use DBUS_NAME_FLAG* and DBUS_REQUEST_NAME_REPLY* from dbus-shared.h. I'm not sure about the integer constant and how they would be declared. I used keywords instead. > And while we are at this, maybe dbus-unregister-service could also > return a similar result, based on DBUS_RELEASE_NAME_REPLY*. Done. > > @@ -2028,18 +2066,8 @@ > > + /* Request the name. */ > > + Fdbus_register_service (bus, service); > > As you have said the other message, the check for dont-register-service > is missing. This is fixed now. > Furthermore, I would also propose to use dbus-register-service in > dbus-register-property (in dbus.el). Done. Kind regards, Jan [-- Attachment #2: dbus-un-register-service.patch --] [-- Type: text/x-patch, Size: 22908 bytes --] # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jan.moringen@uni-bielefeld.de-20110108054407-\ # 33fj9wo8x4hb8oiu # target_branch: bzr://bzr.savannah.gnu.org/emacs/trunk/ # testament_sha1: e93dadb08dca5ffc0f5f12e68e26573ef00e56e8 # timestamp: 2011-01-08 06:44:49 +0100 # base_revision_id: ken.manheimer@gmail.com-20110104195021-\ # 1x68s956czngphh2 # # Begin patch === modified file 'doc/misc/ChangeLog' --- doc/misc/ChangeLog 2011-01-04 12:38:33 +0000 +++ doc/misc/ChangeLog 2011-01-08 05:37:49 +0000 @@ -1,3 +1,8 @@ +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + * dbus.texi (Receiving Method Calls): rearranged node to mention + dbus-register-service and dbus-unregister-service first + 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> * dbus.texi (Receiving Method Calls): Describe new optional === modified file 'doc/misc/dbus.texi' --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 +++ doc/misc/dbus.texi 2011-01-08 05:37:49 +0000 @@ -1244,9 +1244,37 @@ @cindex method calls, returning @cindex returning method calls -Emacs can also offer own methods, which can be called by other -applications. These methods could be an implementation of an -interface of a well known service, like @samp{org.freedesktop.TextEditor}. +In order to register methods on the D-Bus, Emacs has to request a well +known name on the D-Bus under which it will be available for other +clients. Names on the D-Bus can be registered and unregistered using +the following functions: + +@defun dbus-register-service bus service &rest flags +Register the known name @var{service} on D-Bus @var{bus}. + +@var{bus} is either the symbol @code{:system} or the symbol +@code{:session}. + +@var{service} is the service name to be registered on the D-Bus. It +must be a known name. +@end defun + +@defun dbus-unregister-service bus service +Unregister all objects from D-Bus @var{bus}, registered by Emacs for +@var{service}. + +@var{bus} is either the symbol @code{:system} or the symbol +@code{:session}. + +@var{service} is the D-Bus service name of the D-Bus. It must be a +known name. Emacs releases its association to @var{service} from +D-Bus. +@end defun + +When a name has been chosen, Emacs can offer own methods, which can be +called by other applications. These methods could be an +implementation of an interface of a well known service, like +@samp{org.freedesktop.TextEditor}. It could be also an implementation of an own interface. In this case, the service name must be @samp{org.gnu.Emacs}. The object path shall @@ -1491,18 +1519,6 @@ to the service from D-Bus. @end defun -@defun dbus-unregister-service bus service -Unregister all objects from D-Bus @var{bus}, registered by Emacs for -@var{service}. - -@var{bus} is either the symbol @code{:system} or the symbol -@code{:session}. - -@var{service} is the D-Bus service name of the D-Bus. It must be a -known name. Emacs releases its association to @var{service} from -D-Bus. -@end defun - @node Signals @chapter Sending and receiving signals. === modified file 'etc/NEWS' --- etc/NEWS 2011-01-04 16:57:45 +0000 +++ etc/NEWS 2011-01-08 05:43:02 +0000 @@ -557,8 +557,13 @@ *** 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. +*** dbus-register-{service,method,property} + The -method and -property functions do not automatically register + names anymore. + The new function dbus-register-service registers a service known + name on a D-Bus without simultaneously registering a property or a + method ** Tramp *** There exists a new inline access method "ksu" (kerberized su). === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-01-04 19:50:21 +0000 +++ lisp/ChangeLog 2011-01-08 05:44:07 +0000 @@ -1,3 +1,11 @@ +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + * net/dbus.el (dbus-unregister-service): translate returned + integer into a symbol + + * net/dbus.el (dbus-register-property): use + `dbus-register-service' to do the name registration + 2011-01-04 Ken Manheimer <ken.manheimer@gmail.com> * Summary: Reconcile with changes in line movement behavior for === modified file 'lisp/net/dbus.el' --- lisp/net/dbus.el 2011-01-04 10:57:24 +0000 +++ lisp/net/dbus.el 2011-01-08 05:44:07 +0000 @@ -193,9 +193,14 @@ (puthash key (delete elt value) dbus-registered-objects-table) (remhash key dbus-registered-objects-table)))))) dbus-registered-objects-table) - (dbus-call-method - bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus - "ReleaseName" service)) + (let ((reply (dbus-call-method + bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus + "ReleaseName" service))) + (case reply + (1 :released) + (2 :non-existent) + (3 :not-owner) + (t reply)))) (defun dbus-call-method-non-blocking-handler (&rest args) "Handler for reply messages of asynchronous D-Bus message calls. @@ -917,14 +922,18 @@ ;; 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 - 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) + bus service path dbus-interface-properties "Get" + 'dbus-property-handler nil) + (dbus-register-method + bus service path dbus-interface-properties "GetAll" + 'dbus-property-handler nil) + (dbus-register-method + bus service path dbus-interface-properties "Set" + 'dbus-property-handler nil) + + ;; Register the name SERVICE with BUS. + (unless dont-register-service + (dbus-register-service bus service)) ;; Send the PropertiesChanged signal. (when emits-signal === modified file 'src/ChangeLog' --- src/ChangeLog 2011-01-04 11:11:43 +0000 +++ src/ChangeLog 2011-01-08 05:38:56 +0000 @@ -1,3 +1,34 @@ +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + Symbols for flags, return values in request-service in dbusbind.c + * dbusbind.c (QCdbus_request_name_allow_replacement): new symbol; + used by dbus-register-service + (QCdbus_request_name_replace_existing): likewise + (QCdbus_request_name_do_not_queue): likewise + (QCdbus_request_name_reply_primary_owner): likewise + (QCdbus_request_name_reply_in_queue): likewise + (QCdbus_request_name_reply_exists): likewise + (QCdbus_request_name_reply_already_owner): likewise + (Fdbus_register_service): changed number of arguments to MANY; + rest arguments are used to supply flags; adapted docstring + accordingly; translate value returned by DBus to a symbol + (Fdbus_register_method): use Fdbus_register_service to do the name + registration + (syms_of_dbusbind): added symbols :allow-replacement, + :replace-existing, :do-not-queue, :primary-owner, :existing, + :in-queue and :already-owner + +2011-01-05 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + Added function dbus-register-service in dbusbind.c + * dbusbind.c (Qdbus_register_service): new variable; holds + function dbus-register-service + (Fdbus_register_service): new function; register a service known + name on a D-Bus + (Fdbus_register_method): use Fdbus_register_service to register + the service name + (syms_of_dbusbind): added symbol `dbus-register-service' + 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> * dbusbind.c (Fdbus_register_method): Added optional parameter === modified file 'src/dbusbind.c' --- src/dbusbind.c 2011-01-04 11:11:43 +0000 +++ src/dbusbind.c 2011-01-08 05:38:56 +0000 @@ -38,6 +38,7 @@ Lisp_Object Qdbus_method_return_internal; Lisp_Object Qdbus_method_error_internal; Lisp_Object Qdbus_send_signal; +Lisp_Object Qdbus_register_service; Lisp_Object Qdbus_register_signal; Lisp_Object Qdbus_register_method; @@ -50,6 +51,17 @@ /* Lisp symbol for method call timeout. */ Lisp_Object QCdbus_timeout; +/* Lisp symbols for name request flags. */ +Lisp_Object QCdbus_request_name_allow_replacement; +Lisp_Object QCdbus_request_name_replace_existing; +Lisp_Object QCdbus_request_name_do_not_queue; + +/* Lisp symbols for name request replies. */ +Lisp_Object QCdbus_request_name_reply_primary_owner; +Lisp_Object QCdbus_request_name_reply_in_queue; +Lisp_Object QCdbus_request_name_reply_exists; +Lisp_Object QCdbus_request_name_reply_already_owner; + /* Lisp symbols of D-Bus types. */ Lisp_Object QCdbus_type_byte, QCdbus_type_boolean; Lisp_Object QCdbus_type_int16, QCdbus_type_uint16; @@ -1835,6 +1847,114 @@ xd_in_read_queued_messages = 0; } +DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, + 2, MANY, 0, + doc: /* Register known name SERVICE 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 that should be registered. It must +be a known name. + +FLAGS are keywords, which control how the service name is registered. +The following keywords are recognized: + +`:allow-replacement': Allow another service to become the primary +owner if requested. + +`:replace-existing': Request to replace the current primary owner. + +`:do-not-queue': If we can not become the primary owner do not place +us in the queue. + +The function returns a keyword, indicating the result of the +operation. The following keyword can be returned: + +`:primary-owner': Service has become the primary owner of the +requested name. + +`:in-queue': Service could not become the primary owner and has been +placed in the queue. + +`:exists': Service is already in the queue. + +`:already-owner': Service is already the primary owner. + +Example: + +\(dbus-register-service :session dbus-service-emacs) + + => :primary-owner. + +\(dbus-register-service +:session "org.freedesktop.TextEditor" +dbus-service-allow-replacement dbus-service-replace-existing) + + => :already-owner. + +usage: (dbus-register-service BUS SERVICE &rest FLAGS) */) + (int nargs, register Lisp_Object *args) +{ + Lisp_Object bus, service; + struct gcpro gcpro1, gcpro2; + DBusConnection *connection; + unsigned int i; + unsigned int value; + unsigned int flags = 0; + int result; + DBusError derror; + + bus = args[0]; + service = args[1]; + + /* Check parameters. */ + CHECK_STRING (service); + + /* Process flags. */ + for (i = 2; i < nargs; ++i) { + value = ((EQ (args[i], QCdbus_request_name_replace_existing)) + ? DBUS_NAME_FLAG_REPLACE_EXISTING + : (EQ (args[i], QCdbus_request_name_allow_replacement)) + ? DBUS_NAME_FLAG_ALLOW_REPLACEMENT + : (EQ (args[i], QCdbus_request_name_do_not_queue)) + ? DBUS_NAME_FLAG_DO_NOT_QUEUE + : -1); + if (value == -1) + xsignal0 (Qdbus_error); + // "Unrecognized name request flag"); + flags |= value; + } + + /* Open a connection to the bus. */ + connection = xd_initialize (bus, TRUE); + + /* 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), flags, + &derror); + if (dbus_error_is_set (&derror)) + XD_ERROR (derror); + + /* Cleanup. */ + dbus_error_free (&derror); + + /* Return object. */ + switch (result) { + case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER: + return QCdbus_request_name_reply_primary_owner; + case DBUS_REQUEST_NAME_REPLY_IN_QUEUE: + return QCdbus_request_name_reply_in_queue; + case DBUS_REQUEST_NAME_REPLY_EXISTS: + return QCdbus_request_name_reply_exists; + case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER: + return QCdbus_request_name_reply_already_owner; + default: + return Qnil; + } +} + DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal, 6, MANY, 0, doc: /* Register for signal SIGNAL on the D-Bus BUS. @@ -2014,6 +2134,7 @@ DBusConnection *connection; int result; DBusError derror; + Lisp_Object args[2] = { bus, service }; /* Check parameters. */ CHECK_STRING (service); @@ -2028,18 +2149,9 @@ /* Open a connection to the bus. */ connection = xd_initialize (bus, TRUE); - /* 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. */ - 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); - } + /* Request the name. */ + if (!(NILP(dont_register_service))) + Fdbus_register_service (2, args); /* Create a hash table entry. We use nil for the unique name, because the method might be called from anybody. */ @@ -2091,6 +2203,10 @@ staticpro (&Qdbus_send_signal); defsubr (&Sdbus_send_signal); + Qdbus_register_service = intern_c_string ("dbus-register-service"); + staticpro (&Qdbus_register_service); + defsubr (&Sdbus_register_service); + Qdbus_register_signal = intern_c_string ("dbus-register-signal"); staticpro (&Qdbus_register_signal); defsubr (&Sdbus_register_signal); @@ -2112,6 +2228,27 @@ QCdbus_session_bus = intern_c_string (":session"); staticpro (&QCdbus_session_bus); + QCdbus_request_name_allow_replacement = intern_c_string (":allow-replacement"); + staticpro (&QCdbus_request_name_allow_replacement); + + QCdbus_request_name_replace_existing = intern_c_string (":replace-existing"); + staticpro (&QCdbus_request_name_replace_existing); + + QCdbus_request_name_do_not_queue = intern_c_string (":do-not-queue"); + staticpro (&QCdbus_request_name_do_not_queue); + + QCdbus_request_name_reply_primary_owner = intern_c_string (":primary-owner"); + staticpro (&QCdbus_request_name_reply_primary_owner); + + QCdbus_request_name_reply_exists = intern_c_string (":exists"); + staticpro (&QCdbus_request_name_reply_exists); + + QCdbus_request_name_reply_in_queue = intern_c_string (":in-queue"); + staticpro (&QCdbus_request_name_reply_in_queue); + + QCdbus_request_name_reply_already_owner = intern_c_string (":already-owner"); + staticpro (&QCdbus_request_name_reply_already_owner); + QCdbus_timeout = intern_c_string (":timeout"); staticpro (&QCdbus_timeout); # Begin bundle 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 rfRbLYcrs2JxaUhtb7v7i7kinChIJDq/zwA= ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-08 5:48 ` Jan Moringen @ 2011-01-09 9:42 ` Michael Albinus 2011-01-09 16:08 ` Jan Moringen 0 siblings, 1 reply; 13+ messages in thread From: Michael Albinus @ 2011-01-09 9:42 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > Hi, Hi Jan, >> Maybe we shall rearrange the whole node a little bit. In the >> introductionary paragraph, service names could be described more >> detailed, especially their registration policies. Afterwards, >> dbus-register-service shall follow. > > Done. > >> The explanation of dont-register-service in dbus-register-method and >> dbus-register-property could be shortened, referring to the explanation >> in dbus-register-service. > > I don't see which parts of the these discussions could be shortened. FTTB, let the changes as you have proposed. This we could tune later. > I'm not sure about the integer constant and how they would be declared. > I used keywords instead. That's OK. > --- doc/misc/ChangeLog 2011-01-04 12:38:33 +0000 > +++ doc/misc/ChangeLog 2011-01-08 05:37:49 +0000 > +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> > + > + * dbus.texi (Receiving Method Calls): rearranged node to mention > + dbus-register-service and dbus-unregister-service first > + > 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> There are some conventions for ChangeLog entries: Start with capital letter, speak in active words ("Rearrange" instead of "Rearranged"), end with a period, etc. Do you intend to use different email addresses? > --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 > +++ doc/misc/dbus.texi 2011-01-08 05:37:49 +0000 > +@defun dbus-register-service bus service &rest flags > +Register the known name @var{service} on D-Bus @var{bus}. > + > +@var{bus} is either the symbol @code{:system} or the symbol > +@code{:session}. > + > +@var{service} is the service name to be registered on the D-Bus. It > +must be a known name. > +@end defun A description of FLAGS is missing, also return values. > +@defun dbus-unregister-service bus service > +Unregister all objects from D-Bus @var{bus}, registered by Emacs for > +@var{service}. > + > +@var{bus} is either the symbol @code{:system} or the symbol > +@code{:session}. > + > +@var{service} is the D-Bus service name of the D-Bus. It must be a > +known name. Emacs releases its association to @var{service} from > +D-Bus. > +@end defun Ditto for the return values. > --- lisp/ChangeLog 2011-01-04 19:50:21 +0000 > +++ lisp/ChangeLog 2011-01-08 05:44:07 +0000 > +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> > + > + * net/dbus.el (dbus-unregister-service): translate returned > + integer into a symbol > + > + * net/dbus.el (dbus-register-property): use > + `dbus-register-service' to do the name registration > + It will be just one commit, so you can merge the entries. > --- lisp/net/dbus.el 2011-01-04 10:57:24 +0000 > +++ lisp/net/dbus.el 2011-01-08 05:44:07 +0000 > @@ -193,9 +193,14 @@ > (puthash key (delete elt value) dbus-registered-objects-table) > (remhash key dbus-registered-objects-table)))))) > dbus-registered-objects-table) > - (dbus-call-method > - bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus > - "ReleaseName" service)) > + (let ((reply (dbus-call-method > + bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus > + "ReleaseName" service))) > + (case reply > + (1 :released) > + (2 :non-existent) > + (3 :not-owner) > + (t reply)))) In case reply is not 1, 2 or 3, there is a problem. We shall raise a dbus-error then. > @@ -917,14 +922,18 @@ > ;; 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 nil) > + (dbus-register-method > + bus service path dbus-interface-properties "GetAll" > + 'dbus-property-handler nil) > + (dbus-register-method > + bus service path dbus-interface-properties "Set" > + 'dbus-property-handler nil) > + > + ;; Register the name SERVICE with BUS. > + (unless dont-register-service > + (dbus-register-service bus service)) I guess you mean t (or better 'dont-register) as last argument of the dbus-register-method calls. Btw, the comment can be shortened. "We use `dbus-service-emacs' ..." is not true anymore. > --- src/dbusbind.c 2011-01-04 11:11:43 +0000 > +++ src/dbusbind.c 2011-01-08 05:38:56 +0000 @@ -1835,6 +1847,114 @@ > +The function returns a keyword, indicating the result of the > +operation. The following keyword can be returned: "One of the following keywords is returned:" > + if (value == -1) > + xsignal0 (Qdbus_error); > + // "Unrecognized name request flag"); XD_SIGNAL2 (build_string ("Unrecognized name request flag"), args[i]); > + /* 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), flags, > + &derror); > + if (dbus_error_is_set (&derror)) > + XD_ERROR (derror); The second sentence of the comment is not true anymore. > @@ -2028,18 +2149,9 @@ > /* Open a connection to the bus. */ > connection = xd_initialize (bus, TRUE); > > + /* Request the name. */ > + if (!(NILP(dont_register_service))) > + Fdbus_register_service (2, args); It must be if (NILP (dont_register_service)) > Kind regards, > Jan Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-09 9:42 ` Michael Albinus @ 2011-01-09 16:08 ` Jan Moringen 2011-01-10 11:40 ` Michael Albinus 0 siblings, 1 reply; 13+ messages in thread From: Jan Moringen @ 2011-01-09 16:08 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 5424 bytes --] Hi Michael, sorry for the sloppy patch. I couldn't put as much time into it as I would have liked. > > --- doc/misc/ChangeLog 2011-01-04 12:38:33 +0000 > > +++ doc/misc/ChangeLog 2011-01-08 05:37:49 +0000 > > +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> > > + > > + * dbus.texi (Receiving Method Calls): rearranged node to mention > > + dbus-register-service and dbus-unregister-service first > > + > > 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> > > There are some conventions for ChangeLog entries: Start with capital > letter, speak in active words ("Rearrange" instead of "Rearranged"), > end with a period, etc. I changed the entry. > Do you intend to use different email addresses? No, that wasn't intentional. > > --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 > > +++ doc/misc/dbus.texi 2011-01-08 05:37:49 +0000 > > +@defun dbus-register-service bus service &rest flags > > +Register the known name @var{service} on D-Bus @var{bus}. > > + > > +@var{bus} is either the symbol @code{:system} or the symbol > > +@code{:session}. > > + > > +@var{service} is the service name to be registered on the D-Bus. It > > +must be a known name. > > +@end defun > > A description of FLAGS is missing, also return values. Done. > > +@defun dbus-unregister-service bus service > > +Unregister all objects from D-Bus @var{bus}, registered by Emacs for > > +@var{service}. > > + > > +@var{bus} is either the symbol @code{:system} or the symbol > > +@code{:session}. > > + > > +@var{service} is the D-Bus service name of the D-Bus. It must be a > > +known name. Emacs releases its association to @var{service} from > > +D-Bus. > > +@end defun > > Ditto for the return values. Done. > > --- lisp/ChangeLog 2011-01-04 19:50:21 +0000 > > +++ lisp/ChangeLog 2011-01-08 05:44:07 +0000 > > +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> > > + > > + * net/dbus.el (dbus-unregister-service): translate returned > > + integer into a symbol > > + > > + * net/dbus.el (dbus-register-property): use > > + `dbus-register-service' to do the name registration > > + > > It will be just one commit, so you can merge the entries. Done. > > --- lisp/net/dbus.el 2011-01-04 10:57:24 +0000 > > +++ lisp/net/dbus.el 2011-01-08 05:44:07 +0000 > > @@ -193,9 +193,14 @@ > > (puthash key (delete elt value) dbus-registered-objects-table) > > (remhash key dbus-registered-objects-table)))))) > > dbus-registered-objects-table) > > - (dbus-call-method > > - bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus > > - "ReleaseName" service)) > > + (let ((reply (dbus-call-method > > + bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus > > + "ReleaseName" service))) > > + (case reply > > + (1 :released) > > + (2 :non-existent) > > + (3 :not-owner) > > + (t reply)))) > > In case reply is not 1, 2 or 3, there is a problem. We shall raise a > dbus-error then. Done. > > @@ -917,14 +922,18 @@ > > ;; 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 nil) > > + (dbus-register-method > > + bus service path dbus-interface-properties "GetAll" > > + 'dbus-property-handler nil) > > + (dbus-register-method > > + bus service path dbus-interface-properties "Set" > > + 'dbus-property-handler nil) > > + > > + ;; Register the name SERVICE with BUS. > > + (unless dont-register-service > > + (dbus-register-service bus service)) > > I guess you mean t (or better 'dont-register) as last argument of the > dbus-register-method calls. I think it has to be t. The service is registered or not in the following call to `dbus-register-service' depending on `dont-register-service'. > Btw, the comment can be shortened. "We use `dbus-service-emacs' ..." > is not true anymore. I updated the comment to read: "Add handlers for the three property-related methods." > > --- src/dbusbind.c 2011-01-04 11:11:43 +0000 > > +++ src/dbusbind.c 2011-01-08 05:38:56 +0000 > @@ -1835,6 +1847,114 @@ > > +The function returns a keyword, indicating the result of the > > +operation. The following keyword can be returned: > > "One of the following keywords is returned:" Done. > > + if (value == -1) > > + xsignal0 (Qdbus_error); > > + // "Unrecognized name request flag"); > > XD_SIGNAL2 (build_string ("Unrecognized name request flag"), args[i]); I was wondering how to do that. Thanks. > > + /* 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), flags, > > + &derror); > > + if (dbus_error_is_set (&derror)) > > + XD_ERROR (derror); > > The second sentence of the comment is not true anymore. I removed it. > > @@ -2028,18 +2149,9 @@ > > /* Open a connection to the bus. */ > > connection = xd_initialize (bus, TRUE); > > > > + /* Request the name. */ > > + if (!(NILP(dont_register_service))) > > + Fdbus_register_service (2, args); > > It must be > > if (NILP (dont_register_service)) Oops. I hope this increases the quality of the patch to bearable levels. Kind regards, Jan [-- Attachment #2: dbus-un-register-service.patch --] [-- Type: text/x-patch, Size: 27721 bytes --] # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jan.moringen@uni-bielefeld.de-20110109160320-\ # c5t6kwjae2hznq8p # target_branch: bzr://bzr.savannah.gnu.org/emacs/trunk/ # testament_sha1: 4cd4c68f62bb48cee2f221b129164f70bcd611f9 # timestamp: 2011-01-09 17:06:19 +0100 # base_revision_id: ken.manheimer@gmail.com-20110104195021-\ # 1x68s956czngphh2 # # Begin patch === modified file 'doc/misc/ChangeLog' --- doc/misc/ChangeLog 2011-01-04 12:38:33 +0000 +++ doc/misc/ChangeLog 2011-01-09 15:56:26 +0000 @@ -1,3 +1,8 @@ +2011-01-08 Jan Moringen <jan.moringen@uni-bielefeld.de> + + * dbus.texi (Receiving Method Calls): Rearrange node to mention + dbus-register-service and dbus-unregister-service first. + 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> * dbus.texi (Receiving Method Calls): Describe new optional === modified file 'doc/misc/dbus.texi' --- doc/misc/dbus.texi 2011-01-04 12:38:33 +0000 +++ doc/misc/dbus.texi 2011-01-09 15:34:23 +0000 @@ -1244,9 +1244,69 @@ @cindex method calls, returning @cindex returning method calls -Emacs can also offer own methods, which can be called by other -applications. These methods could be an implementation of an -interface of a well known service, like @samp{org.freedesktop.TextEditor}. +In order to register methods on the D-Bus, Emacs has to request a well +known name on the D-Bus under which it will be available for other +clients. Names on the D-Bus can be registered and unregistered using +the following functions: + +@defun dbus-register-service bus service &rest flags +Register the known name @var{service} on D-Bus @var{bus}. + +@var{bus} is either the symbol @code{:system} or the symbol +@code{:session}. + +@var{service} is the service name to be registered on the D-Bus. It +must be a known name. + +@var{flags} is a subset of the following keywords: +@itemize +@item @code{:allow-replacement}: Allow another service to become the primary +owner if requested. + +@item @code{:replace-existing}: Request to replace the current primary owner. + +@item @code{:do-not-queue}: If we can not become the primary owner do not +place us in the queue. +@end itemize + +One of the following keywords is returned: +@itemize +@item @code{:primary-owner}: We have become the primary owner of the name +@var{service}. + +@item @code{:in-queue}: We could not become the primary owner and +have been placed in the queue. + +@item @code{:exists}: We already are in the queue. + +@item @code{:already-owner}: We already are the primary +owner. +@end itemize +@end defun + +@defun dbus-unregister-service bus service +Unregister all objects from D-Bus @var{bus}, registered by Emacs for +@var{service}. + +@var{bus} is either the symbol @code{:system} or the symbol +@code{:session}. + +@var{service} is the D-Bus service name of the D-Bus. It must be a +known name. Emacs releases its association to @var{service} from +D-Bus. + +One of the following keywords is returned: +@itemize +@item @code{:released}: We successfully released the name @var{service}. +@item @code{:non-existent}: The name @var{service} does not exist on the bus. +@item @code{:not-owner}: We are not an owner of the name @var{service}. +@end itemize +@end defun + +When a name has been chosen, Emacs can offer own methods, which can be +called by other applications. These methods could be an +implementation of an interface of a well known service, like +@samp{org.freedesktop.TextEditor}. It could be also an implementation of an own interface. In this case, the service name must be @samp{org.gnu.Emacs}. The object path shall @@ -1491,18 +1551,6 @@ to the service from D-Bus. @end defun -@defun dbus-unregister-service bus service -Unregister all objects from D-Bus @var{bus}, registered by Emacs for -@var{service}. - -@var{bus} is either the symbol @code{:system} or the symbol -@code{:session}. - -@var{service} is the D-Bus service name of the D-Bus. It must be a -known name. Emacs releases its association to @var{service} from -D-Bus. -@end defun - @node Signals @chapter Sending and receiving signals. === modified file 'etc/NEWS' --- etc/NEWS 2011-01-04 16:57:45 +0000 +++ etc/NEWS 2011-01-08 05:43:02 +0000 @@ -557,8 +557,13 @@ *** 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. +*** dbus-register-{service,method,property} + The -method and -property functions do not automatically register + names anymore. + The new function dbus-register-service registers a service known + name on a D-Bus without simultaneously registering a property or a + method ** Tramp *** There exists a new inline access method "ksu" (kerberized su). === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-01-04 19:50:21 +0000 +++ lisp/ChangeLog 2011-01-09 15:34:49 +0000 @@ -1,3 +1,10 @@ +2011-01-08 Jan Moringen <jan.moringen@uni-bielefeld.de> + + * net/dbus.el (dbus-unregister-service): translate returned + integer into a symbol + (dbus-register-property): use `dbus-register-service' to do the + name registration + 2011-01-04 Ken Manheimer <ken.manheimer@gmail.com> * Summary: Reconcile with changes in line movement behavior for === modified file 'lisp/net/dbus.el' --- lisp/net/dbus.el 2011-01-04 10:57:24 +0000 +++ lisp/net/dbus.el 2011-01-09 16:03:20 +0000 @@ -193,9 +193,14 @@ (puthash key (delete elt value) dbus-registered-objects-table) (remhash key dbus-registered-objects-table)))))) dbus-registered-objects-table) - (dbus-call-method - bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus - "ReleaseName" service)) + (let ((reply (dbus-call-method + bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus + "ReleaseName" service))) + (case reply + (1 :released) + (2 :non-existent) + (3 :not-owner) + (t (signal 'dbus-error "Could not unregister service"))))) (defun dbus-call-method-non-blocking-handler (&rest args) "Handler for reply messages of asynchronous D-Bus message calls. @@ -914,17 +919,20 @@ bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus "RequestName" service 0)) - ;; 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 - 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) + ;; Add handlers for the three property-related methods. + (dbus-register-method + bus service path dbus-interface-properties "Get" + 'dbus-property-handler t) + (dbus-register-method + bus service path dbus-interface-properties "GetAll" + 'dbus-property-handler t) + (dbus-register-method + bus service path dbus-interface-properties "Set" + 'dbus-property-handler t) + + ;; Register the name SERVICE with BUS. + (unless dont-register-service + (dbus-register-service bus service)) ;; Send the PropertiesChanged signal. (when emits-signal === modified file 'src/ChangeLog' --- src/ChangeLog 2011-01-04 11:11:43 +0000 +++ src/ChangeLog 2011-01-08 05:38:56 +0000 @@ -1,3 +1,34 @@ +2011-01-08 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + Symbols for flags, return values in request-service in dbusbind.c + * dbusbind.c (QCdbus_request_name_allow_replacement): new symbol; + used by dbus-register-service + (QCdbus_request_name_replace_existing): likewise + (QCdbus_request_name_do_not_queue): likewise + (QCdbus_request_name_reply_primary_owner): likewise + (QCdbus_request_name_reply_in_queue): likewise + (QCdbus_request_name_reply_exists): likewise + (QCdbus_request_name_reply_already_owner): likewise + (Fdbus_register_service): changed number of arguments to MANY; + rest arguments are used to supply flags; adapted docstring + accordingly; translate value returned by DBus to a symbol + (Fdbus_register_method): use Fdbus_register_service to do the name + registration + (syms_of_dbusbind): added symbols :allow-replacement, + :replace-existing, :do-not-queue, :primary-owner, :existing, + :in-queue and :already-owner + +2011-01-05 Jan Moringen <jmoringe@techfak.uni-bielefeld.de> + + Added function dbus-register-service in dbusbind.c + * dbusbind.c (Qdbus_register_service): new variable; holds + function dbus-register-service + (Fdbus_register_service): new function; register a service known + name on a D-Bus + (Fdbus_register_method): use Fdbus_register_service to register + the service name + (syms_of_dbusbind): added symbol `dbus-register-service' + 2011-01-04 Jan Moringen <jan.moringen@uni-bielefeld.de> * dbusbind.c (Fdbus_register_method): Added optional parameter === modified file 'src/dbusbind.c' --- src/dbusbind.c 2011-01-04 11:11:43 +0000 +++ src/dbusbind.c 2011-01-09 15:53:12 +0000 @@ -38,6 +38,7 @@ Lisp_Object Qdbus_method_return_internal; Lisp_Object Qdbus_method_error_internal; Lisp_Object Qdbus_send_signal; +Lisp_Object Qdbus_register_service; Lisp_Object Qdbus_register_signal; Lisp_Object Qdbus_register_method; @@ -50,6 +51,17 @@ /* Lisp symbol for method call timeout. */ Lisp_Object QCdbus_timeout; +/* Lisp symbols for name request flags. */ +Lisp_Object QCdbus_request_name_allow_replacement; +Lisp_Object QCdbus_request_name_replace_existing; +Lisp_Object QCdbus_request_name_do_not_queue; + +/* Lisp symbols for name request replies. */ +Lisp_Object QCdbus_request_name_reply_primary_owner; +Lisp_Object QCdbus_request_name_reply_in_queue; +Lisp_Object QCdbus_request_name_reply_exists; +Lisp_Object QCdbus_request_name_reply_already_owner; + /* Lisp symbols of D-Bus types. */ Lisp_Object QCdbus_type_byte, QCdbus_type_boolean; Lisp_Object QCdbus_type_int16, QCdbus_type_uint16; @@ -1835,6 +1847,112 @@ xd_in_read_queued_messages = 0; } +DEFUN ("dbus-register-service", Fdbus_register_service, Sdbus_register_service, + 2, MANY, 0, + doc: /* Register known name SERVICE 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 that should be registered. It must +be a known name. + +FLAGS are keywords, which control how the service name is registered. +The following keywords are recognized: + +`:allow-replacement': Allow another service to become the primary +owner if requested. + +`:replace-existing': Request to replace the current primary owner. + +`:do-not-queue': If we can not become the primary owner do not place +us in the queue. + +The function returns a keyword, indicating the result of the +operation. One of the following keywords is returned: + +`:primary-owner': Service has become the primary owner of the +requested name. + +`:in-queue': Service could not become the primary owner and has been +placed in the queue. + +`:exists': Service is already in the queue. + +`:already-owner': Service is already the primary owner. + +Example: + +\(dbus-register-service :session dbus-service-emacs) + + => :primary-owner. + +\(dbus-register-service +:session "org.freedesktop.TextEditor" +dbus-service-allow-replacement dbus-service-replace-existing) + + => :already-owner. + +usage: (dbus-register-service BUS SERVICE &rest FLAGS) */) + (int nargs, register Lisp_Object *args) +{ + Lisp_Object bus, service; + struct gcpro gcpro1, gcpro2; + DBusConnection *connection; + unsigned int i; + unsigned int value; + unsigned int flags = 0; + int result; + DBusError derror; + + bus = args[0]; + service = args[1]; + + /* Check parameters. */ + CHECK_STRING (service); + + /* Process flags. */ + for (i = 2; i < nargs; ++i) { + value = ((EQ (args[i], QCdbus_request_name_replace_existing)) + ? DBUS_NAME_FLAG_REPLACE_EXISTING + : (EQ (args[i], QCdbus_request_name_allow_replacement)) + ? DBUS_NAME_FLAG_ALLOW_REPLACEMENT + : (EQ (args[i], QCdbus_request_name_do_not_queue)) + ? DBUS_NAME_FLAG_DO_NOT_QUEUE + : -1); + if (value == -1) + XD_SIGNAL2 (build_string ("Unrecognized name request flag"), args[i]); + flags |= value; + } + + /* Open a connection to the bus. */ + connection = xd_initialize (bus, TRUE); + + /* Request the known name from the bus. */ + dbus_error_init (&derror); + result = dbus_bus_request_name (connection, SDATA (service), flags, + &derror); + if (dbus_error_is_set (&derror)) + XD_ERROR (derror); + + /* Cleanup. */ + dbus_error_free (&derror); + + /* Return object. */ + switch (result) { + case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER: + return QCdbus_request_name_reply_primary_owner; + case DBUS_REQUEST_NAME_REPLY_IN_QUEUE: + return QCdbus_request_name_reply_in_queue; + case DBUS_REQUEST_NAME_REPLY_EXISTS: + return QCdbus_request_name_reply_exists; + case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER: + return QCdbus_request_name_reply_already_owner; + default: + return Qnil; + } +} + DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal, 6, MANY, 0, doc: /* Register for signal SIGNAL on the D-Bus BUS. @@ -2014,6 +2132,7 @@ DBusConnection *connection; int result; DBusError derror; + Lisp_Object args[2] = { bus, service }; /* Check parameters. */ CHECK_STRING (service); @@ -2028,18 +2147,9 @@ /* Open a connection to the bus. */ connection = xd_initialize (bus, TRUE); - /* 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. */ - 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); - } + /* Request the name. */ + if (NILP(dont_register_service)) + Fdbus_register_service (2, args); /* Create a hash table entry. We use nil for the unique name, because the method might be called from anybody. */ @@ -2091,6 +2201,10 @@ staticpro (&Qdbus_send_signal); defsubr (&Sdbus_send_signal); + Qdbus_register_service = intern_c_string ("dbus-register-service"); + staticpro (&Qdbus_register_service); + defsubr (&Sdbus_register_service); + Qdbus_register_signal = intern_c_string ("dbus-register-signal"); staticpro (&Qdbus_register_signal); defsubr (&Sdbus_register_signal); @@ -2112,6 +2226,27 @@ QCdbus_session_bus = intern_c_string (":session"); staticpro (&QCdbus_session_bus); + QCdbus_request_name_allow_replacement = intern_c_string (":allow-replacement"); + staticpro (&QCdbus_request_name_allow_replacement); + + QCdbus_request_name_replace_existing = intern_c_string (":replace-existing"); + staticpro (&QCdbus_request_name_replace_existing); + + QCdbus_request_name_do_not_queue = intern_c_string (":do-not-queue"); + staticpro (&QCdbus_request_name_do_not_queue); + + QCdbus_request_name_reply_primary_owner = intern_c_string (":primary-owner"); + staticpro (&QCdbus_request_name_reply_primary_owner); + + QCdbus_request_name_reply_exists = intern_c_string (":exists"); + staticpro (&QCdbus_request_name_reply_exists); + + QCdbus_request_name_reply_in_queue = intern_c_string (":in-queue"); + staticpro (&QCdbus_request_name_reply_in_queue); + + QCdbus_request_name_reply_already_owner = intern_c_string (":already-owner"); + staticpro (&QCdbus_request_name_reply_already_owner); + QCdbus_timeout = intern_c_string (":timeout"); staticpro (&QCdbus_timeout); # Begin bundle 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 52I= ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: DBus methods without name grabbing 2011-01-09 16:08 ` Jan Moringen @ 2011-01-10 11:40 ` Michael Albinus 0 siblings, 0 replies; 13+ messages in thread From: Michael Albinus @ 2011-01-10 11:40 UTC (permalink / raw) To: Jan Moringen; +Cc: emacs-devel Jan Moringen <jan.moringen@uni-bielefeld.de> writes: > Hi Michael, Hi Jan, > sorry for the sloppy patch. I couldn't put as much time into it as I > would have liked. Don't worry. By this, I had something to comment :-) >> > + (dbus-register-method >> > + bus service path dbus-interface-properties "Set" >> > + 'dbus-property-handler nil) >> > + >> > + ;; Register the name SERVICE with BUS. >> > + (unless dont-register-service >> > + (dbus-register-service bus service)) >> >> I guess you mean t (or better 'dont-register) as last argument of the >> dbus-register-method calls. > > I think it has to be t. The service is registered or not in the > following call to `dbus-register-service' depending on > `dont-register-service'. I did not mean the value of `dont-register-service', but a symbol `dont-register'. For better readability, one could use a symbol describing what is meant with a non-nil value. > I hope this increases the quality of the patch to bearable levels. I have committed your patchset. Afterwards, I have applied some further minor tweakings. > Kind regards, > Jan Best regards, Michael. ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <1294201048.2508.1.camel@gunhead>]
* Re: DBus methods without name grabbing [not found] ` <1294201048.2508.1.camel@gunhead> @ 2011-01-05 10:46 ` Jan Moringen 0 siblings, 0 replies; 13+ messages in thread From: Jan Moringen @ 2011-01-05 10:46 UTC (permalink / raw) To: Michael Albinus; +Cc: emacs-devel > > >> - 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. > > > > OK, I'll do it next days (except you want to do it yourself :-) > > I gave it a shot. See attached patch. Like the last patch, this probably > needs revision. I forgot to check dont_register_service in dbus_register_method, but I can't make an updated patch right now. Kind regards, Jan ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2011-01-10 11:40 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-01-02 21:06 DBus methods without name grabbing Jan Moringen 2011-01-03 12:55 ` Michael Albinus 2011-01-04 2:42 ` Jan Moringen 2011-01-04 10:10 ` Michael Albinus 2011-01-04 10:29 ` Jan Moringen 2011-01-04 13:09 ` Michael Albinus 2011-01-05 4:17 ` Jan Moringen 2011-01-05 11:45 ` Michael Albinus 2011-01-08 5:48 ` Jan Moringen 2011-01-09 9:42 ` Michael Albinus 2011-01-09 16:08 ` Jan Moringen 2011-01-10 11:40 ` Michael Albinus [not found] ` <1294201048.2508.1.camel@gunhead> 2011-01-05 10:46 ` Jan Moringen
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).