1// Copyright (c) 2011 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#ifndef BASE_NATIVE_LIBRARY_H_
6#define BASE_NATIVE_LIBRARY_H_
7
8// This file defines a cross-platform "NativeLibrary" type which represents
9// a loadable module.
10
11#include <string>
12
13#include "base/base_export.h"
14#include "base/compiler_specific.h"
15#include "base/strings/string16.h"
16#include "build/build_config.h"
17
18#if defined(OS_WIN)
19#include <windows.h>
20#elif defined(OS_MACOSX)
21#import <CoreFoundation/CoreFoundation.h>
22#endif  // OS_*
23
24namespace base {
25
26class FilePath;
27
28#if defined(OS_WIN)
29typedef HMODULE NativeLibrary;
30#elif defined(OS_MACOSX)
31enum NativeLibraryType {
32  BUNDLE,
33  DYNAMIC_LIB
34};
35enum NativeLibraryObjCStatus {
36  OBJC_UNKNOWN,
37  OBJC_PRESENT,
38  OBJC_NOT_PRESENT,
39};
40struct NativeLibraryStruct {
41  NativeLibraryType type;
42  CFBundleRefNum bundle_resource_ref;
43  NativeLibraryObjCStatus objc_status;
44  union {
45    CFBundleRef bundle;
46    void* dylib;
47  };
48};
49typedef NativeLibraryStruct* NativeLibrary;
50#elif defined(OS_POSIX)
51typedef void* NativeLibrary;
52#endif  // OS_*
53
54struct BASE_EXPORT NativeLibraryLoadError {
55#if defined(OS_WIN)
56  NativeLibraryLoadError() : code(0) {}
57#endif  // OS_WIN
58
59  // Returns a string representation of the load error.
60  std::string ToString() const;
61
62#if defined(OS_WIN)
63  DWORD code;
64#else
65  std::string message;
66#endif  // OS_WIN
67};
68
69// Loads a native library from disk.  Release it with UnloadNativeLibrary when
70// you're done.  Returns NULL on failure.
71// If |error| is not NULL, it may be filled in on load error.
72BASE_EXPORT NativeLibrary LoadNativeLibrary(const FilePath& library_path,
73                                            NativeLibraryLoadError* error);
74
75#if defined(OS_WIN)
76// Loads a native library from disk.  Release it with UnloadNativeLibrary when
77// you're done.
78// This function retrieves the LoadLibrary function exported from kernel32.dll
79// and calls it instead of directly calling the LoadLibrary function via the
80// import table.
81BASE_EXPORT NativeLibrary LoadNativeLibraryDynamically(
82    const FilePath& library_path);
83#endif  // OS_WIN
84
85// Unloads a native library.
86BASE_EXPORT void UnloadNativeLibrary(NativeLibrary library);
87
88// Gets a function pointer from a native library.
89BASE_EXPORT void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
90                                                      const char* name);
91
92// Returns the full platform specific name for a native library.
93// For example:
94// "mylib" returns "mylib.dll" on Windows, "libmylib.so" on Linux,
95// "mylib.dylib" on Mac.
96BASE_EXPORT string16 GetNativeLibraryName(const string16& name);
97
98}  // namespace base
99
100#endif  // BASE_NATIVE_LIBRARY_H_
101