swift
provider.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_PROVIDER_H
7 #define SWIFT_MISC_PROVIDER_H
8 
9 #include <QMetaObject>
10 #include <QObject>
11 
12 #include "misc/connectionguard.h"
13 #include "misc/swiftmiscexport.h"
14 
15 namespace swift::misc
16 {
19  {
20  public:
22  virtual ~IProvider();
23 
25  IProvider(const IProvider &) = delete;
26 
28  IProvider &operator=(const IProvider &) = delete;
29 
31  virtual QObject *asQObject() { return nullptr; }
32 
33  protected:
35  IProvider() {}
36  };
37 
39  template <class PROVIDER>
41  {
42  protected:
44  IProviderAware(PROVIDER *provider = nullptr) { this->setProvider(provider); }
45 
47  virtual ~IProviderAware() {}
48 
50  bool hasProvider() const { return m_provider; }
51 
53  PROVIDER *getProvider() const { return m_provider; }
54 
57  void setProvider(PROVIDER *provider)
58  {
59  if (m_provider == provider) { return; }
60  if (m_provider) { m_lastProviderConnections.disconnectAll(); }
61  m_provider = provider; // new provider
62  IProvider *iProvider = dynamic_cast<IProvider *>(provider);
63  if (iProvider && iProvider->asQObject())
64  {
65  QMetaObject::Connection con = QObject::connect(iProvider->asQObject(), &QObject::destroyed,
66  [=](QObject *obj) { this->onProviderDestroyed(obj); });
67  m_lastProviderConnections.append(con);
68  }
69  }
70 
72  PROVIDER *provider() { return m_provider; }
73 
75  const PROVIDER *provider() const { return m_provider; }
76 
77  private:
78  CConnectionGuard m_lastProviderConnections;
79  PROVIDER *m_provider = nullptr;
80 
82  virtual void onProviderDestroyed(QObject *obj)
83  {
84  if (!m_provider) { return; } // already cleaned relationship
85  PROVIDER *provider = qobject_cast<PROVIDER *>(obj); // provider is implemented by a QObject
86  if (provider != m_provider) { return; } // not our business
87  m_provider = nullptr;
88  }
89  };
90 } // namespace swift::misc
91 
92 Q_DECLARE_INTERFACE(swift::misc::IProvider, "org.swift-project.misc.iprovider")
93 
94 #endif // SWIFT_MISC_PROVIDER_H
List of QMetaObject::Connection.
Base class of provider aware classes.
Definition: provider.h:41
virtual void onProviderDestroyed(QObject *obj)
Provider was deleted.
Definition: provider.h:82
bool hasProvider() const
Has provider?
Definition: provider.h:50
PROVIDER * getProvider() const
Provider.
Definition: provider.h:53
PROVIDER * provider()
Provider.
Definition: provider.h:72
IProviderAware(PROVIDER *provider=nullptr)
Ctor.
Definition: provider.h:44
const PROVIDER * provider() const
Const provider.
Definition: provider.h:75
void setProvider(PROVIDER *provider)
Set the provider.
Definition: provider.h:57
virtual ~IProviderAware()
Dtor.
Definition: provider.h:47
Base class for providers.
Definition: provider.h:19
IProvider()
Constructor.
Definition: provider.h:35
IProvider(const IProvider &)=delete
Copy constructor.
virtual QObject * asQObject()
Return as QObject.
Definition: provider.h:31
IProvider & operator=(const IProvider &)=delete
Copy assignment operator.
Free functions in swift::misc.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.