guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fun (system foreign) / D-Bus / oFono hacking


From: Neil Jerram
Subject: Fun (system foreign) / D-Bus / oFono hacking
Date: Sat, 21 Jan 2012 23:33:36 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux)

Just in case anyone else is interested in these areas...  I had a really
fun time today using the dynamic FFI to hack up Guile code to access
oFono's D-Bus API.  It's really great to be able to do this, even if it
might be more efficient in the long run to write a proper C binding.

I've attached the extremely-thrown-together code below.  Obviously it
ought to evolve (at least) into a more generic D-Bus module, and an
oFono-specific module that uses that, but right now I'm just playing...

      Neil



(use-modules (system foreign)
             (rnrs bytevectors))


(define gobject (dynamic-link "libgobject-2.0"))
(define glib (dynamic-link "libglib-2.0"))
(define gio (dynamic-link "libgio-2.0"))

(write gobject)
(newline)
(write glib)
(newline)
(write gio)
(newline)

(dynamic-call "g_type_init" gobject)

(define FALSE 0)
(define TRUE 1)

(define g_main_loop_new
  (pointer->procedure '*
                      (dynamic-func "g_main_loop_new" glib)
                      (list '* int)))

(define loop (g_main_loop_new %null-pointer FALSE))

(write loop)
(newline)

(define g_dbus_proxy_new_for_bus_sync
  (pointer->procedure '*
                      (dynamic-func "g_dbus_proxy_new_for_bus_sync" gio)
                      (list int         ; bus type
                            int         ; flags
                            '*          ; interface info
                            '*          ; bus name
                            '*          ; object path
                            '*          ; interface name
                            '*          ; cancellable
                            '*          ; error
                            )))


;; bus type
(define G_BUS_TYPE_SYSTEM 1)
(define G_BUS_TYPE_SESSION 2)

;; flags
(define G_DBUS_PROXY_FLAGS_NONE 0)

(define manager-proxy
  (g_dbus_proxy_new_for_bus_sync G_BUS_TYPE_SYSTEM
                                 G_DBUS_PROXY_FLAGS_NONE
                                 %null-pointer
                                 (string->pointer "org.ofono")
                                 (string->pointer "/")
                                 (string->pointer "org.ofono.Manager")
                                 %null-pointer
                                 %null-pointer))

(write manager-proxy)
(newline)

(define g_dbus_proxy_call_sync
  (pointer->procedure '*
                      (dynamic-func "g_dbus_proxy_call_sync" gio)
                      (list '*          ; proxy
                            '*          ; method_name
                            '*          ; parameters
                            int         ; flags
                            int         ; timeout_msec
                            '*          ; cancellable
                            '*          ; error
                            )))

(define return-parms (g_dbus_proxy_call_sync manager-proxy
                                             (string->pointer "GetModems")
                                             %null-pointer
                                             0
                                             1000
                                             %null-pointer
                                             %null-pointer))

(define g_variant_get_child_value
  (pointer->procedure '*
                      (dynamic-func "g_variant_get_child_value" glib)
                      (list '*          ; variant
                            int         ; index
                            )))

(define g_variant_print
  (pointer->procedure '*
                      (dynamic-func "g_variant_print" glib)
                      (list '*          ; variant
                            int         ; type annotate
                            )))

(define g_variant_get_type
  (pointer->procedure '*
                      (dynamic-func "g_variant_get_type" glib)
                      (list '*          ; variant
                            )))

(define g_variant_get_string
  (pointer->procedure '*
                      (dynamic-func "g_variant_get_string" glib)
                      (list '*          ; variant
                            '*          ; length
                            )))

(define (print-variant variant)
  (if (null-pointer? variant)
      (display "(null variant pointer)")
      (begin
        (display (pointer->string (g_variant_get_type variant)))
        (display ": ")
        (display (pointer->string (g_variant_print variant FALSE)))))
  (newline))

(print-variant return-parms)

(define modems (g_variant_get_child_value return-parms 0))
(print-variant modems)

(define first-modem (g_variant_get_child_value modems 0))
(print-variant first-modem)

(define modem-name (g_variant_get_child_value first-modem 0))
(print-variant modem-name)

(define modem-name-string
  (pointer->string (g_variant_get_string modem-name %null-pointer)))
(format #t "First modem's name is ~a\n" modem-name-string)

(define modem-proxy
  (g_dbus_proxy_new_for_bus_sync G_BUS_TYPE_SYSTEM
                                 G_DBUS_PROXY_FLAGS_NONE
                                 %null-pointer
                                 (string->pointer "org.ofono")
                                 (string->pointer modem-name-string)
                                 (string->pointer "org.ofono.Modem")
                                 %null-pointer
                                 %null-pointer))

(write modem-proxy)
(newline)

(define g_variant_new_string
  (pointer->procedure '*
                      (dynamic-func "g_variant_new_string" glib)
                      (list '*          ; string
                            )))

(define g_variant_new_boolean
  (pointer->procedure '*
                      (dynamic-func "g_variant_new_boolean" glib)
                      (list int         ; boolean
                            )))

(define g_variant_new_tuple
  (pointer->procedure '*
                      (dynamic-func "g_variant_new_tuple" glib)
                      (list '*          ; GVariant **
                            int         ; num children
                            )))

(define powered (g_variant_new_string (string->pointer "Powered")))
(print-variant powered)
(define true (g_variant_new_boolean TRUE))
(print-variant true)

(define bv (uint-list->bytevector (map pointer-address
                                       (list powered true))
                                  (native-endianness)
                                  (sizeof '*)))
(write bv)
(newline)

(define parms (g_variant_new_tuple (bytevector->pointer bv) 2))
(print-variant parms)

(define return-parms
  (g_dbus_proxy_call_sync modem-proxy
                          (string->pointer "SetProperty")
                          parms
                          0
                          1000
                          %null-pointer
                          %null-pointer))

(print-variant return-parms)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]