DBus e Gambas
Introdução
O sistema
DBus é (quase) totalmente suportado no Gambas 3, pelo componente
gb.dbus.
O que é DBus? É um "sistema de barramento de mensagens", ou seja, um pequeno programa que pode
passar diferentes tipos de mensagens entre as aplicações. É como o Sistema DCOP no KDE 3.
Para mais informações, consulte
http://dbus.freedesktop.org.
Normalmente, existem dois tipos de bus rodando na sua máquina: o "barramento do sistema",
que é global e único, e o "session bus", que é lançado para cada
usuário conectado.
gb.dbus permite que você:
-
Chame qualquer método ou propriedade exportados por qualquer aplicativo que está conectado com o bus.
-
Pegar qualquer sinal levantado por qualquer interface.
-
Exportar qualquer objeto Gambas para o DBus.
Observe que o componente gb.dbus tem uma parte escrita em C e uma parte escrita em
Gambas. A parte escrita em C fornecem classes ocultos (cujo nome começa com
"_"
). A parte escrita em Gambas fornece uma total (e fácil!)
interface do componente.
Usando objetos exportados por outras aplicações
Chamando métodos e propriedades
Para chamar um método, use a seguinte sintaxe:
DBus[Application][ObjectPath].Method(Arguments)
Para obter o valor de uma propriedade, faça:
DBus[Application][ObjectPath].Property
E para definir o valor de uma propriedade, faça:
DBus[Application][ObjectPath].Property = Value
Application é a string que identifica a aplicação no bus.
Ela pode começar com
"system://"
ou
"session://"
para definir quais bus
você quer se conectar.
Por padrão, você se conecta com o session bus.
Exemplos
DBus["org.kde.kmail"]["/kmail/kmail_mainwindow_1"].geometry = [0, 24, 1024, 768]
Capturando sinais
Sinais capturados se baseiam em duas classes:
DBusObserver, e
DBusSignal.
DBusObserver é uma classe de baixo nível que você não deve usar a menos que você tenha necessidades específicas.
Em vez disso, use a classe DBusSignal que é construída sobre a classe DBusObserver.
Para observar um sinal, basta criar um novo objeto DBusSignal dessa forma:
hSignal = New DBusSignal(Bus, Interface, Every) As "MySignal"
-
Bus é o bus que você está se conectando.
-
Interface é o nome da interface que levanta o sinal.
-
Every é um sinalizador booleano opcional que lhe permite captar sinais enviados para todas as aplicações, e não apenas para a sua.
Exemplo
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
Exportar objetos Gambas para outras aplicações
Registrando o objeto
Para exportar um objeto Gambas para
DBus, este objeto deve herdar da classe
DBusObject.
Então você tem que registrá-lo para o bus com o
DBus.Session.Register ou o método DBus.System.Register.
Use o primeiro método para registrar o seu objeto no bus
Session, o segundo para registrá-lo no bus
System.
Exemplos
Dim hObject As MyClass ' MyClass inherits DBusObject
DBus.Session.Register(hObject, "/object/path")
O objeto Gambas está ligado a um "object path", porque todos os objetos expostos
ao DBus por sua aplicação é como um sistema de arquivos hierárquico.
Assim que pelo menos um objeto é registrado, o aplicativo será visível no bus.
O nome da sua aplicação no bus é definida por
DBus.Name Por padrão, ele é definido como
org.gambas.<xxx>
onde
<xxx>
é o valor de
Application.Name.
O que é exportado?
-
Métodos públicos cujo nome não tem sublinhado dentro, e cujos argumentos e tipo de retorno pode ser convertido para um tipo de dados DBus.
-
As propriedades públicas cujo nome não tem sublinhado dentro, e cujo tipo pode ser convertido para um tipo de dados DBus.
Assim que você registrar pelo menos um objeto, o aplicativo aparece no
bus com o nome
"org.gambas.<application name>"
.
Todos esses métodos e propriedades são exportados com um nome de interface chamado
"org.gambas.<application name>.<class name>"
.
Você pode verificar com o exemplo DBus explorer, ou o programa qdbusviewer Qt4.
A implementação de uma interface específica
Um objeto pode implementar interfaces específicas
DBus usando o terceiro argumento opcional do método Register.
Esse terceiro argumento é uma matriz de string de nomes de interface.
Se esse argumento não for especificado, então, como antes, todos os métodos públicos
e as propriedades são colocadas sob as interface
org.gambas..
.
Mas, se esse argumento for especificado, todos os métodos públicos e propriedades
cujo nome começa com o nome da interface são colocados sob esta interface.
O nome da interface é normalizado pelo nome do método, através da substituição de pontos por sublinhados,
e adicionando outra sublinhado entre o nome da interface e o nome do método.
Exemplos
' "Open" método da interface org.mpris.MediaPlayer2
Public Sub org_mpris_MediaPlayer2_Open()
...
End
' "Play" método da interface org.mpris.MediaPlayer2.Player
Public Sub org_mpris_MediaPlayer2_Player_Play()
...
End
' "Enabled" propriedade da interface org.mpris.MediaPlayer2
Property org_mpris_MediaPlayer2_Enabled As Boolean
...
DBus.Session.Register(MyMediaPlayer, "/org/mpris/MediaPlayer2",["org.mpris.MediaPlayer2","org.mrpris.MediaPlayer2.Player"])
Levantar sinais
Você não pode levantar sinais
DBus. Isso ainda não está implementado!