You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
#ifndef QTMVVM_SERVICEREGISTRY_P_H
|
|
#define QTMVVM_SERVICEREGISTRY_P_H
|
|
|
|
#include <QtCore/QMutex>
|
|
#include <QtCore/QSharedPointer>
|
|
|
|
#include "qtmvvmcore_global.h"
|
|
#include "serviceregistry.h"
|
|
|
|
namespace QtMvvm {
|
|
|
|
class ServiceRegistryPrivate
|
|
{
|
|
public:
|
|
class ServiceInfo {
|
|
public:
|
|
ServiceInfo(bool weak);
|
|
virtual ~ServiceInfo();
|
|
|
|
bool replaceable() const;
|
|
QObject *instance(ServiceRegistryPrivate *d, const QByteArray &iid);
|
|
|
|
protected:
|
|
virtual QObject *construct(ServiceRegistryPrivate *d) const = 0;
|
|
|
|
private:
|
|
const bool _weak;
|
|
QObject *_instance;
|
|
};
|
|
|
|
class FnServiceInfo : public ServiceInfo {
|
|
public:
|
|
FnServiceInfo(const std::function<QObject*(QObjectList)> &creator, const QByteArrayList &injectables, bool weak);
|
|
|
|
protected:
|
|
QObject *construct(ServiceRegistryPrivate *d) const final;
|
|
|
|
private:
|
|
std::function<QObject*(QObjectList)> creator;
|
|
QByteArrayList injectables;
|
|
};
|
|
|
|
class MetaServiceInfo : public ServiceInfo {
|
|
public:
|
|
MetaServiceInfo(const QMetaObject *metaObject, bool weak);
|
|
|
|
protected:
|
|
QObject *construct(ServiceRegistryPrivate *d) const final;
|
|
|
|
private:
|
|
const QMetaObject *metaObject;
|
|
};
|
|
|
|
QMutex serviceMutex;
|
|
QHash<QByteArray, QSharedPointer<ServiceInfo>> services;
|
|
|
|
ServiceRegistryPrivate();
|
|
|
|
bool serviceBlocked(const QByteArray &iid) const;
|
|
static QObject *constructInjected(const QMetaObject *metaObject);
|
|
QObject *constructInjectedLocked(const QMetaObject *metaObject);
|
|
};
|
|
|
|
}
|
|
|
|
#endif // QTMVVM_SERVICEREGISTRY_P_H
|
|
|