File indexing completed on 2024-05-05 16:07:09
0001 /* 0002 SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "qmlobjectsharedengine.h" 0008 0009 #include <QQmlContext> 0010 #include <QQmlEngine> 0011 #include <QQmlNetworkAccessManagerFactory> 0012 0013 #include <QDebug> 0014 #include <kdeclarative.h> 0015 0016 namespace KDeclarative 0017 { 0018 class QmlObjectSharedEnginePrivate 0019 { 0020 public: 0021 QmlObjectSharedEnginePrivate() 0022 { 0023 // ensure the engine is present, then ref it 0024 engine(); 0025 engineRef = s_engine; 0026 } 0027 0028 ~QmlObjectSharedEnginePrivate() 0029 { 0030 // when the only remaining are our three refs, reset the pointers, causing deletion 0031 // when the refcount is 3, we are sure that the only refs are s_engine, our copy 0032 // of engineRef and m_engine in QmlObject. 0033 if (engineRef.use_count() <= 3) { 0034 s_engine.reset(); 0035 } 0036 } 0037 0038 static std::shared_ptr<QQmlEngine> engine() 0039 { 0040 if (!s_engine) { 0041 s_engine = std::make_shared<QQmlEngine>(); 0042 #if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 98) 0043 KDeclarative::setupEngine(s_engine.get()); 0044 #endif 0045 } 0046 return s_engine; 0047 } 0048 0049 // used to delete it 0050 std::shared_ptr<QQmlEngine> engineRef; 0051 0052 static std::shared_ptr<QQmlEngine> s_engine; 0053 }; 0054 0055 std::shared_ptr<QQmlEngine> QmlObjectSharedEnginePrivate::s_engine = std::shared_ptr<QQmlEngine>(); 0056 0057 QmlObjectSharedEngine::QmlObjectSharedEngine(QObject *parent) 0058 : QmlObject(QmlObjectSharedEnginePrivate::engine(), new QQmlContext(QmlObjectSharedEnginePrivate::engine().get()), parent) 0059 , d(new QmlObjectSharedEnginePrivate()) 0060 { 0061 rootContext()->setParent(this); 0062 } 0063 0064 QmlObjectSharedEngine::~QmlObjectSharedEngine() 0065 { 0066 } 0067 0068 } 0069 0070 #include "moc_qmlobjectsharedengine.cpp"