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!