DBus e Gambas
Introduzione
Il sistema
DBus è (quasi) completamente supportato in Gambas 3 dal componente
gb.dbus.
Che cos'è DBus? È un "sistema di trasporto messaggi", cioè un piccolo programma che può passare diversi tipi di messaggi tra le applicazioni. È come il vecchio sistema DCOP di KDE 3. Per maggiori informazioni, vedi
http://dbus.freedesktop.org.
Ci sono normalmente due tipi di bus in esecuzione sulla macchina: il "bus di sistema", che è globale e unico, e il "bus di sessione", che viene lanciato per ciascun utente connesso.
gb.dbus consente di:
-
Chiamare qualsiasi metodo o proprietà esportati da qualsiasi applicazione connessa al bus.
-
Catturare qualsiasi segnale generato da qualsiasi interfaccia.
-
Esportare qualsiasi oggetto di Gambas su DBus.
Notare che il componente gb.dbus ha una parte scritta in C e una parte scritta in Gambas. La parte scritta in C fornisce classi nascoste (il cui nome inizia con "_"
), mentre la parte scritta in Gambas viene utilizzata per fornire l'interfaccia completa (e facile!) del componente.
Uso di oggetti esportati da altre applicazioni
Chiamare metodi o proprietà
Per chiamare un metodo, utilizzare la seguente sintassi:
DBus[Application][ObjectPath].Method(Arguments)
Per ottenere il valore di una proprietà, utilizzare:
DBus[Application][ObjectPath].Property
Per impostare il valore di una proprietà, utilizzare:
DBus[Application][ObjectPath].Property = Value
Application è la stringa che identifica l'applicazione sul bus. Può iniziare con
"system://"
o
"session://"
per definire con quale bus si desidera connettersi.
Per impostazione predefinita ci si connette con il bus di sessione.
Esempi
DBus["org.kde.kmail"]["/kmail/kmail_mainwindow_1"].geometry = [0, 24, 1024, 768]
Segnali di cattura
I segnali di cattura si basano su due classi:
DBusObserver, e
DBusSignal.
DBusObserver è una classe di basso livello che non si dovrebbe usare se non si hanno esigenze molto specifiche. Utilizzare invece la classe DBusSignal creata sulla classe DBusObserver.
Per guardare un segnale, creare semplicemente un nuovo oggetto DBusSignal in questo modo:
hSignal = New DBusSignal(Bus, Interface, Every) As "MySignal"
-
Bus è il bus con cui ci si connette.
-
Interface è il nome dell'interfaccia che solleva il segnale.
-
Every è una bandiera booleana opzionale che ti consente di catturare i segnali inviati a tutte le applicazioni, non solo alle tue.
Esempi
MySignal = New DBusSignal(DBus.System, "org.freedesktop.Hal.Manager") As "DBusSignal"
...
Public Sub DBusSignal_Signal(Signal As String, Arguments As Variant[])
If Signal = "DeviceAdded" Then
...
EndIf
End
Esportazione di un oggetto Gambas in altre applicazioni
Registrazione dell'oggetto
Per esportare un oggetto Gambas su
DBus, questo oggetto deve ereditare la classe
DBusObject.
Quindi è necessario registrarlo sul bus con il metodo
DBus.Session.Register o DBus.System.Register.
Utilizzare il primo metodo per registrare l'oggetto sul bus
Session, il secondo per registrarlo sul bus
System.
Esempi
Dim hObject As MyClass ' MyClass eredita da DBusObject
DBus.Session.Register(hObject, "/object/path")
L'oggetto Gambas è collegato a un "percorso dell'oggetto", poiché tutti gli oggetti esposti al DBus dall'applicazione sono come un file system gerarchico.
Non appena viene registrato almeno un oggetto, l'applicazione sarà visibile sul bus.
Il nome dell'applicazione sul bus è definito dalla proprietà
DBus.Name. Di default, è definito come
org.gambas.<xxx>
dove
<xxx>
è il valore di
Application.Name.
Cosa viene esportato?
-
Metodi pubblici il cui nome non ha caratteri di sottolineatura all'interno e i cui argomenti e tipi di ritorno possono essere convertiti in un tipo di dati DBus.
-
Proprietà pubbliche il cui nome non ha caratteri di sottolineatura all'interno e il cui tipo può essere convertito in un tipo di dati DBus.
Non appena si registra almeno un oggetto, l'applicazione viene visualizzata sul bus con il nome
"org.gambas.<application name>"
.
Tutti questi metodi e proprietà vengono esportati con un nome di interfaccia denominato
"org.gambas.<application name>.<class name>"
.
È possibile verificarlo con l'esempio di DBus explorer o con il programma Qt4 di qdbusviewer.
Implementazione di un'interfaccia specifica
Un oggetto può implementare interfacce
DBus specifiche utilizzando il terzo argomento facoltativo del metodo Register.
Il terzo argomento è una serie di stringhe di nomi di interfaccia.
Se questo argomento non è specificato, allora, come prima, tutti i metodi e le proprietà pubbliche sono messi sotto l'interfaccia
org.gambas..
.
Ma se questo argomento è specificato, tutti i metodi e le proprietà pubbliche il cui nome inizia con il nome dell'interfaccia vengono messi sotto questa interfaccia.
Il nome dell'interfaccia è normalizzato nel nome del metodo, sostituendo punti con caratteri di sottolineatura e aggiungendo un altro carattere di sottolineatura tra il nome dell'interfaccia e il nome del metodo.
Esempi
' Metodo "Open" dell'interfaccia org.mpris.MediaPlayer2
Public Sub org_mpris_MediaPlayer2_Open()
...
End
' Metodo "Play" dell'interfaccia org.mpris.MediaPlayer2.Player
Public Sub org_mpris_MediaPlayer2_Player_Play()
...
End
' Proprietà "Enabled" dell'interfaccia org.mpris.MediaPlayer2
Property org_mpris_MediaPlayer2_Enabled As Boolean
...
DBus.Session.Register(MyMediaPlayer, "/org/mpris/MediaPlayer2",["org.mpris.MediaPlayer2","org.mrpris.MediaPlayer2.Player"])
Sollevare i segnali
Dal 3.9
È possibile sollevare i segnali D-Bus solo a partire da Gambas 3.9.
Per consentire a un oggetto di generare segnali, è necessario dichiararli prima come eventi di Gambas.
Il nome dell'evento deve essere il nome normalizzato dell'interfaccia, seguito da un trattino di sottolineatura e dal nome normalizzato del segnale.
Il segnale viene emesso dal bus D-Bus utilizzando il metodo
DBusApplication.Raise.
Ad esempio, nel componente
gb.dbus.trayicon, la classe DBusStatusIcon interna è un DBusObject che implementa l'interfaccia
org.kde.StatusNotifierItem
che può generare il segnale "NewIcon", tra molti altri.
Viene implementata in questo modo:
Inherits DBusObject
...
Event org_kde_StatusNotifierItem_NewIcon
...
Il segnale "NewIcon" deve essere sollevato quando l'immagine dell'icona di stato cambia. Viene generato nella funzione che implementa la proprietà
Picture property:
Private Sub Picture_Write(Value As Picture)
...
DBus[GetServiceName()].Raise($hObject, "org.kde.StatusNotifierItem.NewIcon")
End
Mappatura dei tipi di dato
Ecco un riepilogo del modo in cui i tipi di dato Gambas vengono tradotti in tipi di dato DBus e viceversa.
Tipo di dato Gambas
|
Tipo di dato DBus
|
Boolean
|
b
|
Byte
|
y
|
Short
|
n
q
|
Integer
|
i
u
|
Long
|
x
t
|
Single
|
d
|
Float
|
d
|
Date
|
d
|
Pointer
|
x
|
String
|
s
|
Variant
|
v
|
DBusObject
|
o
|
Boolean[]
|
ab
|
Byte[]
|
ay
|
Short[]
|
an
aq
|
Integer[]
|
ai
au
|
Long[]
|
ax
at
|
Single[]
|
ad
|
Float[]
|
ad
|
Date[]
|
ad
|
Pointer[]
|
ax
|
String[]
|
as
|
Variant[]
|
av
(TTT) *
aT *
|
DBusObject[]
|
ao
|
Collection
|
a{sv}
|
*T
rappresenta qualsiasi tipo di dato di DBus.