06/15/05
This must be the greates Gnome tip I ever read (the dragging part at least). Now finally one doesn't need to crawl through one Save and one Open dialog to send a simple screenshot to some buddy. Thanks Karel!!!
Next to that: this is some of the most insane projects ever. A Unix shell written in JavaScript, that can be run from a browser. Check the "Open Shell" link on top of the page. Pretty nifty, didn't look at the code yet, will do that later.
Started working on the "save and restore enabled plugins" functionality today. I decided to use GMarkup instead of libxml2 so I don't add another dependency (next to glib), and the config strings are so easy formatted GMarkup is more than sufficient to parse them. But it made me discover once more how much I hate dreaded SAX parsing. Someone who enjoys writing SAX based parsers must be on a serious crack overdose :crazy:
06/14/05
In januari namen Cindy De Smet en Erwin van Hunen, bekend van de Podcasting-software Doppler, het initiatief om een Geek Dinner te organiseren in Gent. Toen al gingen er stemmen op om ook eens een Blog Dinner te organiseren, afgestemd op bloggers
Vandaag kreeg ik onderstaand berichtje in mijn mailbox.
Beste Mijnheer Dedecker,
U zal waarschijnlijk intussen al op de hoogte zijn dat ICTO, in overleg met de decanen, DOWA en de Academisch Beheerder, als tijdelijke oplossing en in afwachting van een studentenportaal waarop een door de studentenvertegenwoordigers beheerde infosite thuis hoort, voor de faculteiten PPW, Ingenieurswetenschappen en LW een *"Studentenvertegenwoordiging"* infosite heeft aangemaakt. Om de studenten maximaal te helpen en tijd te besparen hebben wij reeds de studenten per studiejaar in een groep gestoken.
(...)
*Wij zullen indien gewenst ook voor andere faculteiten een "studentenvertegenwoordiging" infosite openen op vraag van de decaan.
We zijn dus goed vertrokken! De infosite staat er al, heb ik gezien, doch voorlopig heeft enkel de Decaan de juiste permissies. We hopen dit op zo kort mogelijke termijn in orde te brengen zodat de FR-stuvers dit gezamenlijk kunnen beheren, meldingen online plaatsen, documenten ter beschikking stellen,... De andere faculteiten zouden normaal snel moeten volgen, alle stuvers in de GSR proberen dit reeds voor hun faculteit in orde te krijgen.
Je ziet ook dat er in die mail sprake is van een "studentenportaal". Uiteraard heb ik nagevraagd wat hiervan de bedoeling is, met volgend antwoord als gevolg:
Beste Peter
Hoever de plannen van de studentenadministratie staan ben ik van plan na te trekken maar de algemene beleidsbeslissing is eind december 2004 genomen ; het is dus zeker de bedoeling dit centraal te implementeren ( niet door ICTO) maar zoals U waarschijnlijk al weet is iedereen zwaar overwerkt en hebben de essenti
I implemented Python plugin loading this afternoon. It's almost finished, only calling functions does not work yet (thats only like 10 lines or so, but my eyes start to hurt). It's using the Python plugin base class I blogged about yesterday.
The code is far from perfect, it might leak like hell etc, but hey, it's working ;-) You can't debug or clean code that is not working at all :-)
Here's the current output of the test loader I wrote:
** (process:19360): DEBUG: Loading all modules in .libs ** (process:19360): DEBUG: Suffix for .libs/libtestplugin1.so is valid, loading module ** (process:19360): DEBUG: [OPluginManagerPlugin] [test-plugin1] Got an init function ** (process:19360): DEBUG: [test-plugin1] Init with data "test-init-data" ** (process:19360): DEBUG: Module .libs/libtestplugin1.so is valid, adding ** (process:19360): DEBUG: Suffix for .libs/libtestplugin2.so is valid, loading module ** (process:19360): DEBUG: Module .libs/libtestplugin2.so is valid, adding ** (process:19360): DEBUG: Loading all modules in . ** (process:19360): DEBUG: Suffix for ./TestPlugin.py is valid, loading module Creating new OPluginManagerPythonPlugin instance: PythonTest ** (process:19360): DEBUG: Module ./TestPlugin.py is valid, adding Found 3 modules ** (process:19360): DEBUG: Dumping module 0: ================================================ Dumping data for: .libs/libtestplugin1.so, type is "native" ================= * Name: test-plugin1 * Summary: A simple test plugin, full-featured * Description: This is a sample test plugin, to test the OPluginManager functionality, giving sample usage of all possibilities * Version: 0.1 * URI: http://www.eikke.com * Authors: ikke ----------- Email: eikke eikke com URI: http://www.eikke.com * Module got an init function * Module got a data free function * Module got a configure function ================================================ ** (process:19360): DEBUG: Dumping module 1: ================================================ Dumping data for: .libs/libtestplugin2.so, type is "native" ================= * Name: test-plugin2 * Summary: A simple, small test plugin * Description: This is a sample test plugin, to test the OPluginManager functionality. It only offers limited functionality * Version: 0.1 * URI: http://www.eikke.com * Authors: ikke ----------- Email: eikke eikke com URI: http://www.eikke.com John Doe ----------- Email: foo@bar.com URI: http://www.foobar.foo * Module got no init function * Module got no data free function * Module got no configure function ================================================ ** (process:19360): DEBUG: Dumping module 2: ================================================ Dumping data for: ./TestPlugin.py, type is "Python" ================= * Name: PythonTest * Summary: A little test plugin * Description: Some longer description of this test plugin * Version: 0.1 * URI: http://www.eikke.com * Authors: Ikke ----------- Email: eikke eikke com URI: http://www.eikke.com * Module got no init function * Module got no data free function * Module got no configure function ================================================ ** (process:19360): DEBUG: Deleting 3 modules ** (process:19360): DEBUG: [OPluginManagerPlugin] Freeing "test-plugin1" data ** (process:19360): DEBUG: [OPluginManagerPlugin] Running free function ** (process:19360): DEBUG: [test-plugin1] Freeing data "Test plugin 1 data" ** (process:19360): DEBUG: [OPluginManagerPlugin] Freeing "test-plugin2" data ** (process:19360): DEBUG: [OPluginManagerPlugin] No free function provided
As you can see, it loads 3 modules: 2 native (C) ones in .libs, one fully fledged, one minimal, and loads one Python plugin.
The Python plugin code is very simple, but can still offer almost the same flexibility as the C interface does:
from OPluginManagerPlugin import OPluginManagerPlugin, OPluginManagerPluginAuthor class TestPlugin(OPluginManagerPlugin): def __init__(self): tmpauthor = OPluginManagerPluginAuthor("Ikke", "eikke eikke com", "http://www.eikke.com") OPluginManagerPlugin.__init__(self, "PythonTest", "A little test plugin", tmpauthor, "Some longer description of this test plugin", "0.1", "http://www.eikke.com", self.Init, self.FreeData, self.Configure) def Configure(self): print "Configuring" def Init(self, init_data): print "Initializing with data \"" + init_data + "\"" return "testplugindata" def FreeData(self, data): print "Freeing \"" + data + "\"" def OPluginManagerPluginInit(): return TestPlugin()
I should learn how to work with Python lists etc to be able to implement multi-author functionality etc though.
I updated CVS heavily, so you can find (and checkout) all current code here. Please play around with it and let me know what you think of it (as a comment here or on the live.gnome wiki page), so I know what I should enhance, add,...
Oh, I got one more terrible exam today (part 2 of the one I got yesterday). Life's great :-p
06/13/05
I tried to stabilize the OPluginManager interface today, after a terrible exam. Look at the OPluginManager page at live.gnome.org to get a view of the current structure.
I updated the test cases I got here locally (one example is the plugin code I got on that wiki page too). The directory-loader is finished too, almost everything is in place now actually, except the UI part and the "only-load-enabled-modules" feature. These things should be fairly trivial (don't we love that word, NVDB?) to implement.
Here's a sample app:
#include <glib.h>
#include "o-plugin-manager.h"
#include "o-plugin-manager-plugin.h"
gint main(guint argc, gchar *argv[]) {
gint cnt = 0;
gchar *dir = NULL, *dir2 = NULL, *modulepath = NULL;
const OPluginManagerPlugin *plugin = NULL;
OPluginManager *manager = NULL;
g_type_init();
manager = O_PLUGIN_MANAGER(o_plugin_manager_new());
o_plugin_manager_load_modules(manager, ".libs", "test-init-data", NULL);
g_print("\n\nFound %d modules\n", o_plugin_manager_get_num_modules(manager));
/* Check whether we got a 0'st module, call its configure function */
if(o_plugin_manager_get_num_modules(manager) > 0) {
plugin = o_plugin_manager_get_module(manager, 0);
g_debug("Dumping module 0:\n");
o_plugin_manager_plugin_dump(plugin);
}
g_object_unref(manager);
return 0;
}
As you can see, this code loads all valid modules in .libs with the string "test-init-data" as init data, then checks whether a 0st plugin is available, and dumps the plugin info.
This is the current output:
** (process:14246): DEBUG: Loading all modules in .libs, suffix is so ** (process:14246): DEBUG: Suffix for .libs/libtestplugin.so is so, loading module ** (process:14246): DEBUG: [OPluginManagerPlugin] [test-plugin] Got an init function ** (process:14246): DEBUG: [test-plugin] Init with data "test-init-data" ** (process:14246): DEBUG: Module .libs/libtestplugin.so is valid, adding Found 1 modules ** (process:14246): DEBUG: Dumping module 0: ================================================ Dumping data for: .libs/libtestplugin.so ================= * Name: test-plugin * Summary: A simple test plugin * Description: This is a sample test plugin, to test the OPluginManager functionality * Version: 0.1 * URI: http://www.eikke.com * Authors: ikke ----------- Email: eikke eikke com URI: http://www.eikke.com John Doe ----------- Email: foo@bar.com URI: http://www.foobar.foo * Module got an init function * Module got a data free function * Module got a configure function ================================================ ** (process:14246): DEBUG: Deleting 1 modules ** (process:14246): DEBUG: [OPluginManagerPlugin] Freeing "test-plugin" data ** (process:14246): DEBUG: [OPluginManagerPlugin] Running free function ** (process:14246): DEBUG: [test-plugin] Freeing data "Test plugin data"
Here libtestplugin.so is the plugin you can see in the live.gnome wiki.
I also tried to implement a plugin structure in Python, although I'm no Python-expert at all. Current code is available here.
To give a little overview: every Python-based plugin should be a class extending from OPluginManagerPlugin, in this sample PluginTest is an implementation. There should be one fixed-name function in the __main__ module that returns an instance of this plugin class. Like this we just have to call that fixed-name function in our C wrapper, get it's return value in a PyObject *, then check whether it's type descends from OPluginManagerPlugin, and if that's the case start using the object as if it's just an OPluginManagerPlugin, we don't have to care about the details.
The code needs lots of enhancements and cleanups. If you could elaborate on this, please contact me. Especially the function-pointer part (passing (int)0 if no function is given) is ugly: I need to be able to check whether the var is a real function pointer before I call it, not only checking whether it's != 0. Next to this, I should figure out how to do proper error handling. Once that's done, I should be able to write a small wrapper plugin in C so I can start using plugins written in Python from within C.