libbluray | branch: master | hpi1 <[email protected]> | Sun Feb 3 13:40:44 2013 +0200| [5f0ddf4bf82a0641258c40e9e3164caf876c0c05] | committer: hpi1
Win32: search for libbluray.jar from libbluray installation directory > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=5f0ddf4bf82a0641258c40e9e3164caf876c0c05 --- src/file/dl.h | 9 +++++++++ src/file/dl_posix.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/libbluray/bdj/bdj.c | 13 +++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/file/dl.h b/src/file/dl.h index e379425..0e8ed47 100644 --- a/src/file/dl.h +++ b/src/file/dl.h @@ -33,4 +33,13 @@ BD_PRIVATE void *dl_dlopen ( const char* path, const char *version ); BD_PRIVATE void *dl_dlsym ( void* handle, const char* symbol ); BD_PRIVATE int dl_dlclose ( void* handle ); +/* + * Installation path of currently running libbluray.so + * returns NULL if unknown. + * + * This function is used to help finding libbluray.jar if location + * is not given in LIBBLURAY_CP environment variable. + */ +BD_PRIVATE const char *dl_get_path(void); + #endif /* DL_H_ */ diff --git a/src/file/dl_posix.c b/src/file/dl_posix.c index 63586b7..6b76bf0 100644 --- a/src/file/dl_posix.c +++ b/src/file/dl_posix.c @@ -35,6 +35,8 @@ # include <sys/dl.h> #endif +#include <string.h> + #if defined(_WIN32) static const char *dlerror(char *buf, int buf_size) { @@ -160,3 +162,43 @@ int dl_dlclose ( void* handle ) return dlclose(handle); #endif } + + +#ifdef WIN32 + #define PATH_SEPARATOR '\\' +#else + #define PATH_SEPARATOR '/' +#endif + +const char *dl_get_path(void) +{ + static char *lib_path = NULL; + static int initialized = 0; + + if (!initialized) { + initialized = 1; + +#ifdef WIN32 + static char path[MAX_PATH]; + HMODULE hModule; + wchar_t wpath[MAX_PATH]; + + GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&dl_get_path, &hModule); + GetModuleFileNameW(hModule, wpath, MAX_PATH); + WideCharToMultiByte(CP_UTF8, 0, wpath, -1, path, MAX_PATH, NULL, NULL); + lib_path = path; +#endif + if (lib_path) { + /* cut library name from path */ + char *p = strrchr(lib_path, PATH_SEPARATOR); + if (p) { + *(p+1) = 0; + } + BD_DEBUG(DBG_FILE, "library file is %s\n", lib_path); + } else { + BD_DEBUG(DBG_FILE, "Can't determine libbluray.so install path\n"); + } + } + + return lib_path; +} diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index b142d5e..e7f6944 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -98,6 +98,19 @@ static const char *_find_libbluray_jar(void) BD_DEBUG(DBG_BDJ, "LIBBLURAY_CP not set, searching for "BDJ_JARFILE" ...\n"); + // check directory where libbluray.so was loaded from + const char *lib_path = dl_get_path(); + if (lib_path) { + char *cp = str_printf("%s" BDJ_JARFILE, lib_path); + BD_DEBUG(DBG_BDJ, "Checking %s ...\n", cp); + if (!stat(cp, &sb)) { + classpath = cp; + BD_DEBUG(DBG_BDJ, "using %s\n", cp); + return cp; + } + X_FREE(cp); + } + // check pre-defined directories for (i = 0; i < sizeof(jar_paths) / sizeof(jar_paths[0]); i++) { BD_DEBUG(DBG_BDJ, "Checking %s ...\n", jar_paths[i]); _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
