1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef BASE_NATIVE_LIBRARY_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define BASE_NATIVE_LIBRARY_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This file defines a cross-platform "NativeLibrary" type which represents
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a loadable module.
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_MACOSX)
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#import <CoreFoundation/CoreFoundation.h>
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // OS_*
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string16.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Macro useful for writing cross-platform function pointers.
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN) && !defined(CDECL)
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CDECL __cdecl
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CDECL
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FilePath;
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef HMODULE NativeLibrary;
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_MACOSX)
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum NativeLibraryType {
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  BUNDLE,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DYNAMIC_LIB
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct NativeLibraryStruct {
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  NativeLibraryType type;
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CFBundleRefNum bundle_resource_ref;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  union {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    CFBundleRef bundle;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void* dylib;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef NativeLibraryStruct* NativeLibrary;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void* NativeLibrary;
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // OS_*
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Loads a native library from disk.  Release it with UnloadNativeLibrary when
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// you're done.  Returns NULL on failure.
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// If |err| is not NULL, it may be filled in with an error message on
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// error.
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API NativeLibrary LoadNativeLibrary(const FilePath& library_path,
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         std::string* error);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_WIN)
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Loads a native library from disk.  Release it with UnloadNativeLibrary when
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// you're done.
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// This function retrieves the LoadLibrary function exported from kernel32.dll
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// and calls it instead of directly calling the LoadLibrary function via the
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// import table.
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API NativeLibrary LoadNativeLibraryDynamically(
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const FilePath& library_path);
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif  // OS_WIN
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unloads a native library.
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API void UnloadNativeLibrary(NativeLibrary library);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Gets a function pointer from a native library.
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                   const char* name);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Returns the full platform specific name for a native library.
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For example:
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "mylib" returns "mylib.dll" on Windows, "libmylib.so" on Linux,
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "mylib.dylib" on Mac.
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API string16 GetNativeLibraryName(const string16& name);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // BASE_NATIVE_LIBRARY_H_
87