[Kde-br] Apresentação
Lamarque Vieira Souza
lamarque em gmail.com
Sexta Maio 21 03:33:00 CEST 2010
Em Quinta-feira 20 Maio 2010, Tulio Magno Quites Machado Filho escreveu:
> On Wednesday 19 May 2010 14:03:33 Lamarque Vieira Souza wrote:
> > O Daniel sugeriu de criar uma interface para o connman na verdade
> > pode-se
> >
> > usar a mesma interface do networkmanager e só criar um backend no solid
> > para o connman e carregá-lo no lugar backend do networkmanager. O connman
> > deve ter uma specificação da interface dbus dele em algum lugar, com essa
> > specificação em mãos fica mais fácil implementar o backend. Se alguém
> > estiver interessado é só me avisar.
>
> Eu tenho interesse. :-)
>
> A especificação do connman eu já tenho.
> Para os interessados está no arquivo doc/manager-api.txt dos fontes.
>
> Estou com dificuldade para encontrar informações no Solid.
> O site dele está com diversos links quebrados e não encontrei, ainda,
> referências ao backend do NM no código dele.
>
> Abraços,
O Solid tem a interface para o networkmanager em
kdebase/workspace/libs/solid/control/{networkmanager.cpp
,networkmanager.h,etworkmanager_p.h} e
kdebase/workspace/libs/solid/control/ifaces/{networkmanager.cpp
,networkmanager.h}. Os paths são relativos ao trunk so svn do KDE. O que está
no subdiretório ifaces é a interface em si, com classes com métodos quase
todos virtuais e zerados (pra quem sabe Java uma classe com todos os
métodos virtuais e zerados é o equivalente do C++ a um interface do Java).
O backend está em kdebase/workspace/solid/networkmanager-0.7. Esse já é
mais complicado explicar como funciona. Vamos começar de trás pra frente, tem
o diretório kdebase/workspace/solid/networkmanager-0.7/dbus/introspection com
os arquivos .xml da interface dbus do backend, você tem que editar esses
arquivos e colocar toda a specificação do connman lá (interfaces, methods,
signals). Teoricamente os enumerates eram para ir lá também, mas eu prefiro
colocá-los nos .h em kdebase/workspace/libs/solid/control para que fiquem
disponíveis para qualquer programa.
Depois de criado o .xml tem que subir um diretório
(kdebase/workspace/solid/networkmanager-0.7/dbus) e rodar o comando:
qdbusxml2cpp -N -m -p <nome base dos arquivos .cpp e .h sem extensão>
introspection/<arquivo .xml>, assim:
qdbusxml2cpp -N -m -p mm-gsm-networkinterface introspection/mm-gsm-network.xml
Ele vai gerar os arquivos mm-gsm-networkinterface.h e mm-gsm-
networkinterface.cpp no diretório atual
(kdebase/workspace/solid/networkmanager-0.7/dbus). Você pode ignorar o .cpp, o
.h é que é importante. Tem
que fazer uma correção nele para ele compilar: trocar os hífens (-) por
underscores (_) no #if e #define que estão no início, sem isso dá erro na
compilação.
Depois de gerados esses dois arquivos sobe-se mais um diretório
(kdebase/workspace/solid/networkmanager-0.7) e aí é que você terá que
implementar o backend em si usando os methods e signals que estão no .h do
sub-diretório dbus. No caso do connman você terá que criar um subdiretório
kdebase/workspace/solid/connmon-<versão dele>, colocar o backend lá, os .xml
em kdebase/workspace/solid/connmon-<versão dele>/dbus/introspection/, editar
os CMakeLists.txt e fazer todo esse processo mencionado anteriormante.
Depois de tudo feito você ainda tem que conectar os signals e methods do
backend com a interface. É assim, edita o arquivo .cpp da interface, no caso
do NM é o kdebase/workspace/libs/solid/control/networkmanager.cpp, e no
construtor da classe principal do .cpp tem que fazer os connects normais da
Qt, algo assim:
connect(managerBackend(), SIGNAL(statusChanged(Solid::Networking::Status)),
this, SIGNAL(statusChanged(Solid::Networking::Status)));
Já tem um monte de exemplos disso no .cpp. Depois tem que criar um method
nesse classe para todos os methods do backend que devem ser exportados (todos
os methods e signals mencionados em
kdebase/workspace/libs/solid/control/ifaces/networkmanager.h no caso do NM.
Depois disso é compilar e ver se roda :-) Ok, não é algo tão simples
assim e eu também já quebrei bastante cabeça com isso desde o mês passado. Só
fazendo pra saber como é. Se quiser pode dar uma olhada na minha implementação
do ModemManager (http://reviewboard.kde.org/r/3769/) lá tem tudo separado, só
avisando que esse patch é grande, ele mexe em 40 arquivos ao todo (entre .xml,
.cpp, .h e CMakeLists.txt), mas não tem muito jeito não, tem ver como foi
feito pra saber o que se deve fazer.
No meu caso eu implementei o suporte ao ModemManager em cima do backend
do NetworkManager para simplificar as coisas, o jeito certo seria eu criar um
sub-diretório kdebase/workspace/solid/modemmanager-0.4 mas aí o patch seria
bem maior e mais complicado de manter. Quando o trunk for reaberto para novas
"features" eu vou criar esse diretório, até lá eu espero ter terminado de
implementar a especificação do MM do jeito que estou fazendo, assim eu jogo
tudo de uma vez no trunk.
--
Lamarque V. Souza
http://www.geographicguide.com/brazil.htm
Linux User #57137 - http://counter.li.org/
http://www.kde-mg.org
Mais detalhes sobre a lista de discussão Kde-br