summaryrefslogtreecommitdiff
path: root/src/cppunit/DynamicLibraryManager.cpp
blob: 9471870788c324b82ce1e49ab349dbd89b5761df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <cppunit/plugin/DynamicLibraryManager.h>

#if !defined(CPPUNIT_NO_TESTPLUGIN)
#include <cppunit/plugin/DynamicLibraryManagerException.h>

CPPUNIT_NS_BEGIN


DynamicLibraryManager::DynamicLibraryManager( const std::string &libraryFileName )
    : m_libraryHandle( nullptr )
    , m_libraryName( libraryFileName )
{
  loadLibrary( libraryFileName );
}


DynamicLibraryManager::~DynamicLibraryManager()
{
  releaseLibrary();
}


DynamicLibraryManager::Symbol 
DynamicLibraryManager::findSymbol( const std::string &symbol )
{
  try
  {
    Symbol symbolPointer = doFindSymbol( symbol );
    if ( symbolPointer != nullptr )
      return symbolPointer;
  }
  catch ( ... )
  {
  }

  throw DynamicLibraryManagerException( m_libraryName, 
                                        symbol,
                                        DynamicLibraryManagerException::symbolNotFound );
  return nullptr;    // keep compiler happy
}


void
DynamicLibraryManager::loadLibrary( const std::string &libraryName )
{
  try
  {
    releaseLibrary();
    m_libraryHandle = doLoadLibrary( libraryName );
    if ( m_libraryHandle != nullptr )
      return;
  }
  catch (...)
  {
  }

  throw DynamicLibraryManagerException( m_libraryName,
                                        getLastErrorDetail(),
                                        DynamicLibraryManagerException::loadingFailed );
}


void 
DynamicLibraryManager::releaseLibrary()
{
  if ( m_libraryHandle != nullptr )
  {
    doReleaseLibrary();
    m_libraryHandle = nullptr;
  }
}


CPPUNIT_NS_END


#endif // !defined(CPPUNIT_NO_TESTPLUGIN)