/*
* This file is part of libbluray
* Copyright (C) 2009-2010 Obliter0n
* Copyright (C) 2009-2010 John Stebbins
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* .
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include "dl.h"
#include "file.h"
#include "util/macro.h"
#include "util/logging.h"
#include "util/strutl.h"
#include
#include
#include
static const char *dlerror(char *buf, int buf_size)
{
DWORD error_code = GetLastError();
wchar_t wbuf[256];
if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
wbuf, sizeof(wbuf)/sizeof(wbuf[0]), NULL)) {
WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, buf, buf_size, NULL, NULL);
} else {
#ifdef _MSC_VER
_snprintf(buf, buf_size, "error %d", (int)error_code);
#else
snprintf(buf, buf_size, "error %d", (int)error_code);
#endif
}
return buf;
}
void *dl_dlopen(const char *path, const char *version)
{
(void)version;
wchar_t wname[MAX_PATH];
char *name;
void *result;
name = str_printf("%s.dll", path);
if (!name) {
BD_DEBUG(DBG_FILE | DBG_CRIT, "out of memory\n");
return NULL;
}
MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, MAX_PATH);
X_FREE(name);
result = LoadLibraryW(wname);
if (!result) {
char buf[128];
BD_DEBUG(DBG_FILE, "can't open library '%s': %s\n", path, dlerror(buf, sizeof(buf)));
}
return result;
}
void *dl_dlsym(void *handle, const char *symbol)
{
void *result = (void *)GetProcAddress((HMODULE)handle, symbol);
if (!result) {
char buf[128];
BD_DEBUG(DBG_FILE, "GetProcAddress(%p, '%s') failed: %s\n", handle, symbol, dlerror(buf, sizeof(buf)));
}
return result;
}
int dl_dlclose(void *handle)
{
FreeLibrary((HMODULE)handle);
return 0;
}
// path-separator
#define PATH_SEPARATOR '\\'
const char *dl_get_path(void)
{
static char *lib_path = NULL;
static int initialized = 0;
if (!initialized) {
initialized = 1;
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;
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.dll install path\n");
}
}
return lib_path;
}