Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Ver: Modo: Orden:
Pidgin y Google Desktop | 9 comentarios (9 temáticos, editoriales, 0 ocultos)
La versión en C, con su instalador (none / 0) (#1)
por jorginius ("jorginius" en Google Mail) a las Sun Aug 31st, 2008 at 02:31:10 PM CET
(Información Usuario) http://www.rodriguezmoreno.com

Aunque sospecho que no le interesa a nadie, ayer me lié la manta a la cabeza y escribí la versión nativa del plugin. Podéis descargarla (el instalador) aquí: pidgin-googledesktop. Las fuentes en este otro link: pidginds-src.

Algunos apuntes sueltos:

Cadenas de caracteres

Para el que tenga la suerte de no conocer como funcionan las cadenas de caracteres en Windows: hay tres tipos de cadenas de caracteres: las que usan tu código regional, las unicode (UCS-2, wchar_t) y las BSTR que son casi como las últimas pero con un prefijo que indica la longitud (un poco como en Pascal aunque terminan en caracter nulo) y que son con las que trabaja COM. Estas cadenas no se pueden mezclar alegremente.

Para rizar aún más el rizo pidgin no usa internamente nade de eso; Gtk+ o Glib usan en todas las plataformas UTF-8, así que el plugin tiene que convertir cadenas UTF-8 a multibyte Windows para poder trabajar con ellas y luego convertir el resultado a BSTR.

El compilador

Como pidgin (y sus plugins) no compilan con MSVC, está escrito para ser compilado con mingw32. MinGW no tiene un soporte completo de COM y lo que funciona mejor es al API crudo en C: nada de conversiones de cadenas facilonas con ATL ni sintaxis de componentes como objetos. No hay lugar para nenazas en MinGW :-P

Para generar los stubs a partir de los IDL del SDK de Google Desktop hace falta el midl y varias cabeceras que mingw32 no incluye. Todo eso se puede obtener del "Microsoft SDKs Platform" que es una descarga gratuita (en el fichero de fuentes de todas formas, incluyo los stubs generados). Le decimos a midl que use mingw32 de esta manera:

midl.exe /W3 /msc_ver 0 /env win32 /server none
    /client none /cpp_cmd c:\MinGW\bin\gcc
    /cpp_opt "-E -x c -U__stdcall -U_stdcall
    -U__GNUC__ - U__declspec -D__inline__=
    -D_NO_CTYPE_INLINES -DMIDL_PASS
    -DWIN32_LEAN_AND_MEAN 
    -I %RUTA_A_MS_SDK" 
    -I %RUTA_A_MS_SDK /header 
    GoogleDesktopApi.h /tlb GoogleDesktopApi.h
    GoogleDesktopAPI.idl
El engendro

A nivel estructural no hay mucha diferencia entre el plugin python y el plugin C. Lo más notable es que ahora el registro en GoogleDesktop (GDS no acepta eventos si el plugin no se registra primero) no está dentro del plugin de Pidgin sino que hay un pequeño ejecutable aparte que se ocupa de registrarlo y desregistrarlo al instalar o desintalar. Para compilarlo es tan fácil como:

gcc -O2 register.c -lole32 -loleaut32 -o register
Como nota curiosa se puede comparar el proceso de registro en Python:

reg.StartComponentRegistration(_GUID,
["Title", _NAME, 
    "Description", _DESCRIPTION,
    "Icon", _GAIM_PATH + ",0"])
ireg = reg.GetRegistrationInterface("GoogleDesktop.IndexingRegistration")
ireg.RegisterIndexingPlugin(None)
reg.FinishComponentRegistration()
... Con exactamente lo mismo en C. Algo más largo X-D
int
plugin_register(void)
{
	IGoogleDesktopRegistrar *reg;
	IGoogleDesktopRegisterIndexingPlugin *ireg;
	HRESULT hr;

	SAFEARRAYBOUND bound;
	SAFEARRAY *args;
	long index;

	VARIANT vargs;
	VARIANT title,
			description,
			icon;
	VARIANT rtitle,
			rdescription,
			ricon;

	reg = registrar_get();

	bound.lLbound = 0;
	bound.cElements = 6;

	args = SafeArrayCreate(VT_VARIANT, 1, &bound);

	if (!args) return -1;

	V_VT(&title) = V_VT(&rtitle) = VT_BSTR;
	V_BSTR(&title) = SysAllocString(L"Title");
	V_BSTR(&rtitle) = SysAllocString(L"PidginDS");

	index = 0; SafeArrayPutElement(args, &index, &title);
	index = 1; SafeArrayPutElement(args, &index, &rtitle);

	V_VT(&description) = V_VT(&rdescription) = VT_BSTR;
	V_BSTR(&description) = SysAllocString(L"Description");
	V_BSTR(&rdescription) = SysAllocString(L"Indexa conversaciones en GDS");

	index = 2; SafeArrayPutElement(args, &index, &description);
	index = 3; SafeArrayPutElement(args, &index, &rdescription);

	V_VT(&icon) = V_VT(&ricon) = VT_BSTR;
	V_BSTR(&icon) = SysAllocString(L"Icon");
	V_BSTR(&ricon) = SysAllocString(L"C:\\Program Files\\Pidgin\\pidgin.exe,0");

	index = 4; SafeArrayPutElement(args, &index, &icon);
	index = 5; SafeArrayPutElement(args, &index, &ricon);

	V_VT(&vargs) = VT_ARRAY | VT_VARIANT;
	V_ARRAY(&vargs) = args;

	hr = IGoogleDesktopRegistrar_StartComponentRegistration(reg, clsid, vargs);
	hr = IGoogleDesktopRegistrar_GetRegistrationInterface(reg,
		L"GoogleDesktop.IndexingRegistration", (IUnknown **) &ireg);

	hr = IGoogleDesktopRegisterIndexingPlugin_RegisterIndexingPlugin(ireg, NULL);
	hr = IGoogleDesktopRegistrar_FinishComponentRegistration(reg);

	SafeArrayDestroy(args);

	if (FAILED(hr)) return -1;

	IGoogleDesktopRegisterIndexingPlugin_Release(ireg);
	IGoogleDesktopRegistrar_Release(reg);

	return 0;
}




 

Pidgin y Google Desktop | 9 comentarios (9 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:
Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda