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.