The following commit has been merged in the master branch:
commit 956fe808eafc1679f84d4c9d1f12db7423941798
Author: Miriam Ruiz <[EMAIL PROTECTED]>
Date:   Sun Nov 23 23:26:19 2008 +0100

    Make a proper API/ABI for calling the plugins

diff --git a/dll.cpp b/dll.cpp
index 07ca683..4a8c134 100644
--- a/dll.cpp
+++ b/dll.cpp
@@ -50,6 +50,8 @@ bool DLLManager::GetSymbol(
        // try extract a symbol from the library
        // get any error message is there is any
 
+       dlerror(); // Clear previous error, just in case
+
        if( h!=0 )
        {
                *v = dlsym( h, sym_name );
@@ -73,7 +75,7 @@ DLLFactoryBase::DLLFactoryBase(
        // try get the factory function if there is no error yet
 
        factory_func=0;
-       
+
        if( LastError()==0 )
        {
                GetSymbol( (void **)&factory_func, factory ? factory : 
"factory0" );
diff --git a/gofind.cpp b/gofind.cpp
index ecad3a1..4a1731f 100644
--- a/gofind.cpp
+++ b/gofind.cpp
@@ -90,18 +90,16 @@ int main(int argc, const char* argv[])
        bindtextdomain ("gofind", NULL);
 #endif
 
-       DLLFactory<GUIPlugInFactory> gui_factory( "./gui_cli.so" );
-//     DLLFactory<GUIPlugInFactory> gui_factory( "./gui_fltk.so" );
+       GUIPlugIn gui_plugin( "./gui_fltk.so" );
 
-       if( ! gui_factory.factory )
+       if( gui_plugin.LastError())
        {
-               std::cout << _("Could not load GUI plugin") << std::endl;
+               std::cout << _("Could not load GUI plugin.") << std::endl;
                return -1;
        }
 
-       GUIPlugIn *gui=gui_factory.factory->CreatePlugIn();
-
-       gui->Comment(_("Starting system"));
+       gui_plugin.Init(argc, argv);
+       gui_plugin.Comment(_("Starting system"));
 
        wibble::commandline::GamesOptions opts;
 
@@ -207,9 +205,8 @@ int main(int argc, const char* argv[])
                printResults(pkgdata);
                */
 
-               gui->Go(pkgdata);
+               gui_plugin.Go(pkgdata);
 
-               delete gui;
                return 0;
        } catch (wibble::exception::BadOption& e) {
                cerr << e.desc() << endl;
diff --git a/gui_cli.cpp b/gui_cli.cpp
index 5615eb5..ef2116e 100644
--- a/gui_cli.cpp
+++ b/gui_cli.cpp
@@ -1,9 +1,6 @@
 /*
- * Copyright (C) 1995  Jeff Koftinoff <[EMAIL PROTECTED]>
  * Copyright (C) 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
- * http://www.jdkoftinoff.com/main/Articles/Linux_Articles/ELF_Plugins/ 
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -20,16 +17,17 @@
  */
 
 #include "common.h"
-#include "guiplugin.h"
 
 #include "filter.h"
 #include "slre.h"
+#include "pkgdata.h"
 
 #include <typeinfo>
 #include <iostream>
 #include <string>
 
 #include <ept/apt/packagerecord.h>
+#include <ept/textsearch/textsearch.h>
 #include <wibble/regexp.h>
 #include <wibble/string.h>
 #include <xapian.h>
@@ -45,46 +43,12 @@
 #define gettext(a) (a)
 #endif
 
-#include <string.h>
-#include <stdarg.h>
-
 using namespace std;
 using namespace ept;
 using namespace ept::debtags;
 using namespace ept::apt;
 using namespace ept::textsearch;
 
-class GUIPlugInCLI : public GUIPlugIn
-{
- public:
-       GUIPlugInCLI(GUIPlugInFactory *f) : GUIPlugIn(f)
-       {
-               std::cout << "GUIPlugInCLI() Created" << std::endl;
-       }
-
-       virtual ~GUIPlugInCLI()
-       {
-               std::cout << "GUIPlugInCLI() destroyed" << std::endl;
-       }
-
-       virtual void Comment(const char *szFormat, ...);
-       virtual bool Go(PackageData &pkgdata);
-};
-
-void GUIPlugInCLI::Comment(const char *szFormat, ...)
-{
-       char str[4096];
-       va_list arglist;
-
-       *str = '\0';
-
-       va_start(arglist, szFormat);
-       vsprintf(str + strlen(str), szFormat, arglist);
-       va_end(arglist);
-
-       std::cout << "# " << str << std::endl;
-}
-
 /*
 static bool slre_test_capture(const struct slre_capture &c, const char *txt)
 {
@@ -112,7 +76,7 @@ static bool slre_test_capture(const struct slre_capture &c, 
int num, ... )
        return false;
 }
 
-bool GUIPlugInCLI::Go(PackageData &pkgdata)
+static bool Go(PackageData &pkgdata)
 {
        std::ostream &out = std::cout;
 
@@ -350,46 +314,21 @@ bool GUIPlugInCLI::Go(PackageData &pkgdata)
        return true;
 }
 
-class GUIPlugInCLIFactory : public GUIPlugInFactory
-{
- public:
-       GUIPlugInCLIFactory()
-       {
-#ifdef GUIPLUGIN_VERSION
-               if (version != GUIPlugInFactory::version)
-                       fprintf(stderr, "Wrong GUI Plugin Version: Program = 
0x%04X, Plugin = 0x%04X\n", GUIPlugInFactory::version, version );
-#endif
-       }
-
-       ~GUIPlugInCLIFactory()
-       {
-       }
-
-       virtual GUIPlugIn * CreatePlugIn()
-       {
-#ifdef GUIPLUGIN_VERSION
-               if (version != GUIPlugInFactory::version)
-                       return NULL;
-#endif
-               return new GUIPlugInCLI(this);
-       }
 
- protected:
-#ifdef GUIPLUGIN_VERSION
-       const static unsigned int version;
-#endif
-};
+// Exported Stuff
 
-#ifdef GUIPLUGIN_VERSION
-       const unsigned int GUIPlugInCLIFactory::version = GUIPLUGIN_VERSION;
-#endif
+extern "C" int init(int argc, const char *argv[])
+{
+       std::cout << _("CLI Plugin successfully loaded") << std::endl;
+       return 1; // true
+}
 
-//
-// The "C" linkage factory0() function creates the PlugIn Factory
-// class for this library
-//
+extern "C" void comment(const char *text)
+{
+       std::cout << "# " << text << std::endl;
+}
 
-extern "C" void * factory0( void )
+extern "C" int go(PackageData &pkgdata)
 {
-       return new GUIPlugInCLIFactory;
+       return Go(pkgdata);
 }
diff --git a/gui_fltk.cpp b/gui_fltk.cpp
index fa57b56..19fd78b 100644
--- a/gui_fltk.cpp
+++ b/gui_fltk.cpp
@@ -20,7 +20,7 @@
  */
 
 #include "common.h"
-#include "guiplugin.h"
+#include "pkgdata.h"
 #include "fltk/ui.h"
 
 #include <FL/Fl.H>
@@ -35,43 +35,10 @@
 #define gettext(a) (a)
 #endif
 
-#include <stdarg.h>
-#include <string.h>
 #include <math.h>
 
 #include <ept/apt/packagerecord.h>
-
-class GUIPlugInFLTK : public GUIPlugIn
-{
- public:
-       GUIPlugInFLTK(GUIPlugInFactory *f) : GUIPlugIn(f)
-       {
-               std::cout << "GUIPlugInFLTK() Created" << std::endl;
-       }
-
-       virtual ~GUIPlugInFLTK()
-       {
-               std::cout << "GUIPlugInFLTK() destroyed" << std::endl;
-       }
-
-       virtual void Comment(const char *szFormat, ...);
-       virtual bool Go(PackageData &pkgdata);
-};
-
-void GUIPlugInFLTK::Comment(const char *szFormat, ...)
-{
-       char str[4096];
-       va_list arglist;
-
-       *str = '\0';
-
-       va_start(arglist, szFormat);
-       vsprintf(str + strlen(str), szFormat, arglist);
-       va_end(arglist);
-
-       std::cout << "# " << str << std::endl;
-}
-
+#include <ept/textsearch/textsearch.h>
 
 static const char* ReadFlChoice(Fl_Choice& c)
 {
@@ -258,7 +225,7 @@ static void CallBackInstalledOrNot(Fl_Round_Button*, void 
*data)
        UpdateUILists(ui);
 }
 
-bool GUIPlugInFLTK::Go(PackageData &pkgdata)
+static bool Go(PackageData &pkgdata)
 {
 #ifdef USE_GETTEXT
        setlocale (LC_MESSAGES, "");
@@ -302,46 +269,21 @@ bool GUIPlugInFLTK::Go(PackageData &pkgdata)
        return 0;
 }
 
-class GUIPlugInFLTKFactory : public GUIPlugInFactory
-{
- public:
-       GUIPlugInFLTKFactory()
-       {
-#ifdef GUIPLUGIN_VERSION
-               if (version != GUIPlugInFactory::version)
-                       fprintf(stderr, "Wrong GUI Plugin Version: Program = 
0x%04X, Plugin = 0x%04X\n", GUIPlugInFactory::version, version );
-#endif
-       }
-
-       ~GUIPlugInFLTKFactory()
-       {
-       }
-
-       virtual GUIPlugIn * CreatePlugIn()
-       {
-#ifdef GUIPLUGIN_VERSION
-               if (version != GUIPlugInFactory::version)
-                       return NULL;
-#endif
-               return new GUIPlugInFLTK(this);
-       }
 
- protected:
-#ifdef GUIPLUGIN_VERSION
-       const static unsigned int version;
-#endif
-};
+// Exported Stuff
 
-#ifdef GUIPLUGIN_VERSION
-       const unsigned int GUIPlugInFLTKFactory::version = GUIPLUGIN_VERSION;
-#endif
+extern "C" int init(int argc, const char *argv[])
+{
+       std::cout << _("FLTK Plugin successfully loaded") << std::endl;
+       return 1; // true
+}
 
-//
-// The "C" linkage factory0() function creates the PlugIn Factory
-// class for this library
-//
+extern "C" void comment(const char *text)
+{
+       std::cout << text << std::endl;
+}
 
-extern "C" void * factory0( void )
+extern "C" int go(PackageData &pkgdata)
 {
-       return new GUIPlugInFLTKFactory;
+       return Go(pkgdata);
 }
diff --git a/guiplugin.cpp b/guiplugin.cpp
index 1786050..f9424f8 100644
--- a/guiplugin.cpp
+++ b/guiplugin.cpp
@@ -25,22 +25,49 @@
 #include <typeinfo>
 #include <iostream>
 
-#ifdef GUIPLUGIN_VERSION
-       const unsigned int GUIPlugInFactory::version = GUIPLUGIN_VERSION;
-#endif
+#include <stdarg.h>
+#include <string.h>
 
-//
-// Announce to the world that the PlugIn base
-// class has been created or destroyed
-//
-
-GUIPlugIn::GUIPlugIn(GUIPlugInFactory *f) : factory(f)
+GUIPlugIn::GUIPlugIn(const char *filename) :
+       DLLManager(filename),
+       init(NULL),
+       comment(NULL),
+       go(NULL)
 {
-       std::cout << "GUIPlugIn Created" << std::endl;
+       if( LastError() )
+               std::cout << _("Error loading GUI plugin: ") << LastError() << 
std::endl;
+
+       GetSymbol((void **)&init, "init" );
+       if( LastError() )
+               std::cout << _("Error loading GUI plugin: ") << LastError() << 
std::endl;
+
+       GetSymbol((void **)&comment, "comment" );
+       if( LastError() )
+               std::cout << _("Error loading GUI plugin: ") << LastError() << 
std::endl;
+
+       GetSymbol((void **)&go, "go" );
+       if( LastError() )
+               std::cout << _("Error loading GUI plugin: ") << LastError() << 
std::endl;
 }
 
 GUIPlugIn::~GUIPlugIn()
 {
-       std::cout << "GUIPlugIn Destroyed" << std::endl;
 }
 
+void GUIPlugIn::Comment(const char *szFormat, ...)
+{
+       if (comment)
+       {
+               char str[4096];
+               va_list arglist;
+
+               *str = '\0';
+
+               va_start(arglist, szFormat);
+               vsprintf(str + strlen(str), szFormat, arglist);
+               va_end(arglist);
+
+               comment(str);
+       }
+       else std::cout << _("No comment function found in plugin.") << 
std::endl;
+}
diff --git a/guiplugin.h b/guiplugin.h
index 1052350..93d8c47 100644
--- a/guiplugin.h
+++ b/guiplugin.h
@@ -27,45 +27,34 @@
 
 #include <iostream>
 
-#define GUIPLUGIN_VERSION 0x0001
-
 using namespace ept;
 
-class GUIPlugInFactory;
-
-class GUIPlugIn
+class GUIPlugIn : public DLLManager
 {
  public:
-       GUIPlugIn(GUIPlugInFactory *f);
-
+       GUIPlugIn(const char *filename);
        virtual ~GUIPlugIn();
 
-       virtual void Comment(const char *szFormat, ...) = 0;
-       virtual bool Go(PackageData &data) = 0;
- 
- protected:
-       GUIPlugInFactory *factory;
-};
+       void Comment(const char *szFormat, ...);
 
-class GUIPlugInFactory
-{
- public:
-       GUIPlugInFactory() 
+       inline int Init(int argc, const char *argv[])
        {
-               std::cout << "GUIPlugInFactory Created" << std::endl;
+               if (init) return init(argc, argv);
+               std::cout << _("No init function found in plugin.") << 
std::endl;
+               return -1; // error
        }
-       
-       virtual ~GUIPlugInFactory()
+
+       inline int Go(PackageData &pkgdata)
        {
-               std::cout << "GUIPlugInFactory Destroy" << std::endl;
+               if (go) go(pkgdata);
+               std::cout << _("No go function found in plugin.") << std::endl;
+               return -1; // error
        }
-       
-       virtual GUIPlugIn * CreatePlugIn() = 0;
 
  protected:
-#ifdef GUIPLUGIN_VERSION
-       const static unsigned int version;
-#endif
+       int (*init) (int argc, const char *argv[]);
+       void (*comment) (const char *text);
+       int (*go) (PackageData &pkgdata);
 };
 
 #endif // _GOFIND_GUIPLUGIN_H

-- 
Development fot GoFind!

_______________________________________________
Pkg-games-commits mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/pkg-games-commits

Reply via email to