;;; zeroconf.el --- Service browser using Avahi.
-;; Copyright (C) 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2008-2015 Free Software Foundation, Inc.
;; Author: Michael Albinus <michael.albinus@gmx.de>
;; Keywords: comm, hardware
;; The function `zeroconf-publish-service' publishes a new service to
;; the Avahi daemon. Although the domain, where to the service is
-;; published, can be specified by this function, it is usally the
+;; published, can be specified by this function, it is usually the
;; default domain "local" (also written as nil or "").
;; (zeroconf-publish-service
;; Pacify byte-compiler. D-Bus support in the Emacs core can be
;; disabled with configuration option "--without-dbus". Declare used
;; subroutines and variables of `dbus' therefore.
-(eval-when-compile
- (require 'cl))
-
-(declare-function dbus-call-method "dbusbind.c")
-(declare-function dbus-register-signal "dbusbind.c")
(defvar dbus-debug)
(require 'dbus)
APROTOCOL stands for the network protocol family ADDRESS is
encoded (`zeroconf-avahi-protocol-inet4' means INET4,
`zeroconf-avahi-protocol-inet6' means INET6). It can be
-different from PROTOCOL, when an adrress resolution has been
+different from PROTOCOL, when an address resolution has been
requested for another protocol family but the default one.
ADDRESS is the service address, encoded according to the
(let ((l-hook (gethash type zeroconf-service-removed-hooks-hash nil)))
(add-hook 'l-hook function)
(puthash type l-hook zeroconf-service-removed-hooks-hash)))
- (t (error "EVENT must be either `:new' or `:removed'."))))
+ (t (error "EVENT must be either `:new' or `:removed'"))))
+
+(defun zeroconf-service-remove-hook (type event function)
+ "Remove FUNCTION from the hook of service type TYPE.
+
+EVENT must be either :new or :removed and has to match the event
+type used when registering FUNCTION."
+ (let* ((table (cond
+ ((equal event :new)
+ zeroconf-service-added-hooks-hash)
+ ((equal event :removed)
+ zeroconf-service-removed-hooks-hash)
+ (t (error "EVENT must be either `:new' or `:removed'"))))
+ (l-hook (gethash type table nil)))
+ (remove-hook 'l-hook function)
+ (if l-hook
+ (puthash type l-hook table)
+ (remhash type table))))
(defun zeroconf-get-host ()
"Returns the local host name as string."
(elt (nth 9 result))) ;; TXT.
;; The TXT field has the signature "aay". Transform to "as".
(while elt
- (setcar elt (apply 'string (car elt)))
+ (setcar elt (dbus-byte-array-to-string (car elt)))
(setq elt (cdr elt)))
(when nil ;; We discard it, no use so far.
(nth 9 (zeroconf-resolve-service service)))
\f
-;;; Services signalling.
+;;; Services signaling.
;; Register for the service type browser. Service registrations will
;; happen in `zeroconf-service-type-browser-handler', when there is an
(dbus-ping :system zeroconf-service-avahi)
(dbus-call-method
:system zeroconf-service-avahi zeroconf-path-avahi
- zeroconf-interface-avahi-server "IsNSSSupportAvailable"))
+ zeroconf-interface-avahi-server "GetVersionString"))
;; Reset all stored values.
(setq zeroconf-path-avahi-service-type-browser nil
((string-equal (dbus-event-member-name last-input-event) "ItemNew")
;; Parameters: (interface protocol type domain flags)
;; Register a service browser.
- (let ((object-path (zeroconf-register-service-browser (nth-value 2 val))))
+ (let ((object-path (zeroconf-register-service-browser (nth 2 val))))
;; Register the signals.
(dolist (member '("ItemNew" "ItemRemove" "Failure"))
(dbus-register-signal
;; The "TXT" field has the signature "aay". Transform to "as".
(let ((elt (nth 9 val)))
(while elt
- (setcar elt (apply 'string (car elt)))
+ (setcar elt (dbus-byte-array-to-string (car elt)))
(setq elt (cdr elt))))
(when zeroconf-debug
(message "zeroconf-service-resolver-handler: %s %S"
;; The TXT field has the signature "as". Transform to "aay".
(dolist (elt txt)
- (let (args)
- (add-to-list
- 'result
- (dolist (elt1 (string-to-list elt) (append '(:array) args))
- (setq args (append args (list :byte elt1)))))))
+ (add-to-list 'result (dbus-string-to-byte-array elt)))
;; Add the service.
(dbus-call-method
(provide 'zeroconf)
-;; arch-tag: ea578165-7fa8-44f4-90f0-de3940aec69f
;;; zeroconf.el ends here