ome-common  5.3.1
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 
55 namespace ome
56 {
57  namespace common
58  {
59 
73  const boost::filesystem::path&
74  module_runtime_path(const std::string& dtype);
75 
90  void
92 
101  struct Module
102  {
104  std::string name;
107  std::string envvar;
110  std::string module_envvar;
113  std::string root_envvar;
116  boost::filesystem::path abspath;
118  boost::filesystem::path relpath;
120  boost::filesystem::path install_prefix;
122  boost::filesystem::path shlibpath;
124  boost::filesystem::path realpath;
129  boost::filesystem::path (*module_path)();
130 
147  Module(const std::string& name,
148  const std::string& envvar,
149  const std::string& module_envvar,
150  const std::string& root_envvar,
151  const boost::filesystem::path& abspath,
152  const boost::filesystem::path& relpath,
153  const boost::filesystem::path& install_prefix,
154  const boost::filesystem::path& shlibpath,
155  boost::filesystem::path (*module_path)());
156  };
157 
165  {
167  std::string name;
170 
189  RegisterModule(const std::string& name,
190  const std::string& envvar,
191  const std::string& module_envvar,
192  const std::string& root_envvar,
193  const boost::filesystem::path& abspath,
194  const boost::filesystem::path& relpath,
195  const boost::filesystem::path& install_prefix,
196  const boost::filesystem::path& shlibpath,
197  boost::filesystem::path (*module_path)());
198 
204  ~RegisterModule();
205  };
206  }
207 }
208 
209 // Set to include introspection functionality (used for registering
210 // paths; not for normal use).
211 #ifdef OME_COMMON_MODULE_INTROSPECTION
212 
213 #ifdef OME_HAVE_DLADDR
214 #ifndef _GNU_SOURCE
215 # define _GNU_SOURCE 1
216 #endif
217 #include <dlfcn.h>
218 #endif // OME_HAVE_DLADDR
219 
220 #ifdef _MSC_VER
221 # include <windows.h>
222 #endif
223 
224 namespace
225 {
226 
227 #ifdef OME_HAVE_DLADDR
228  Dl_info this_module;
229 
230  __attribute__((constructor))
231  void
232  find_module(void)
233  {
234  if(!dladdr(reinterpret_cast<void *>(find_module), &this_module))
235  {
236  this_module.dli_fname = 0;
237  }
238  }
239 
240  boost::filesystem::path
241  module_path()
242  {
243  if (this_module.dli_fname)
244  return canonical(boost::filesystem::path(this_module.dli_fname));
245  return boost::filesystem::path();
246  }
247 #elif _MSC_VER
248  HMODULE
249  find_module(void)
250  {
251  static bool found_module = false;
252  static HMODULE this_module;
253 
254  if (!found_module)
255  {
256  if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
257  GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
258  reinterpret_cast<LPCWSTR>(&find_module),
259  &this_module))
260  {
261  this_module = 0;
262  }
263  found_module = true;
264  }
265  return this_module;
266  }
267 
268  boost::filesystem::path
269  module_path()
270  {
271  HMODULE this_module = find_module();
272  if (this_module)
273  {
274  WCHAR win_wide_path[MAX_PATH];
275  GetModuleFileNameW(this_module, win_wide_path, sizeof(win_wide_path));
276  return boost::filesystem::path(win_wide_path);
277  }
278  return boost::filesystem::path();
279  }
280 #else // No introspection available
281  boost::filesystem::path
282  module_path()
283  {
284  return boost::filesystem::path();
285  }
286 #endif // _MSC_VER
287 }
288 #endif // OME_COMMON_MODULE_INTROSPECTION
289 
290 #endif // OME_COMMON_MODULE_H
291 
292 /*
293  * Local Variables:
294  * mode:C++
295  * End:
296  */
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:124
std::string root_envvar
Name of the environment variable used to specify the installation root.
Definition: module.h:113
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:167
boost::filesystem::path abspath
Absolute path (used when configured to use an absolute install path).
Definition: module.h:116
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:122
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:104
boost::filesystem::path relpath
Relative path (used for relocatable installs).
Definition: module.h:118
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:169
Boost.Filesystem compatibility.
Open Microscopy Environment C++.
Definition: base64.h:49
A run-time path for a given module.
Definition: module.h:101
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:129
std::string module_envvar
Name of the environment variable used to specify the module installation root.
Definition: module.h:110
std::string envvar
Name of the environment variable used to override the autodetected path.
Definition: module.h:107
Register a module to make it available to module_runtime_path().
Definition: module.h:164
boost::filesystem::path install_prefix
Absolute installation path (used for non-relocatable installs).
Definition: module.h:120
void register_module_paths()
Register OME-Common module paths.
Definition: module.cpp:488