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"