native_library_mac.mm revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// 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
7#include <dlfcn.h>
8#import <Carbon/Carbon.h>
9
10#include "base/file_path.h"
11#include "base/file_util.h"
12#include "base/mac/scoped_cftyperef.h"
13#include "base/string_util.h"
14#include "base/utf_string_conversions.h"
15
16namespace base {
17
18// static
19NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
20  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  }
30  base::mac::ScopedCFTypeRef<CFURLRef> url(
31      CFURLCreateFromFileSystemRepresentation(
32          kCFAllocatorDefault,
33          (const UInt8*)library_path.value().c_str(),
34          library_path.value().length(),
35          true));
36  if (!url)
37    return NULL;
38  CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get());
39  if (!bundle)
40    return NULL;
41
42  NativeLibrary native_lib = new NativeLibraryStruct();
43  native_lib->type = BUNDLE;
44  native_lib->bundle = bundle;
45  native_lib->bundle_resource_ref = CFBundleOpenBundleResourceMap(bundle);
46  return native_lib;
47}
48
49// static
50void UnloadNativeLibrary(NativeLibrary library) {
51  if (library->type == BUNDLE) {
52    CFBundleCloseBundleResourceMap(library->bundle,
53                                   library->bundle_resource_ref);
54    CFRelease(library->bundle);
55  } else {
56    dlclose(library->dylib);
57  }
58  delete library;
59}
60
61// static
62void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
63                                          const char* name) {
64  if (library->type == BUNDLE) {
65    base::mac::ScopedCFTypeRef<CFStringRef> symbol_name(
66        CFStringCreateWithCString(kCFAllocatorDefault, name,
67                                  kCFStringEncodingUTF8));
68    return CFBundleGetFunctionPointerForName(library->bundle, symbol_name);
69  }
70  return dlsym(library->dylib, name);
71}
72
73// static
74string16 GetNativeLibraryName(const string16& name) {
75  return name + ASCIIToUTF16(".dylib");
76}
77
78}  // namespace base
79