xslibraryloader.c
Go to the documentation of this file.
1 
2 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions, and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions, and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // 3. Neither the names of the copyright holders nor the names of their contributors
16 // may be used to endorse or promote products derived from this software without
17 // specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
26 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
28 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
29 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
30 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
31 //
32 
33 
34 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
35 // All rights reserved.
36 //
37 // Redistribution and use in source and binary forms, with or without modification,
38 // are permitted provided that the following conditions are met:
39 //
40 // 1. Redistributions of source code must retain the above copyright notice,
41 // this list of conditions, and the following disclaimer.
42 //
43 // 2. Redistributions in binary form must reproduce the above copyright notice,
44 // this list of conditions, and the following disclaimer in the documentation
45 // and/or other materials provided with the distribution.
46 //
47 // 3. Neither the names of the copyright holders nor the names of their contributors
48 // may be used to endorse or promote products derived from this software without
49 // specific prior written permission.
50 //
51 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
52 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
54 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
58 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
60 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
61 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
62 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
63 //
64 
65 #include "xslibraryloader.h"
66 #include "xsstring.h"
67 
68 #ifdef __GNUC__
69  #include <dlfcn.h>
70 #elif defined(_MSC_VER)
71  #include <Windows.h>
72 #endif
73 
81 int XsLibraryLoader_load(XsLibraryLoader* thisp, const XsString* libraryName)
82 {
83 #ifdef __GNUC__
84  if (XsLibraryLoader_isLoaded(thisp))
85  return 0;
86  thisp->m_handle = dlopen(libraryName->m_data, RTLD_LAZY);
87 #elif defined(_MSC_VER)
88  wchar_t* libraryNameW;
89  XsSize required;
90  if (XsLibraryLoader_isLoaded(thisp))
91  return 0;
92  required = XsString_copyToWCharArray(libraryName, NULL, 0);
93  libraryNameW = (wchar_t*)malloc(required * sizeof(wchar_t));
94 
95  (void)XsString_copyToWCharArray(libraryName, libraryNameW, required);
96 
97  thisp->m_handle = LoadLibrary(libraryNameW);
98 
99  free(libraryNameW);
100 #endif
101  return XsLibraryLoader_isLoaded(thisp);
102 }
103 
110 void* XsLibraryLoader_resolve(const XsLibraryLoader* thisp, const char* functionName)
111 {
112 #ifdef __GNUC__
113  return dlsym(thisp->m_handle, functionName);
114 #elif defined(_MSC_VER)
115 #pragma warning(push)
116 #pragma warning(disable: 4152)
117  return GetProcAddress(thisp->m_handle, functionName);
118 #pragma warning(pop)
119 #endif
120 }
121 
128 {
129  void* handle = thisp->m_handle;
130  thisp->m_handle = NULL;
131  if (handle)
132  {
133 #ifdef __GNUC__
134  return dlclose(handle) == 0;
135 #elif defined(_MSC_VER)
136  return FreeLibrary(handle) != 0;
137 #endif
138  }
139  return 0;
140 }
141 
148 {
149  return thisp->m_handle != NULL;
150 }
151 
156 {
157 #ifdef __GNUC__
158  XsString_assignCharArray(error, dlerror());
159 #elif defined(_MSC_VER)
160  LPTSTR errorText = NULL;
161  (void)FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
162  | FORMAT_MESSAGE_ALLOCATE_BUFFER
163  | FORMAT_MESSAGE_IGNORE_INSERTS,
164  NULL,
165  GetLastError(),
166  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
167  (LPTSTR)&errorText,
168  0,
169  NULL);
170 
171  XsString_assignWCharArray(error, errorText);
172  LocalFree(errorText);
173 #endif
174 }
xsstring.h
XsString_copyToWCharArray
XsSize XsString_copyToWCharArray(const XsString *thisPtr, wchar_t *dest, XsSize size)
This function copies the contents of the object to a unicode wchar_t array.
Definition: xsstring.c:215
xslibraryloader.h
XsLibraryLoader::m_handle
void * m_handle
Definition: xslibraryloader.h:162
XsString_assignWCharArray
void XsString_assignWCharArray(XsString *thisPtr, const wchar_t *src)
This function determines the size of src and copies the contents to the object after converting it fr...
Definition: xsstring.c:181
XsLibraryLoader_getErrorString
void XsLibraryLoader_getErrorString(XsString *error)
Get an error string after a failure occurred.
Definition: xslibraryloader.c:155
XsLibraryLoader
The Xsens dynamic library loader base class.
Definition: xslibraryloader.h:93
XsSize
size_t XsSize
XsSize must be unsigned number!
Definition: xstypedefs.h:74
XsLibraryLoader_isLoaded
int XsLibraryLoader_isLoaded(const XsLibraryLoader *thisp)
Check if a library is loaded.
Definition: xslibraryloader.c:147
XsLibraryLoader_resolve
void * XsLibraryLoader_resolve(const XsLibraryLoader *thisp, const char *functionName)
Resolve a function from the library.
Definition: xslibraryloader.c:110
XsLibraryLoader_load
int XsLibraryLoader_load(XsLibraryLoader *thisp, const XsString *libraryName)
Dynamically load a library.
Definition: xslibraryloader.c:81
XsLibraryLoader_unload
int XsLibraryLoader_unload(XsLibraryLoader *thisp)
Unload the loaded library.
Definition: xslibraryloader.c:127
XsString_assignCharArray
void XsString_assignCharArray(XsString *thisPtr, const char *src)
This function determines the size of src and copies the contents to the object.
Definition: xsstring.c:172
XsString
A 0-terminated managed string of characters.


xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20