[gnome-scan] Avoid loading twice a library (one .la then one .so)



commit a90c6bc2c74439e379aca3f235c82fbd2bb01965
Author: Ã?tienne Bersac <bersace gnome org>
Date:   Sat Feb 20 14:52:47 2010 +0100

    Avoid loading twice a library (one .la then one .so)

 lib/gnome-scan-module-manager.vala |   48 ++++++++++++++++++++++++++++++++---
 lib/gnome-scan-module.vala         |    7 +---
 2 files changed, 45 insertions(+), 10 deletions(-)
---
diff --git a/lib/gnome-scan-module-manager.vala b/lib/gnome-scan-module-manager.vala
index 5c26c11..6b69c0c 100644
--- a/lib/gnome-scan-module-manager.vala
+++ b/lib/gnome-scan-module-manager.vala
@@ -21,6 +21,13 @@
  
 using GLib;
 
+errordomain ModuleError {
+	NONAME,
+	INVALID,
+	LOADED,
+	FAIL
+}
+
 namespace Gnome.Scan {
 	/**
 	 * SECTION: gnome-scan-module-manager
@@ -57,6 +64,23 @@ namespace Gnome.Scan {
 			this.path = path;
 		}
 
+		string module_name_from_filename(string filename) throws ModuleError {
+			try {
+				string name;
+				var regex = new Regex ("lib(.*)\\..*$");
+				MatchInfo match;
+				if (! regex.match(filename, 0, out match))
+					throw new ModuleError.NONAME("No name matched");
+				name = match.fetch(1);
+				if (name == null)
+					throw new ModuleError.NONAME("No name fetched");
+				return name;
+			} catch (Error e) {
+				var message = "Unable to determine %s module name: %s".printf(filename, e.message);
+				throw new ModuleError.NONAME(message);
+			}
+		}
+
 		/**
 		 * gnome_scan_module_manager_query_modules:
 		 * @self: a #GnomeScanModuleManager
@@ -69,7 +93,9 @@ namespace Gnome.Scan {
 			Module module;
 			Dir dir = null;
 			string[] paths = path.split (GLib.Path.SEARCHPATH_SEPARATOR_S);
+			var loaded = new SList<string>();
 			string name;
+			string module_name;
 			string filename;
 	
 			foreach (string path in paths) {
@@ -87,15 +113,27 @@ namespace Gnome.Scan {
 				  
 				/* Scan for lib*.{so,la} */
 				while ((name = dir.read_name ()) != null) {
-					if (is_valid_module_name (name)) {
+					try {
+						if (!is_valid_module_name (name))
+							throw new ModuleError.INVALID("%s: File not a module".printf(name));
+						module_name = module_name_from_filename(name);
+
+						foreach(string lname in loaded)
+							if (module_name == lname)
+								throw new ModuleError.LOADED("%s: Module already loaded".printf(name));
+
 						filename = Path.build_filename (path, name);
 						module = new Module (filename);
 							
-						if (!module.use ()) {
-							warning ("%s", GLib.Module.error());
-							// throw exception ?
-						}
+						if (!module.use ())
+							throw new ModuleError.FAIL(GLib.Module.error());
+
 						modules.append (module);
+						loaded.append (module_name);
+					}
+					catch (ModuleError e) {
+						if (e is ModuleError.FAIL)
+							warning (e.message);
 					}
 				}
 			}
diff --git a/lib/gnome-scan-module.vala b/lib/gnome-scan-module.vala
index 587bb1a..bbde277 100644
--- a/lib/gnome-scan-module.vala
+++ b/lib/gnome-scan-module.vala
@@ -44,10 +44,8 @@ namespace Gnome.Scan {
 
 		public override bool load () {
 			library = GLib.Module.open (filename, ModuleFlags.BIND_MASK);
-			if (library == null) {
-				warning("%s",GLib.Module.error());
+			if (library == null)
 				return false;
-			}
 				
 			void * init_function = null;
 			void * finalize_function = null;
@@ -83,7 +81,6 @@ namespace Gnome.Scan {
 		 **/
 		public Module (string filename) {
 			this.filename = filename;
-		}
-			
+		}			
 	}
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]