dbus + udisks pasted by mario-goulart on Wed Jun 25 14:52:12 2014

(use extras dbus)

(define udisks-context
  (make-context
   bus: system-bus
   interface: 'org.freedesktop.UDisks
   service: 'org.freedesktop.UDisks
   path: '/org/freedesktop/UDisks))

;; This works
;; (print (call udisks-context "EnumerateDevices"))

(enable-polling-thread! bus: system-bus)

(register-method udisks-context "DeviceAdded"
                 (lambda args
                   (printf "DeviceAdded args: ~S" args)))

(poll-for-message bus: system-bus)


;; $ csi -s udisks.scm
;;
;; Error: (assq) bad argument type: #f
;;
;;         Call history:
;;
;;         <syntax>          (##core#quote org.freedesktop.UDisks)
;;         <syntax>          (quote org.freedesktop.UDisks)
;;         <syntax>          (##core#quote org.freedesktop.UDisks)
;;         <syntax>          (quote /org/freedesktop/UDisks)
;;         <syntax>          (##core#quote /org/freedesktop/UDisks)
;;         <eval>    (make-context bus: system-bus interface: (quote org.freedesktop.UDisks) service: (quote org.freedesk......
;;         <syntax>          (enable-polling-thread! bus: system-bus)
;;         <eval>    (enable-polling-thread! bus: system-bus)
;;         <syntax>          (register-method udisks-context "DeviceAdded" (lambda args (printf "DeviceAdded args: ~S" args)))
;;         <syntax>          (lambda args (printf "DeviceAdded args: ~S" args))
;;         <syntax>          (##core#lambda args (printf "DeviceAdded args: ~S" args))
;;         <syntax>          (##core#begin (printf "DeviceAdded args: ~S" args))
;;         <syntax>          (printf "DeviceAdded args: ~S" args)
;;         <eval>    (register-method udisks-context "DeviceAdded" (lambda args (printf "DeviceAdded args: ~S" args)))
;;         <syntax>          (poll-for-message bus: system-bus)
;;         <eval>    (poll-for-message bus: system-bus)    <--

dbus compiled with -O1 -d2 pasted by mario-goulart on Wed Jun 25 15:16:15 2014

$ csi -s udisks.scm

Error: (assq) bad argument type: #f

        Call history:

        dbus.scm:809: ##sys#gc    
        dbus.scm:832: g1354       
        dbus.scm:201: find-callback       
        dbus.scm:674: ##sys#peek-c-string         
        dbus.scm:689: string?->symbol     
        dbus.scm:245: string->symbol      
        dbus.scm:677: ##sys#peek-c-string         
        dbus.scm:690: string?->symbol     
        dbus.scm:245: string->symbol      
        dbus.scm:680: ##sys#peek-c-string         
        dbus.scm:691: string?->symbol     
        dbus.scm:245: string->symbol      
        dbus.scm:686: ##sys#peek-c-string         
        dbus.scm:692: string?->symbol     
        dbus.scm:245: string->symbol      
        dbus.scm:701: tassq             <--

Another dbus+udisks example added by mario-goulart on Thu Jul 3 20:49:41 2014

(use extras dbus)

;; dbus returns #(#<unsupported-type >) to represent empty container
;; values
(define (empty-dbus-value? val)
  (and (vector? val)
       (> (vector-length val) 0)
       (unsupported-type? (vector-ref val 0))))


(define (dbus-value property properties)
  (let ((val (alist-ref property properties equal?)))
    (cond ((empty-dbus-value? val)
           value-not-set)
          ((variant? val)
           (let ((data (variant-data val)))
             (if (empty-dbus-value? data)
                 value-not-set
                 data)))
          (else val))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define udisks-context
  (make-context
   bus: system-bus
   interface: 'org.freedesktop.UDisks
   service: 'org.freedesktop.UDisks
   path: '/org/freedesktop/UDisks))

(define (handle-new-device object-path)
  (let* ((dev-ctx (make-context
                   bus: system-bus
                   interface: 'org.freedesktop.DBus.Properties
                   service: 'org.freedesktop.UDisks
                   path: (object-path->string object-path)))
         (props/vals
          (vector->list
           (car (call dev-ctx "GetAll" "org.freedesktop.UDisks.Device"))))
         (drive-model (dbus-value "DriveModel" props/vals))
         (device-file (dbus-value "DeviceFile" props/vals))
         (removable? (dbus-value "DeviceIsRemovable" props/vals))
         (fs? (dbus-value "IdUsage" props/vals))
         (fs-type (dbus-value "IdType" props/vals))
         (media-available? (dbus-value "DeviceIsMediaAvailable" props/vals))
         (partition? (dbus-value "DeviceIsPartition" props/vals))
         (partition-label (dbus-value "PartitionLabel" props/vals))
         (partition-number (dbus-value "PartitionNumber" props/vals)))

    (print "====================================================================================")
    (pp `((drive-model ,drive-model)
          (device-file ,device-file)
          (removable?  ,removable?)
          (fs?         ,fs?)
          (fs-type     ,fs-type)
          (media-available? ,media-available?)
          (partition?  ,partition?)
          (partition-label ,partition-label)
          (partition-number ,partition-number)))
    (print "====================================================================================")
    ))


(register-signal-handler udisks-context
                         "DeviceAdded"
                         handle-new-device)

(enable-polling-thread! bus: system-bus enable: #f)

(let loop ()
  (poll-for-message bus: system-bus timeout: 100)
  (loop))