1/*
2* Copyright (c) 2014-2015, Intel Corporation
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, this
9* 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 and/or
13* other materials provided with the distribution.
14*
15* 3. Neither the name of the copyright holder nor the names of its 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
20* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*/
30#pragma once
31
32#include "NonCopyable.hpp"
33
34#include <string>
35
36class DynamicLibrary : private utility::NonCopyable
37{
38public:
39    /**
40    * @param[in] path the library path which can be provided either in absolute path or
41    *            or OS agnostic (ie. generic) name.
42    * Note:
43    * If generic name provided, OS specific prefix, suffix are added automatically
44    */
45    DynamicLibrary(const std::string &path);
46    ~DynamicLibrary();
47
48    /**
49    * Get a symbol from library
50    *
51    * @param[in] symbol the symbol name
52    * @return a symbol's address in the library if it exists, NULL otherwise
53    */
54    template <typename SymbolType>
55    SymbolType getSymbol(const std::string &symbol) const
56    {
57        return reinterpret_cast<SymbolType>(osGetSymbol(symbol));
58    }
59
60private:
61    /**
62    * OS secific helper to get a symbol from library
63    *
64    * @param[in] symbol the symbol name
65    * @return symbol's address in the library if it exists, NULL otherwise
66    */
67    void *osGetSymbol(const std::string &symbol) const;
68
69    /**
70    * Sanitize library path
71    *
72    * @param[in] path library stripped path (eg. no prefix, no suffix)
73    * @return OS specific library path including prefix and suffix
74    */
75    static std::string osSanitizePathName(const std::string &path);
76
77    /**
78    * Opaque object for library handling
79    */
80    void *_handle;
81
82    /**
83     * Path to the library
84     */
85    const std::string _path;
86
87    /**
88    * OS Specific library name patterns
89    * @{
90    */
91    static const std::string _osLibraryPrefix;
92    static const std::string _osLibrarySuffix;
93    /** @}*/
94};
95