[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