ome-common  5.2.0
module.h
Go to the documentation of this file.
1 /*
2  * #%L
3  * OME-COMMON C++ library for C++ compatibility/portability
4  * %%
5  * Copyright © 2006 - 2015 Open Microscopy Environment:
6  * - Massachusetts Institute of Technology
7  * - National Institutes of Health
8  * - University of Dundee
9  * - Board of Regents of the University of Wisconsin-Madison
10  * - Glencoe Software, Inc.
11  * %%
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions are met:
14  *
15  * 1. Redistributions of source code must retain the above copyright notice,
16  * this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright notice,
18  * this list of conditions and the following disclaimer in the documentation
19  * and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * The views and conclusions contained in the software and documentation are
34  * those of the authors and should not be interpreted as representing official
35  * policies, either expressed or implied, of any organization.
36  * #L%
37  */
38 
46 #ifndef OME_COMMON_MODULE_H
47 # define OME_COMMON_MODULE_H
48 
49 # include <ome/common/config.h>
50 # include <ome/common/filesystem.h>
51 
52 namespace ome
53 {
54  namespace common
55  {
56 
70  const boost::filesystem::path&
71  module_runtime_path(const std::string& dtype);
72 
87  void
89 
98  struct Module
99  {
101  std::string name;
104  std::string envvar;
107  std::string module_envvar;
110  std::string root_envvar;
113  boost::filesystem::path abspath;
115  boost::filesystem::path relpath;
117  boost::filesystem::path install_prefix;
119  boost::filesystem::path shlibpath;
121  boost::filesystem::path realpath;
126  boost::filesystem::path (*module_path)();
127 
144  Module(const std::string& name,
145  const std::string& envvar,
146  const std::string& module_envvar,
147  const std::string& root_envvar,
148  const boost::filesystem::path& abspath,
149  const boost::filesystem::path& relpath,
150  const boost::filesystem::path& install_prefix,
151  const boost::filesystem::path& shlibpath,
152  boost::filesystem::path (*module_path)());
153  };
154 
162  {
164  std::string name;
167 
186  RegisterModule(const std::string& name,
187  const std::string& envvar,
188  const std::string& module_envvar,
189  const std::string& root_envvar,
190  const boost::filesystem::path& abspath,
191  const boost::filesystem::path& relpath,
192  const boost::filesystem::path& install_prefix,
193  const boost::filesystem::path& shlibpath,
194  boost::filesystem::path (*module_path)());
195 
201  ~RegisterModule();
202  };
203  }
204 }
205 
206 // Set to include introspection functionality (used for registering
207 // paths; not for normal use).
208 #ifdef OME_COMMON_MODULE_INTROSPECTION
209 
210 #ifdef OME_HAVE_DLADDR
211 #ifndef _GNU_SOURCE
212 # define _GNU_SOURCE 1
213 #endif
214 #include <dlfcn.h>
215 #endif // OME_HAVE_DLADDR
216 
217 #ifdef _MSC_VER
218 # include <windows.h>
219 #endif
220 
221 namespace
222 {
223 
224 #ifdef OME_HAVE_DLADDR
225  Dl_info this_module;
226 
227  __attribute__((constructor))
228  void
229  find_module(void)
230  {
231  if(!dladdr(reinterpret_cast<void *>(find_module), &this_module))
232  {
233  this_module.dli_fname = 0;
234  }
235  }
236 
237  boost::filesystem::path
238  module_path()
239  {
240  if (this_module.dli_fname)
241  return canonical(boost::filesystem::path(this_module.dli_fname));
242  return boost::filesystem::path();
243  }
244 #elif _MSC_VER
245  HMODULE
246  find_module(void)
247  {
248  static bool found_module = false;
249  static HMODULE this_module;
250 
251  if (!found_module)
252  {
253  if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
254  GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
255  reinterpret_cast<LPCWSTR>(&find_module),
256  &this_module))
257  {
258  this_module = 0;
259  }
260  found_module = true;
261  }
262  return this_module;
263  }
264 
265  boost::filesystem::path
266  module_path()
267  {
268  HMODULE this_module = find_module();
269  if (this_module)
270  {
271  WCHAR win_wide_path[MAX_PATH];
272  GetModuleFileNameW(this_module, win_wide_path, sizeof(win_wide_path));
273  return boost::filesystem::path(win_wide_path);
274  }
275  return boost::filesystem::path();
276  }
277 #else // No introspection available
278  boost::filesystem::path
279  module_path()
280  {
281  return boost::filesystem::path();
282  }
283 #endif // _MSC_VER
284 }
285 #endif // OME_COMMON_MODULE_INTROSPECTION
286 
287 #endif // OME_COMMON_MODULE_H
288 
289 /*
290  * Local Variables:
291  * mode:C++
292  * End:
293  */
boost::filesystem::path canonical(const boost::filesystem::path &p, const boost::filesystem::path &base=boost::filesystem::current_path(), boost::system::error_code *ec=0)
Get a canonical path.
Definition: filesystem.h:105
boost::filesystem::path realpath
The detected path (used to cache search result).
Definition: module.h:121
std::string root_envvar
Name of the environment variable used to specify the installation root.
Definition: module.h:110
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:164
boost::filesystem::path abspath
Absolute path (used when configured to use an absolute install path).
Definition: module.h:113
const fs::path & module_runtime_path(const std::string &dtype)
Get the runtime installation prefix path for a module.
Definition: module.cpp:371
boost::filesystem::path shlibpath
Shared library path (used for relocatable installs).
Definition: module.h:119
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:101
boost::filesystem::path relpath
Relative path (used for relocatable installs).
Definition: module.h:115
Module(const std::string &name, const std::string &envvar, const std::string &module_envvar, const std::string &root_envvar, const boost::filesystem::path &abspath, const boost::filesystem::path &relpath, const boost::filesystem::path &install_prefix, const boost::filesystem::path &shlibpath, boost::filesystem::path(*module_path)())
Constructor.
Definition: module.cpp:272
bool registered
Is the path registered in the path map?
Definition: module.h:166
Boost.Filesystem compatibility.
Definition: boolean.h:48
A run-time path for a given module.
Definition: module.h:98
boost::filesystem::path(* module_path)()
Function to obtain the absolute path of the module providing the path (from the shared library or DLL...
Definition: module.h:126
std::string module_envvar
Name of the environment variable used to specify the module installation root.
Definition: module.h:107
std::string envvar
Name of the environment variable used to override the autodetected path.
Definition: module.h:104
Register a module to make it available to module_runtime_path().
Definition: module.h:161
boost::filesystem::path install_prefix
Absolute installation path (used for non-relocatable installs).
Definition: module.h:117
void register_module_paths()
Register OME-Common module paths.
Definition: module.cpp:488