unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
* ffi-help: libdbus demo
@ 2018-03-26 22:49 Matt Wette
  0 siblings, 0 replies; only message in thread
From: Matt Wette @ 2018-03-26 22:49 UTC (permalink / raw)
  To: guile-user

[-- Attachment #1: Type: text/plain, Size: 5652 bytes --]


Hi All,

Just wrote a little dbus demo (using libdbus) for fun.  Code is attached.

Matt


mwette$ guile dbus03.scm
conn: #<DBusConnection* 0x18c5ed0> = ":1.661"
msg from reply:#<DBusMessage* 0x18c65a0>, serial:3, type:method return
iter_init => 1
result:
   (("Serial" . 86)
    ("ListMemPoolUsedBytes" . 82008)
    ("ListMemPoolCachedBytes" . 3672)
    ("ListMemPoolAllocatedBytes" . 97920)
    ("ActiveConnections" . 78)
    ("IncompleteConnections" . 0)
    ("MatchRules" . 1044)
    ("PeakMatchRules" . 1142)
    ("PeakMatchRulesPerConnection" . 199)
    ("BusNames" . 151)
    ("PeakBusNames" . 153)
    ("PeakBusNamesPerConnection" . 7))





;; dbus03.scm - dbus
;; see http://www.matthew.ath.cx/misc/dbus

(use-modules (ice-9 pretty-print))
(define (sf fmt . args) (apply simple-format #t fmt args))

(use-modules (system ffi-help-rt))
(use-modules ((system foreign) #:prefix ffi:))
(use-modules (bytestructures guile))

(use-modules (ffi dbus))

(define (check-error error)
   (or (zero? (dbus_error_is_set (pointer-to error)))
       (sf "~A\n" (ffi:pointer->string
           (ffi:make-pointer (fh-object-ref error 'message))))))

(define (get-bval &iter key)
   (let* ((bval (make-DBusBasicValue)))
     (dbus_message_iter_get_basic &iter (pointer-to bval))
     (fh-object-ref bval key)))

(define (read-dbus-val &iter)
   ;; 0   0 : invalid; y 121 : byte; b  98 : boolean; n 110 : int16;
   ;; q 113 : uint16; i 105 : int32; u 117 : uint32; x 120 : int64
   ;; t 116 : uint64; d 100 : double; s 115 : string; o 111 : object path
   ;; g 103 : signature; h 104 : unix fd; a  97 : array; v 118 : variant
   ;; r 114 : struct; e 101 : dict entry
   (case (dbus_message_iter_get_arg_type &iter)
     ((0) (if #f #f)) ;; 0 - invalid
     ((121) (get-bval &iter 'byt))            ; y - byte
     ((98) (not (zero? (get-bval &iter 'bool_val)))) ; b - boolean
     ((110) (get-bval &iter 'i16))            ; n - int16
     ((113) (get-bval &iter 'u16))            ; q - uint16
     ((105) (get-bval &iter 'i32))            ; i - int32
     ((117) (get-bval &iter 'u32))            ; u - uint32
     ((120) (get-bval &iter 'i64))            ; x - int64
     ((116) (get-bval &iter 'u32))            ; t - uint64
     ((100) (get-bval &iter 'dbl))            ; d - double
     ((115) (ffi:pointer->string (ffi:make-pointer (get-bval &iter 
'str)))) ; s
     ((111) (error "not defined: o"))    ; o - object path
     ((103) (error "not defined: g"))    ; g - signature
     ((104) (error "not defined: h"))    ; h - unix fd
     ((97) ; a - array
      (let* ((sub-iter (make-DBusMessageIter))
         (&sub-iter (pointer-to sub-iter)))
        (dbus_message_iter_recurse &iter &sub-iter)
        (let loop ()
      (cons (read-dbus-val &sub-iter)
            (if (zero? (dbus_message_iter_next &sub-iter)) '()
            (loop))))))
     ((118) ; v - variant (boxed value)
      (let* ((sub-iter (make-DBusMessageIter))
         (&sub-iter (pointer-to sub-iter)))
        (dbus_message_iter_recurse &iter &sub-iter)
        (read-dbus-val &sub-iter)))
     ((114) (error "not defined: r"))    ; r - struct
     ((101) ;; e - dict entry
      (let* ((sub-iter (make-DBusMessageIter))
         (&sub-iter (pointer-to sub-iter)))
        (dbus_message_iter_recurse &iter &sub-iter)
        (cons
     (read-dbus-val &sub-iter)
     (begin
       (dbus_message_iter_next &sub-iter)
       (read-dbus-val &sub-iter)))))
     (else
      (error "not defined"))))

;; ====================================

(define error (make-DBusError))
(dbus_error_init (pointer-to error))

(define conn (dbus_bus_get 'DBUS_BUS_SESSION (pointer-to error)))
(check-error error)
(sf "conn: ~S = ~S\n" conn (ffi:pointer->string 
(dbus_bus_get_unique_name conn)))

(define msg (dbus_message_new_method_call
          "org.freedesktop.DBus"        ; bus name (was NULL)
          "/org/freedesktop/DBus"        ; object path
          "org.freedesktop.DBus.Debug.Stats"    ; interface name
          "GetStats"))            ; method

(define pending (make-DBusPendingCall*))
(or (dbus_connection_send_with_reply conn msg (pointer-to pending) -1)
     (error "*** send_with_reply FAILED\n"))
(if (zero? (fh-object-ref pending)) (display "*** pending NULL\n"))

(dbus_connection_flush conn)
(dbus_message_unref msg)
(dbus_pending_call_block pending)

(set! msg (dbus_pending_call_steal_reply pending))
(if (zero? (fh-object-ref msg)) (error "*** reply message NULL\n"))
(sf "msg from reply:~S, serial:~S, type:~A\n" msg 
(dbus_message_get_serial msg)
     (let ((msg-type (dbus_message_get_type msg)))
       (cond
        ((eq? (DBUS 'MESSAGE_TYPE_INVALID) msg-type) "invalid")
        ((eq? (DBUS 'MESSAGE_TYPE_METHOD_CALL) msg-type) "method call")
        ((eq? (DBUS 'MESSAGE_TYPE_METHOD_RETURN) msg-type) "method return")
        ((eq? (DBUS 'MESSAGE_TYPE_ERROR) msg-type) "error")
        ((eq? (DBUS 'MESSAGE_TYPE_SIGNAL) msg-type) "signal"))))

(define msg-iter (make-DBusMessageIter))
(dbus_pending_call_unref pending)

(sf "iter_init => ~S\n" (dbus_message_iter_init msg (pointer-to msg-iter)))
(sf "result:\n")
(pretty-print (read-dbus-val (pointer-to msg-iter)) #:per-line-prefix "  ")

(dbus_message_unref msg)
;;(dbus_connection_close conn)

;; --- last line ---


[-- Attachment #2: dbus-demo.tar.gz --]
[-- Type: application/gzip, Size: 29105 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2018-03-26 22:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-26 22:49 ffi-help: libdbus demo Matt Wette

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).