Author: IOhannes m zmölnig
Description: simple dylib loading by using ctypes functionality
 simplified original (complicated and somewhat broken) dylib loading
 functionality with code suggested by Jakub Wilk.
 This has not been forwarded (yet) to upstream, as the fix will not
 work on platforms such as w32
Forwarded: no
Last-Updated: 2015-08-10
--- assimp.orig/port/PyAssimp/pyassimp/helper.py
+++ assimp/port/PyAssimp/pyassimp/helper.py
@@ -7,7 +7,7 @@
 import os
 import ctypes
 from ctypes import POINTER
-import operator
+import sys
 
 try: import numpy
 except: numpy = None
@@ -16,30 +16,6 @@
 
 from .errors import AssimpError
 
-additional_dirs, ext_whitelist = [],[]
-
-# populate search directories and lists of allowed file extensions
-# depending on the platform we're running on.
-if os.name=='posix':
-    additional_dirs.append('./')
-    additional_dirs.append('/usr/lib/')
-    additional_dirs.append('/usr/local/lib/')
-
-    # note - this won't catch libassimp.so.N.n, but 
-    # currently there's always a symlink called
-    # libassimp.so in /usr/local/lib.
-    ext_whitelist.append('.so')
-    # libassimp.dylib in /usr/local/lib
-    ext_whitelist.append('.dylib')
-
-elif os.name=='nt':
-    ext_whitelist.append('.dll')
-    path_dirs = os.environ['PATH'].split(';')
-    for dir_candidate in path_dirs:
-        if 'assimp' in dir_candidate.lower():
-            additional_dirs.append(dir_candidate)
-            
-#print(additional_dirs)
 def vec2tuple(x):
     """ Converts a VECTOR3D to a Tuple """
     return (x.x, x.y, x.z)
@@ -145,43 +121,6 @@
 
     return bb_min, bb_max
 
-def try_load_functions(library_path, dll):
-    '''
-    Try to bind to aiImportFile and aiReleaseImport
-    
-    Arguments
-    ---------
-    library_path: path to current lib
-    dll:          ctypes handle to library
-    
-    Returns
-    ---------
-    If unsuccessful:
-        None
-    If successful:
-        Tuple containing (library_path, 
-                          load from filename function,
-                          load from memory function,
-                          export to filename function,
-                          release function, 
-                          ctypes handle to assimp library)
-    '''
-    
-    try:
-        load     = dll.aiImportFile
-        release  = dll.aiReleaseImport
-        load_mem = dll.aiImportFileFromMemory
-        export   = dll.aiExportScene
-    except AttributeError:
-        #OK, this is a library, but it doesn't have the functions we need
-        return None
-    
-    # library found!
-    from .structs import Scene
-    load.restype = POINTER(Scene)
-    load_mem.restype = POINTER(Scene)
-    return (library_path, load, load_mem, export, release, dll)
-
 def search_library():
     '''
     Loads the assimp library. 
@@ -193,8 +132,6 @@
                      release function, 
                      dll)
     '''
-    #this path
-    folder = os.path.dirname(__file__)
 
     # silence 'DLL not found' message boxes on win
     try:
@@ -202,46 +139,23 @@
     except AttributeError:
         pass    
 
-    candidates = []
-    # test every file
-    for curfolder in [folder]+additional_dirs:
-        if os.path.isdir(curfolder):
-            for filename in os.listdir(curfolder):
-                # our minimum requirement for candidates is that
-                # they should contain 'assimp' somewhere in 
-                # their name
-                if filename.lower().find('assimp')==-1 or\
-                    os.path.splitext(filename)[-1].lower() not in ext_whitelist:
-                    continue
-
-                library_path = os.path.join(curfolder, filename)
-                logger.debug('Try ' + library_path)
-                try:
-                    dll = ctypes.cdll.LoadLibrary(library_path)
-                except Exception as e:
-                    logger.warning(str(e))
-                    # OK, this except is evil. But different OSs will throw different
-                    # errors. So just ignore any errors.
-                    continue
-                # see if the functions we need are in the dll
-                loaded = try_load_functions(library_path, dll)
-                if loaded: candidates.append(loaded)
-
-    if not candidates:
-        # no library found
-        raise AssimpError("assimp library not found")
+    libassimp = 'libassimp.so.3'
+    LIBASSIMP = ctypes.CDLL(libassimp)
+    try:
+        load = LIBASSIMP.aiImportFile
+        load_mem = LIBASSIMP.aiImportFileFromMemory
+        export = LIBASSIMP.aiExportScene
+        release = LIBASSIMP.aiReleaseImport
+    except AttributeError:
+        #OK, this is a library, but it has not the functions we need
+        raise AssimpError, "assimp library not found"
     else:
-        # get the newest library_path
-        candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
-        res = max(candidates, key=operator.itemgetter(0))[1]
-        logger.debug('Using assimp library located at ' + res[0])
-
-        # XXX: if there are 1000 dll/so files containing 'assimp'
-        # in their name, do we have all of them in our address
-        # space now until gc kicks in?
+        #Library found!
+        from . import structs
+        load.restype = POINTER(structs.Scene)
+ 
+    return(load, load_mem, export, release, LIBASSIMP)
 
-        # XXX: take version postfix of the .so on linux?
-        return res[1:]
 
 def hasattr_silent(object, name):
     """
