Home | History | Annotate | Download | only in base
      1 /*
      2  * libjingle
      3  * Copyright 2004--2010, Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, 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  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef TALK_BASE_LATEBINDINGSYMBOLTABLE_H_
     29 #define TALK_BASE_LATEBINDINGSYMBOLTABLE_H_
     30 
     31 #include <string.h>
     32 
     33 #include "talk/base/common.h"
     34 
     35 namespace talk_base {
     36 
     37 #ifdef POSIX
     38 typedef void *DllHandle;
     39 #else
     40 #error Not implemented for this platform
     41 #endif
     42 
     43 // This is the base class for "symbol table" classes to simplify the dynamic
     44 // loading of symbols from DLLs. Currently the implementation only supports
     45 // Linux and OS X, and pure C symbols (or extern "C" symbols that wrap C++
     46 // functions).  Sub-classes for specific DLLs are generated via the "supermacro"
     47 // files latebindingsymboltable.h.def and latebindingsymboltable.cc.def. See
     48 // talk/sound/pulseaudiosymboltable.(h|cc) for an example.
     49 class LateBindingSymbolTable {
     50  public:
     51   struct TableInfo {
     52     const char *dll_name;
     53     int num_symbols;
     54     // Array of size num_symbols.
     55     const char *const *symbol_names;
     56   };
     57 
     58   LateBindingSymbolTable(const TableInfo *info, void **table);
     59   ~LateBindingSymbolTable();
     60 
     61   bool IsLoaded() const;
     62   // Loads the DLL and the symbol table. Returns true iff the DLL and symbol
     63   // table loaded successfully.
     64   bool Load();
     65   // Like load, but allows overriding the dll path for when the dll path is
     66   // dynamic.
     67   bool LoadFromPath(const char *dll_path);
     68   void Unload();
     69 
     70  private:
     71   void ClearSymbols();
     72 
     73   const TableInfo *info_;
     74   void **table_;
     75   DllHandle handle_;
     76   bool undefined_symbols_;
     77 
     78   DISALLOW_COPY_AND_ASSIGN(LateBindingSymbolTable);
     79 };
     80 
     81 }  // namespace talk_base
     82 
     83 #endif  // TALK_BASE_LATEBINDINGSYMBOLTABLE_H_
     84