Home | History | Annotate | Download | only in utility
      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 
     36 class DynamicLibrary : private utility::NonCopyable
     37 {
     38 public:
     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 
     60 private:
     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