Plugin-loader handles .la files
[projects/chimara/chimara.git] / tests / plugin-loader.c
index 767be6cd4ff7fb4d2d44902b3ecc19748b44ee2d..50a54268d4a2b34b2e09c884c64ec2b243e4dd52 100644 (file)
@@ -17,7 +17,7 @@
  *    contributor may be used to endorse or promote products derived
  *    from this software without specific prior written permission.
  * 
- * main.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS
+ * plugin-loader.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS
  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL Philip en Marijn OR ANY OTHER CONTRIBUTORS
@@ -40,6 +40,7 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
+#include <config.h>
 #include <libchimara/chimara-glk.h>
 
 /* Global pointers to widgets */
@@ -60,16 +61,60 @@ create_window(void)
     gtk_widget_set_size_request(window, 400, 400);
     g_signal_connect(window, "delete-event", G_CALLBACK(quit), NULL);
        glk = chimara_glk_new();
-       g_object_set(glk, 
-               "border-width", 6, 
-               "spacing", 6,
-               NULL);
-       g_signal_connect(glk, "stopped", G_CALLBACK(gtk_main_quit), NULL);
-       chimara_glk_set_default_font_string(CHIMARA_GLK(glk), "Serif 12");
-       chimara_glk_set_monospace_font_string(CHIMARA_GLK(glk), "Monospace 12");
+       g_object_ref(glk);
        gtk_container_add(GTK_CONTAINER(window), glk);
 }
 
+static gchar *
+resource_load(ChimaraResourceType usage, guint32 resnum)
+{
+       char *resstr;
+       if(usage == CHIMARA_RESOURCE_IMAGE)
+               resstr = "PIC";
+       else if(usage == CHIMARA_RESOURCE_SOUND)
+               resstr = "SND";
+       else
+               resstr = "FCK";
+       return g_strdup_printf("%s%d", resstr, resnum);
+}
+
+static GFile *
+libname_from_la_file(char *la_filename)
+{
+       GFile *la_file = g_file_new_for_commandline_arg(la_filename);
+       GFile *parentdir = g_file_get_parent(la_file);
+       GFile *objdir = g_file_get_child(parentdir, LT_OBJDIR);
+       g_object_unref(parentdir);
+
+       GFileInputStream *istream = g_file_read(la_file, NULL, NULL);
+       if(istream == NULL)
+               return NULL;
+       GDataInputStream *stream = g_data_input_stream_new( G_INPUT_STREAM(istream) );
+
+       char *line;
+       char *dlname = NULL;
+       while( (line = g_data_input_stream_read_line(stream, NULL, NULL, NULL)) ) {
+               if( g_str_has_prefix(line, "dlname=") ) {
+                       dlname = g_strdup( line + strlen("dlname='") );
+                       *(strrchr(dlname, '\'')) = '\0';
+                       g_free(line);
+                       break;
+               }
+               g_free(line);
+       }
+       if(dlname == NULL)
+               return NULL;
+
+       g_input_stream_close(G_INPUT_STREAM (stream), NULL, NULL);
+
+       GFile *libfile = g_file_get_child(objdir, dlname);
+       g_free(dlname);
+
+       g_object_unref(la_file);
+       g_object_unref(objdir);
+       return libfile;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -81,23 +126,27 @@ main(int argc, char *argv[])
        textdomain(GETTEXT_PACKAGE);
 #endif
 
-       if( !g_thread_supported() )
-               g_thread_init(NULL);
        gdk_threads_init();
        gtk_init(&argc, &argv);
 
        create_window();
        gtk_widget_show_all(window);
 
-       if(argc < 2) {
-               g_printerr("Must provide a plugin\n");
-               return 1;
-       }
-       
-    if( !chimara_glk_run(CHIMARA_GLK(glk), argv[1], argc - 1, argv + 1, &error) ) {
-               g_printerr("Error starting Glk library: %s\n", error->message);
-               return 1;
-       }
+       if(argc < 2)
+               g_error("Must provide a plugin\n");
+
+    GFile *plugin_file;
+    if( g_str_has_suffix(argv[1], ".la") )
+        plugin_file = libname_from_la_file(argv[1]);
+    else
+        plugin_file = g_file_new_for_commandline_arg(argv[1]);
+
+       chimara_glk_set_resource_load_callback(CHIMARA_GLK(glk), (ChimaraResourceLoadFunc)resource_load, NULL, NULL);
+
+    if( !chimara_glk_run_file(CHIMARA_GLK(glk), plugin_file,
+        argc - 1, argv + 1, &error) )
+               g_error("Error starting Glk library: %s\n", error->message);
+    g_object_unref(plugin_file);
 
     gdk_threads_enter();
        gtk_main();
@@ -105,6 +154,7 @@ main(int argc, char *argv[])
 
        chimara_glk_stop(CHIMARA_GLK(glk));
        chimara_glk_wait(CHIMARA_GLK(glk));
+       g_object_unref(glk);
 
        return 0;
 }