Merge pull request #25762 from CastagnaIT/gui_menu_tracks
[xbmc.git] / xbmc / cores / DllLoader / SoLoader.cpp
blob2b5cbce1b918e4b7cb05ba153710593201910b6a
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "SoLoader.h"
11 #include "filesystem/SpecialProtocol.h"
12 #include "utils/log.h"
14 #include <dlfcn.h>
16 SoLoader::SoLoader(const std::string &so, bool bGlobal) : LibraryLoader(so)
18 m_soHandle = NULL;
19 m_bGlobal = bGlobal;
20 m_bLoaded = false;
23 SoLoader::~SoLoader()
25 if (m_bLoaded)
26 Unload();
29 bool SoLoader::Load()
31 if (m_soHandle != NULL)
32 return true;
34 std::string strFileName= CSpecialProtocol::TranslatePath(GetFileName());
35 if (strFileName == "xbmc.so")
37 CLog::Log(LOGDEBUG, "Loading Internal Library");
38 m_soHandle = RTLD_DEFAULT;
40 else
42 CLog::Log(LOGDEBUG, "Loading: {}", strFileName);
43 int flags = RTLD_LAZY;
44 m_soHandle = dlopen(strFileName.c_str(), flags);
45 if (!m_soHandle)
47 CLog::Log(LOGERROR, "Unable to load {}, reason: {}", strFileName, dlerror());
48 return false;
51 m_bLoaded = true;
52 return true;
55 void SoLoader::Unload()
58 if (m_soHandle)
60 if (dlclose(m_soHandle) != 0)
61 CLog::Log(LOGERROR, "Unable to unload {}, reason: {}", GetName(), dlerror());
63 m_bLoaded = false;
64 m_soHandle = NULL;
67 int SoLoader::ResolveExport(const char* symbol, void** f, bool logging)
69 if (!m_bLoaded && !Load())
71 if (logging)
72 CLog::Log(LOGWARNING, "Unable to resolve: {} {}, reason: so not loaded", GetName(), symbol);
73 return 0;
76 void* s = dlsym(m_soHandle, symbol);
77 if (!s)
79 if (logging)
80 CLog::Log(LOGWARNING, "Unable to resolve: {} {}, reason: {}", GetName(), symbol, dlerror());
81 return 0;
84 *f = s;
85 return 1;
88 bool SoLoader::IsSystemDll()
90 return false;
93 HMODULE SoLoader::GetHModule()
95 return m_soHandle;
98 bool SoLoader::HasSymbols()
100 return false;