blob: 95cac159d82279c68aef2f77805f7e09981d3c18 [file] [log] [blame]
[email protected]81e34d82010-08-19 18:36:251// Copyright (c) 2010 The Chromium Authors. All rights reserved.
[email protected]f38e25f2009-04-21 00:56:072// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/native_library.h"
6
[email protected]108c2a12009-06-05 22:18:097#include <dlfcn.h>
[email protected]f38e25f2009-04-21 00:56:078#import <Carbon/Carbon.h>
9
10#include "base/file_path.h"
[email protected]108c2a12009-06-05 22:18:0911#include "base/file_util.h"
[email protected]df0ca6c82010-10-17 04:09:0612#include "base/mac/scoped_cftyperef.h"
[email protected]108c2a12009-06-05 22:18:0913#include "base/string_util.h"
[email protected]81e34d82010-08-19 18:36:2514#include "base/utf_string_conversions.h"
[email protected]f38e25f2009-04-21 00:56:0715
16namespace base {
17
18// static
19NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
[email protected]108c2a12009-06-05 22:18:0920 if (library_path.Extension() == "dylib" ||
21 !file_util::DirectoryExists(library_path)) {
22 void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY);
23 if (!dylib)
24 return NULL;
25 NativeLibrary native_lib = new NativeLibraryStruct();
26 native_lib->type = DYNAMIC_LIB;
27 native_lib->dylib = dylib;
28 return native_lib;
29 }
[email protected]df0ca6c82010-10-17 04:09:0630 base::mac::ScopedCFTypeRef<CFURLRef> url(
31 CFURLCreateFromFileSystemRepresentation(
32 kCFAllocatorDefault,
33 (const UInt8*)library_path.value().c_str(),
34 library_path.value().length(),
35 true));
[email protected]f38e25f2009-04-21 00:56:0736 if (!url)
37 return NULL;
[email protected]108c2a12009-06-05 22:18:0938 CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get());
39 if (!bundle)
40 return NULL;
[email protected]f38e25f2009-04-21 00:56:0741
[email protected]108c2a12009-06-05 22:18:0942 NativeLibrary native_lib = new NativeLibraryStruct();
43 native_lib->type = BUNDLE;
44 native_lib->bundle = bundle;
[email protected]d8921c432010-01-28 16:08:0945 native_lib->bundle_resource_ref = CFBundleOpenBundleResourceMap(bundle);
[email protected]108c2a12009-06-05 22:18:0946 return native_lib;
[email protected]f38e25f2009-04-21 00:56:0747}
48
49// static
50void UnloadNativeLibrary(NativeLibrary library) {
[email protected]d8921c432010-01-28 16:08:0951 if (library->type == BUNDLE) {
52 CFBundleCloseBundleResourceMap(library->bundle,
53 library->bundle_resource_ref);
[email protected]108c2a12009-06-05 22:18:0954 CFRelease(library->bundle);
[email protected]d8921c432010-01-28 16:08:0955 } else {
[email protected]108c2a12009-06-05 22:18:0956 dlclose(library->dylib);
[email protected]d8921c432010-01-28 16:08:0957 }
[email protected]108c2a12009-06-05 22:18:0958 delete library;
[email protected]f38e25f2009-04-21 00:56:0759}
60
61// static
62void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
[email protected]108c2a12009-06-05 22:18:0963 const char* name) {
[email protected]b7efd7692009-12-15 22:34:0964 if (library->type == BUNDLE) {
[email protected]df0ca6c82010-10-17 04:09:0665 base::mac::ScopedCFTypeRef<CFStringRef> symbol_name(
[email protected]108c2a12009-06-05 22:18:0966 CFStringCreateWithCString(kCFAllocatorDefault, name,
67 kCFStringEncodingUTF8));
[email protected]b7efd7692009-12-15 22:34:0968 return CFBundleGetFunctionPointerForName(library->bundle, symbol_name);
69 }
[email protected]108c2a12009-06-05 22:18:0970 return dlsym(library->dylib, name);
71}
72
73// static
74string16 GetNativeLibraryName(const string16& name) {
75 return name + ASCIIToUTF16(".dylib");
[email protected]f38e25f2009-04-21 00:56:0776}
77
78} // namespace base