Hace como dos meses, Yannick[0] me contactó para preguntarme si podía implementar para él un plugin de Evolution. Concretamente quería el plugin que se pedía en este bug de eons de antiguedad. Por cierto Beeznest (la empresa de Yannick) tiene un post sobre el tema.
El reto entonces era implementar un plugin de Evolution que permitiese responder a los correos recibidos con respuestas prefabricadas, templates.
El plugin debía permitir reemplazar ciertos "tokens" por información del usuario, por ejemplo reemplazar "%from%" por el nombre del remitente a quien se le estaba respondiendo. Además, debía ser posible tener una carpeta de templates con infinitas subcarpetas.
Lo más simple, y por lo que hay q empezar, es habilitar nuestro plugin en la infraestructura de compilación, osea en los Makefiles. Esto es trivial y solo hay que decirle al configure.in que construya nuestro Makefile:
plugins/templates/MakefileLuego, hay que crear la infra para el plugin mismo:
INCLUDES = \
-I$(top_srcdir) \
$(EVOLUTION_MAIL_CFLAGS)
@EVO_PLUGIN_RULE@
plugin_DATA = org-gnome-templates.eplug org-gnome-templates-ui.xml
plugin_LTLIBRARIES = liborg-gnome-templates.la
liborg_gnome_templates_la_SOURCES = templates.c
liborg_gnome_templates_la_LDFLAGS = -module -avoid-version
EXTRA_DIST = org-gnome-templates.eplug.xml org-gnome-templates-ui.xml
BUILT_SOURCES = org-gnome-templates.eplug
CLEANFILES = $(BUILT_SOURCES)
Este es el Makefile de mi versión original, la incluida en trunk de Evolution es distinta y tiene algunas cosas extra.
Basicamente hay que decirle a autofoo que queremos que nos construya un shared object que se llame liborg-gnome-templates, osea una librería que pueda cargarse en tiempo de ejecución (si mi mumbo jumbo técnico está mal, corríjanme).
Luego toca crear un archivo definiendo el UI de nuestro plugin, esto es parte del framework de evo, pero recuerda a como GTK+ hace las cosas:
<Root>
<commands>
<cmd name="FileSaveAsTemplate" _label="Save As _Template"/>
</commands>
<menu>
<submenu name="File">
<placeholder name="Print">
<menuitem name="FileSaveAsTemplate" verb="" />
</placeholder>
</submenu>
</menu>
</Root>
Luego toca crear un .eplug que defina nuestro plugin, lo importante es saber el nombre de los hooks que hay q usar y asignarles la propiedad factory que es como quién dice el callback, eso y otras cosas están en la muy incompleta y arcana documentación de los eplugins (cookie para quien los encuentre en el svn, no me acuerdo!).
Luego, solamente programas y lo mandas a la lista y algún buen dude como Bharath Acharya lo integra a Evolution trunk.
En cuanto al código, todo es magia negra de Evolution y C, pueden ver el original en launchpad o el parche final con los cambios de Bharath. Se reciben preguntas y pedidos de plugins, cotización previa :P.
Kudos a Yannick que vía Beeznest que financió el trabajo inicial.







