| Index: base/native_library_mac.mm
|
| ===================================================================
|
| --- base/native_library_mac.mm (revision 17736)
|
| +++ base/native_library_mac.mm (working copy)
|
| @@ -4,15 +4,28 @@
|
|
|
| #include "base/native_library.h"
|
|
|
| +#include <dlfcn.h>
|
| #import <Carbon/Carbon.h>
|
|
|
| #include "base/file_path.h"
|
| +#include "base/file_util.h"
|
| #include "base/scoped_cftyperef.h"
|
| +#include "base/string_util.h"
|
|
|
| namespace base {
|
|
|
| // static
|
| NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
|
| + if (library_path.Extension() == "dylib" ||
|
| + !file_util::DirectoryExists(library_path)) {
|
| + void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY);
|
| + if (!dylib)
|
| + return NULL;
|
| + NativeLibrary native_lib = new NativeLibraryStruct();
|
| + native_lib->type = DYNAMIC_LIB;
|
| + native_lib->dylib = dylib;
|
| + return native_lib;
|
| + }
|
| scoped_cftyperef<CFURLRef> url(CFURLCreateFromFileSystemRepresentation(
|
| kCFAllocatorDefault,
|
| (const UInt8*)library_path.value().c_str(),
|
| @@ -20,19 +33,39 @@
|
| true));
|
| if (!url)
|
| return NULL;
|
| + CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get());
|
| + if (!bundle)
|
| + return NULL;
|
|
|
| - return CFBundleCreate(kCFAllocatorDefault, url.get());
|
| + NativeLibrary native_lib = new NativeLibraryStruct();
|
| + native_lib->type = BUNDLE;
|
| + native_lib->bundle = bundle;
|
| + return native_lib;
|
| }
|
|
|
| // static
|
| void UnloadNativeLibrary(NativeLibrary library) {
|
| - CFRelease(library);
|
| + if (library->type == BUNDLE)
|
| + CFRelease(library->bundle);
|
| + else
|
| + dlclose(library->dylib);
|
| + delete library;
|
| }
|
|
|
| // static
|
| void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
|
| - NativeLibraryFunctionNameType name) {
|
| - return CFBundleGetFunctionPointerForName(library, name);
|
| + const char* name) {
|
| + if (library->type == BUNDLE)
|
| + return CFBundleGetFunctionPointerForName(library->bundle,
|
| + CFStringCreateWithCString(kCFAllocatorDefault, name,
|
| + kCFStringEncodingUTF8));
|
| +
|
| + return dlsym(library->dylib, name);
|
| }
|
|
|
| +// static
|
| +string16 GetNativeLibraryName(const string16& name) {
|
| + return name + ASCIIToUTF16(".dylib");
|
| +}
|
| +
|
| } // namespace base
|
|
|