1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qsymbolsresolveutils_p.h"
5
6#include <qdebug.h>
7#include <algorithm>
8#include <qloggingcategory.h>
9
10QT_BEGIN_NAMESPACE
11
12static Q_LOGGING_CATEGORY(qLcSymbolsResolver, "qt.multimedia.symbolsresolver");
13
14bool SymbolsResolver::isLazyLoadEnabled()
15{
16 static const bool lazyLoad =
17 !static_cast<bool>(qEnvironmentVariableIntValue(varName: "QT_INSTANT_LOAD_FFMPEG_STUBS"));
18 return lazyLoad;
19}
20
21SymbolsResolver::SymbolsResolver(const char *libLoggingName, LibraryLoader loader)
22 : m_libLoggingName(libLoggingName)
23{
24 Q_ASSERT(libLoggingName);
25 Q_ASSERT(loader);
26
27 auto library = loader();
28 if (library && library->isLoaded())
29 m_library = std::move(library);
30 else
31 qCWarning(qLcSymbolsResolver) << "Couldn't load" << m_libLoggingName << "library";
32}
33
34SymbolsResolver::SymbolsResolver(const char *libName, const char *version,
35 const char *libLoggingName)
36 : m_libLoggingName(libLoggingName ? libLoggingName : libName)
37{
38 Q_ASSERT(libName);
39 Q_ASSERT(version);
40
41 auto library = std::make_unique<QLibrary>(args: QString::fromLocal8Bit(ba: libName),
42 args: QString::fromLocal8Bit(ba: version));
43 if (library->load())
44 m_library = std::move(library);
45 else
46 qCWarning(qLcSymbolsResolver) << "Couldn't load" << m_libLoggingName << "library";
47}
48
49SymbolsResolver::~SymbolsResolver()
50{
51 if (m_library)
52 m_library->unload();
53}
54
55QFunctionPointer SymbolsResolver::initFunction(const char *funcName)
56{
57 if (!m_library)
58 return nullptr;
59 if (auto func = m_library->resolve(symbol: funcName))
60 return func;
61
62 qCWarning(qLcSymbolsResolver) << "Couldn't resolve" << m_libLoggingName << "symbol" << funcName;
63 m_library->unload();
64 m_library.reset();
65 return nullptr;
66}
67
68void SymbolsResolver::checkLibrariesLoaded(SymbolsMarker *begin, SymbolsMarker *end)
69{
70 if (m_library) {
71 qCDebug(qLcSymbolsResolver) << m_libLoggingName << "symbols resolved";
72 } else {
73 const auto size = reinterpret_cast<char *>(end) - reinterpret_cast<char *>(begin);
74 memset(s: begin, c: 0, n: size);
75 qCWarning(qLcSymbolsResolver) << "Couldn't resolve" << m_libLoggingName << "symbols";
76 }
77}
78
79QT_END_NAMESPACE
80

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

source code of qtmultimedia/src/multimedia/qsymbolsresolveutils.cpp