logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

Apresentando o projeto OmniObjects

Apresento aos meus prezados leitores meu primeiro projeto open source, o OmniObjects. Esse projeto tem o (nada) humilde objetivo de substituir do Microsoft DCOM com algo mais extensível, mais configurável e open source.

Como todos sabem, eu gosto muito de COM, acho o padrão binário do COM um conceito simples, extensível e extremamente multiplataforma. O Firefox (que roda em mais plataformas e sistemas operacionais que meus dedos conseguem contar), por exemplo, é todo feito em XPCOM, que é uma versão do COM feita pelo pessoal da Mozilla Foundation. O CORBA usa exatamente o mesmo conceito. Além desse padrão binário ser independente de linguagem (coisa que o .NET também é), ele também é independente de runtime (coisa que tudo baseado em .NET não é). Não adianta, a coisa mais multiplataforma que existe é C/C++, ainda não inventaram nada que seja mais portável do que um código fonte.

A Microsoft resolveu os problemas do DCOM criando a plataforma .NET, o Remoting e o Windows Communication Foundation. Muito bom, mas se você pretende continuar no C++ nativo, bare metal, sua única alternativa é continuar convivendo com as qualidades e com as limitações do DCOM, além da certeza de que a Microsoft não investirá mais muito tempo nisso. Apesar do DCOM ser uma plataforma madura e testada, lhe falta um toque de Internet. DCOM funciona muito bem em redes locais, mas não é configurável o suficiente para ser usado via Internet. Aí entra o projeto OmniObjects.

O OmniObjects faz exatamente o que faz o DCOM: leva uma chamada à um método de um objeto de uma máquina para outra. Só que ao invés de existir um serviço no Windows que atende requisições em uma porta fixa, você mesmo pode fazer o host do componentes, da mesma forma que no .NET Remoting. Como um código vale mais que mais um entre os milhões de projetos no SourceForge, veja isto:

int main()
{
  OmniInitialize();
 
  OmniInitializeHosting(L"TCP", L"12345");

  //
  // pronto, já estamos atendendo requisições
  // usando TCP, e na porta 12345. 
  // 
  // "Olhe mamãe, sem a porta 135!"
  //
  _getch();
 
  OmniUninitialize();
 
  return 0;
}

Fazer host de objetos COM usando OmniObjects parece simples. E você nem precisa de loop de mensagens como no COM, ele cria uma thread separada para atender as requisições. O código para instanciar um objeto remoto também não é lá muito complicado. Veja com seus próprios olhos:

int main()
{
  OmniInitialize();
  {
    //
    // esse é o nosso smart pointer mais smart do que os outros
    // você não precisa usá-lo, pode usar _com_ptr_t, CComPtr
    // ou gerenciar na mão, como no tempo das cavernas
    //
    omni_ptr<ITest1> pTest1; 
    CComBSTR bstr(L"Olhe mamãe, eu consigo passar pelo firewall!"), bstrOut;
    unsigned int a = 10;
 
    OmniCreateRemoteInstance(L"tcp://127.0.0.1:12345", CLSID_Test1,
                             NULL, __uuidof(ITest1), pTest1.ppvoid());
 
    pTest1->Method1(bstr, 25);
    pTest1->Method2(&bstr, &a, &bstrOut);
  }  
  OmniUninitialize();
  return 0;
}

Todo o resto é COM. O que muda em relação ao DCOM é a instanciação do objetos e o hosting. Claro, não tem segurança integrada com Windows, mas isso muitas vezes é uma vantagem. Imagine que você está fazendo um Instant Messenger. Usando OmniObjects você nunca mais vai precisar usar sockets e ficar fazendo parse de pacotes na memória. O código para enviar uma mensagem pode ser algo simples como pInstantMessengerServer->SendMessage("user12312", "Free your mind");. Só não esqueça que apesar de tudo parecer maravilhoso, o projeto OmniObjects ainda está na versão 0.10. Tudo ficará mais maravilhoso ainda (inclusive chamadas via HTTP, etc) ao longo do tempo. :-)

Para fazer com que seu objeto sejá acessível pelo OmniObjects, tudo que você precisa fazer é compilar seu arquivo IDL com o OmniIdl.exe e compilar o projeto Visual C++ 8.0 que ele gerará. Isso produzirá a DLL de proxy e stub que fará toda mágica funcionar. Para mais detalhes e instruções veja a página do projeto OmniObjects.

O OmniObjects é um projeto open source hospedado no SourceForge. Ele está disponibilizado usando licença BSD, que é basicamente: use os fontes para o que você quiser - inclusive para ficar milionário com um aplicativo comercial baseado nele e não me dar nenhum centavo e nem os fontes modificados de volta - contanto que não me responsabilize por nada que acontecer pelo uso desse fonte. Baixe a versão 0.1 enquanto ainda está quente e faça um bom proveito.


Em 28/09/2006 04:42, por Rodrigo Strauss


  
 
 
Comentários
Wander Lairson Costa | em 28/09/2006 | #
Fiz o primeiro download hein! Que fique registrado... hehehehe

Eu também mantenho um pequeno projeto open source (bem menos ambicioso), um wrapper da libusb para Python, http://pyusb.berlios.de.

Parabéns pela iniciativa!
Wanderley Caloni | website | e-mail | em 28/09/2006 | #
Sinto desapontá-lo, Lairson, mas cheguei primeiro. Como dizem aqueles moleques do IRC: uhHAUhuHAAHuhuAUHuHUAHuHAU. Brincadeirinha =)

Vale comentar, Strauss, que seu projeto depende do boost. Também vale comentar qual versão do boost (já que eles têm algum histórico de quebra de compatibilidade). Eu baixei a última versão e compilou tudo "prefeitamente".

[]s
Rodrigo | em 28/09/2006 | #
Interessantíssimo =)
Wander Lairson Costa | em 28/09/2006 | #
Bem, pelo menos fui o primeiro a comentar... hehehehe
A propósito Strauss, você pensa em portar seu projeto para outras plataformas?
Rodrigo Strauss | website | em 28/09/2006 | #
Sim, a idéia é portar esse projeto pra Linux assim que ele estiver um pouco mais estável. O OmniIdl que é uma das partes principais está bem multiplataforma, usando C++ ISO e Boost. O OmniObjects.dll vai ser um pouco mais difícil. Mas a parte mais complicada é a de TCP/IP, que no Linux eu pretendo usar o xinetd para simplificar.
./techberto | em 28/09/2006 | #
Sobre o fato do projeto estar na versão 0.10, como já dizia o milenar provérbio grego "Começar já é metade de toda ação"; neste caso do projeto.

Baixei, compilei, funcionou e achei bem interessante!

Meus parabéns pela iniciativa.

[]s++
AngusYoung | website | em 29/09/2006 | #
Parece uma ferramenta interessante para um projeto, open source, que estou desenvolvendo. Uma pena que, no momento, só tenho acesso ao Visual Studio 2005 Express :(
De qualquer maneira, boa sorte com o projeto! E não deixe de nos avisar assim que pudermos usa-la no VS Express.

[]'s
Rodrigo Strauss | website | em 29/09/2006 | #
É bem simples pra portar, só preciso de alguém pra testar. Alguém se habilita?
AngusYoung | website | em 29/09/2006 | #
Rodrigo, pode contar com a minha ajuda nos testes.
Aldrin Leal | website | em 30/09/2006 | #
Rodrigo,

Você já viu o Ice? http://www.zeroc.com/

Enquanto um "sucessor espiritual" do CORBA, me parece bastante atraente e adequado. Eu entendo sua intenção de criar algo mais vinculado ao COM, mas certamente você poderia se inspirar não apenas no XPCOM, como também no Ice, que também introduz algumas idéias sensacionais, apesar de ter uma licença bastante restritiva (GPL, a "Viral").

Fica como uma sugestão de rumos a seguir (porque não?)

-- Aldrin Leal.
Aldrin Leal | website | e-mail | em 30/09/2006 | #
Com relação ao layer de rede, eu sugiro que você dê uma lida no paper do Matt Welsh sobre o SEDA ( http://www.eecs.harvard.edu/~mdw/proj/seda/) e também neste paper ( http://www.kegel.com/c10k.html).

Vi alguns frameworks que implementam estas idéias do SEDA em ambiente de NonBlocking I/O, como o Mina (diretory.apache.org) e também o Twisted Python, mas nada em C++. Mas não toco em CPP há algum tempinho, apesar de me lembrar de ter feito algo assim em C++/CLI quando testei o Express 2005.

(Óbvio, meu bias é pro lado da performance. Performance, performance, greed for speed, yeah baby!)

-- Aldrin Leal.
Rodrigo Strauss | website | em 30/09/2006 | #
Sim, conheço o Ice, apesar de ele ter crescido bastante desde a última vez que eu vi. E um dos meus problemas com ele é a licença restritiva, eu prefiro software livre que seja livre para tudo, inclusive uso comercial. Ele é como o Qt, um produto comercial que tem uma licença open source para ajudar a divulgar. Nada contra, mas não está dentro do que eu penso.

No começo eu cheguei a pensar em desenvolver um remote XPCOM, mas como ele é meio restrito ao Firefox achei melhor não. Não dá pra comparar o grau de suporte que o COM tem com nada, nem XPCOM, nem CORBA, nem SOAP. Ao invés de reinventar a roda preferi contornar as limitações do COM.

Eu prefiro investir no COM/DCOM porque ele é praticamente o padrão de objetos remotos no Windows, além de ser maduro e universalmente suportado. Existe dezenas de ferramentas, frameworks e linguagens que suportam DCOM. Aí todo mundo usa o que sempre usou (seja ATL, VB6, .NET, tanto faz), só que com uma configuração de rede muito mais flexível. A idéia é que você não tenha que portar nem refazer os componentes, só os plugue numa nova runtime de comunicação.
Wanderley Caloni | website | e-mail | em 01/10/2006 | #
Nesse caso uma outra idéia interessante é disponibilizar um guia de migração para os que já possuem um projeto COM/DCOM. Como a maioria deve seguir o Wizard do VS, que tal desenvolver um Wizard para o Omni? =)
Rodrigo Strauss | website | em 01/10/2006 | #
Na realidade não existe uma migração, você nem precisa dos fontes do componente. É só usar o OmniIdl para gerar os fontes da dll de proxy/stub e compilá-la. A única mudança fica por conta da instanciação, que é esse exemplo de código.

Tem um "How to make your COM object compatible with OmniObjects" na página do projeto que apesar de pequeno me parece suficiente. O que você acha?

A única mudança no componente de exemplo que vai junto no pacote em relação a um projeto ATL é que ele tem um build step para gerar o proxy/stub automaticamente.
Fabio Galuppo | website | em 03/10/2006 | #
Ótima iniciativa Rodrigo!

Numa das diversas "choppadas" vc já havia citado sobre esta infra... Estou quase tentado a usá-la num projeto que tenho q é 99% C++ e 1% .NET (onde uso WSE 3.0 para trafegar SOAP via HTTP ou TCP) ;-)

Curiosidade, não sei de onde vc tirou o nome Omni... Mas, OmniVM foi a VM que inspirou a construção da CLR!
Rodrigo Strauss | website | em 03/10/2006 | #
Omni == oni, prefixo (latim|grego|sei lá) para "tudo", algo objetos "todos os objetos, em todos os lugares". :-)

Não sabia dessa curiosidade histórica.

Eu ficaria muito feliz com um segundo usuário e uma segunda aplicação prática, ainda mais nesse nível. Eu sou o primeiro, claro que vou fazer software em cima dessa plataforma. :-)
Hakuno | em 05/03/2009 | #
Fiquei perdido...
Math | em 23/06/2010 | #
Só passei aqui para dizer "OLA", e para dizer que gostei de varios artigo.
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::