1/*-------------------------------------------------------------------------
2 * drawElements Utility Library
3 * ----------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Dynamic link library abstraction.
22 *//*--------------------------------------------------------------------*/
23
24#include "deDynamicLibrary.h"
25#include "deMemory.h"
26
27#if (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_SYMBIAN) || (DE_OS == DE_OS_IOS)
28/* Posix implementation. */
29
30#include <dlfcn.h>
31
32struct deDynamicLibrary_s
33{
34	void*	libHandle;
35};
36
37deDynamicLibrary* deDynamicLibrary_open (const char* fileName)
38{
39	deDynamicLibrary* library = (deDynamicLibrary*)deCalloc(sizeof(deDynamicLibrary));
40	if (!library)
41		return DE_NULL;
42
43	library->libHandle = dlopen(fileName, RTLD_LAZY);
44	if (!library->libHandle)
45	{
46		deFree(library);
47		return DE_NULL;
48	}
49
50	return library;
51}
52
53void deDynamicLibrary_close (deDynamicLibrary* library)
54{
55	if (library && library->libHandle)
56		dlclose(library->libHandle);
57	deFree(library);
58}
59
60deFunctionPtr deDynamicLibrary_getFunction (const deDynamicLibrary* library, const char* symbolName)
61{
62	/* C forbids direct cast from object pointer to function pointer */
63	union
64	{
65		deFunctionPtr	funcPtr;
66		void*			objPtr;
67	} ptr;
68
69	DE_ASSERT(library && library->libHandle && symbolName);
70	ptr.objPtr = dlsym(library->libHandle, symbolName);
71	return ptr.funcPtr;
72}
73
74#elif (DE_OS == DE_OS_WIN32)
75/* Win32 implementation. */
76
77#define WIN32_LEAN_AND_MEAN
78#define VC_EXTRALEAN
79#include <windows.h>
80
81struct deDynamicLibrary_s
82{
83	HINSTANCE	handle;
84};
85
86deDynamicLibrary* deDynamicLibrary_open (const char* fileName)
87{
88	deDynamicLibrary* library = (deDynamicLibrary*)deCalloc(sizeof(deDynamicLibrary));
89	if (!library)
90		return DE_NULL;
91
92	library->handle = LoadLibrary(fileName);
93	if (!library->handle)
94	{
95		deFree(library);
96		return DE_NULL;
97	}
98
99	return library;
100}
101
102void deDynamicLibrary_close (deDynamicLibrary* library)
103{
104	if (library && library->handle)
105		FreeLibrary(library->handle);
106	deFree(library);
107}
108
109deFunctionPtr deDynamicLibrary_getFunction (const deDynamicLibrary* library, const char* symbolName)
110{
111	DE_ASSERT(library && library->handle && symbolName);
112	return (deFunctionPtr)GetProcAddress(library->handle, symbolName);
113}
114
115#else
116#	error deDynamicLibrary is not implemented on this OS
117#endif
118