cache supported devices map instead of re-parsing it all the time
This commit is contained in:
parent
c37177ae85
commit
de40dbd55f
@ -202,10 +202,155 @@ QList<Vendor> DevicePlugin::supportedVendors() const
|
|||||||
*/
|
*/
|
||||||
QList<DeviceClass> DevicePlugin::supportedDevices() const
|
QList<DeviceClass> DevicePlugin::supportedDevices() const
|
||||||
{
|
{
|
||||||
|
return m_supportedDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Returns the translator of this \l{DevicePlugin}. */
|
||||||
|
QTranslator *DevicePlugin::translator()
|
||||||
|
{
|
||||||
|
return m_translator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Returns true if the given \a locale could be set for this \l{DevicePlugin}. */
|
||||||
|
bool DevicePlugin::setLocale(const QLocale &locale)
|
||||||
|
{
|
||||||
|
// check if there are local translations
|
||||||
|
if (m_translator->load(locale, m_metaData.value("id").toString(), "-", QDir(QCoreApplication::applicationDirPath() + "../../translations/").absolutePath(), ".qm")) {
|
||||||
|
qCDebug(dcDeviceManager()) << "* Load translation" << locale.name() << "for" << pluginName() << "from" << QDir(QCoreApplication::applicationDirPath() + "../../translations/").absolutePath() + "/" + m_metaData.value("id").toString() + "-" + locale.name() + ".qm";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise use the system translations
|
||||||
|
if (m_translator->load(locale, m_metaData.value("id").toString(), "-", GuhSettings::translationsPath(), ".qm")) {
|
||||||
|
qCDebug(dcDeviceManager()) << "* Load translation" << locale.name() << "for" << pluginName() << "from" << GuhSettings::translationsPath();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locale.name() != "en_US")
|
||||||
|
qCWarning(dcDeviceManager()) << "* Could not load translation" << locale.name() << "for plugin" << pluginName();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Override this if your plugin supports Device with DeviceClass::CreationMethodAuto.
|
||||||
|
This will be called at startup, after the configured devices have been loaded.
|
||||||
|
This is the earliest time you should start emitting autoDevicesAppeared(). If you
|
||||||
|
are monitoring some hardware/service for devices to appear, start monitoring now.
|
||||||
|
If you are building the devices based on a static list, you may emit
|
||||||
|
autoDevicesAppeard() in here.
|
||||||
|
*/
|
||||||
|
void DevicePlugin::startMonitoringAutoDevices()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Reimplement this if you support a DeviceClass with createMethod \l{DeviceManager}{CreateMethodDiscovery}.
|
||||||
|
This will be called to discover Devices for the given \a deviceClassId with the given \a params. This will always
|
||||||
|
be an async operation. Return \l{DeviceManager}{DeviceErrorAsync} or \l{DeviceManager}{DeviceErrorNoError}
|
||||||
|
if the discovery has been started successfully. Return an appropriate error otherwise.
|
||||||
|
Once devices are discovered, emit devicesDiscovered(). */
|
||||||
|
DeviceManager::DeviceError DevicePlugin::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms)
|
||||||
|
{
|
||||||
|
Q_UNUSED(deviceClassId)
|
||||||
|
Q_UNUSED(params)
|
||||||
|
return DeviceManager::DeviceErrorCreationMethodNotSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This will be called when a new device is created. The plugin has the chance to do some setup.
|
||||||
|
Return \l{DeviceManager}{DeviceSetupStatusFailure} if something bad happened during the setup in which case the \a device
|
||||||
|
will be disabled. Return \l{DeviceManager}{DeviceSetupStatusSuccess} if everything went well. If you can't tell yet and
|
||||||
|
need more time to set up the \a device (note: you should never block in this method) you can
|
||||||
|
return \l{DeviceManager}{DeviceSetupStatusAsync}. In that case the \l{DeviceManager} will wait for you to emit
|
||||||
|
\l{DevicePlugin}{deviceSetupFinished} to report the status.
|
||||||
|
*/
|
||||||
|
DeviceManager::DeviceSetupStatus DevicePlugin::setupDevice(Device *device)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device)
|
||||||
|
return DeviceManager::DeviceSetupStatusSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This will be called when a new \a device was added successfully and the device setup is finished.*/
|
||||||
|
void DevicePlugin::postSetupDevice(Device *device)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This will be called when a \a device removed. The plugin has the chance to do some teardown.
|
||||||
|
* The device is still valid during this call, but already removed from the system.
|
||||||
|
* The device will be deleted as soon as this method returns.*/
|
||||||
|
void DevicePlugin::deviceRemoved(Device *device)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This method will be called for \l{Device}{Devices} with the \l{DeviceClass::SetupMethodDisplayPin} right after the paring request
|
||||||
|
* with the given \a pairingTransactionId for the given \a deviceDescriptor.*/
|
||||||
|
DeviceManager::DeviceError DevicePlugin::displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor)
|
||||||
|
{
|
||||||
|
Q_UNUSED(pairingTransactionId)
|
||||||
|
Q_UNUSED(deviceDescriptor)
|
||||||
|
|
||||||
|
qCWarning(dcDeviceManager) << "Plugin does not implement the display pin setup method.";
|
||||||
|
|
||||||
|
return DeviceManager::DeviceErrorNoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Confirms the pairing of a \a deviceClassId with the given \a pairingTransactionId and \a params.
|
||||||
|
* Returns \l{DeviceManager::DeviceError}{DeviceError} to inform about the result. The optional paramerter
|
||||||
|
* \a secret contains for example the pin for \l{Device}{Devices} with the setup method \l{DeviceClass::SetupMethodDisplayPin}.*/
|
||||||
|
DeviceManager::DeviceSetupStatus DevicePlugin::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret = QString())
|
||||||
|
{
|
||||||
|
Q_UNUSED(pairingTransactionId)
|
||||||
|
Q_UNUSED(deviceClassId)
|
||||||
|
Q_UNUSED(params)
|
||||||
|
Q_UNUSED(secret)
|
||||||
|
|
||||||
|
qCWarning(dcDeviceManager) << "Plugin does not implement pairing.";
|
||||||
|
return DeviceManager::DeviceSetupStatusFailure;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This will be called to actually execute actions on the hardware. The \{Device} and
|
||||||
|
* the \{Action} are contained in the \a device and \a action parameters.
|
||||||
|
* Return the appropriate \l{DeviceManager::DeviceError}{DeviceError}.
|
||||||
|
*
|
||||||
|
* It is possible to execute actions asynchronously. You never should do anything blocking for
|
||||||
|
* a long time (e.g. wait on a network reply from the internet) but instead return
|
||||||
|
* DeviceManager::DeviceErrorAsync and continue processing in an async manner. Once
|
||||||
|
* you have the reply ready, emit actionExecutionFinished() with the appropriate parameters.
|
||||||
|
*
|
||||||
|
* \sa actionExecutionFinished()
|
||||||
|
*/
|
||||||
|
DeviceManager::DeviceError DevicePlugin::executeAction(Device *device, const Action &action)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device)
|
||||||
|
Q_UNUSED(action)
|
||||||
|
return DeviceManager::DeviceErrorNoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Returns the configuration description of this DevicePlugin as a list of \l{ParamType}{ParamTypes}. */
|
||||||
|
QList<ParamType> DevicePlugin::configurationDescription() const
|
||||||
|
{
|
||||||
|
return m_configurationDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! This will be called when the DeviceManager initializes the plugin and set up the things behind the scenes.
|
||||||
|
When implementing a new plugin, use \l{DevicePlugin::init()} instead in order to do initialisation work. */
|
||||||
|
void DevicePlugin::initPlugin(DeviceManager *deviceManager)
|
||||||
|
{
|
||||||
|
m_deviceManager = deviceManager;
|
||||||
|
|
||||||
|
// parse plugin configuration params
|
||||||
|
if (m_metaData.contains("paramTypes")) {
|
||||||
|
QPair<bool, QList<ParamType> > paramVerification = parseParamTypes(m_metaData.value("paramTypes").toArray());
|
||||||
|
if (paramVerification.first)
|
||||||
|
m_configurationDescription << paramVerification.second;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
QStringList missingFields = verifyFields(QStringList() << "id" << "idName" << "name" << "vendors", m_metaData);
|
QStringList missingFields = verifyFields(QStringList() << "id" << "idName" << "name" << "vendors", m_metaData);
|
||||||
if (!missingFields.isEmpty()) {
|
if (!missingFields.isEmpty()) {
|
||||||
qCWarning(dcDeviceManager) << "Skipping plugin because of missing" << missingFields.join(", ") << m_metaData;
|
qCWarning(dcDeviceManager) << "Skipping plugin because of missing" << missingFields.join(", ") << m_metaData;
|
||||||
return QList<DeviceClass>();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<DeviceClass> deviceClasses;
|
QList<DeviceClass> deviceClasses;
|
||||||
@ -590,156 +735,12 @@ QList<DeviceClass> DevicePlugin::supportedDevices() const
|
|||||||
deviceClass.setInterfaces(interfaces);
|
deviceClass.setInterfaces(interfaces);
|
||||||
|
|
||||||
if (!broken) {
|
if (!broken) {
|
||||||
deviceClasses.append(deviceClass);
|
m_supportedDevices.append(deviceClass);
|
||||||
} else {
|
} else {
|
||||||
qCWarning(dcDeviceManager()) << "Skipping device class" << deviceClass.name();
|
qCWarning(dcDeviceManager()) << "Skipping device class" << deviceClass.name();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return deviceClasses;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Returns the translator of this \l{DevicePlugin}. */
|
|
||||||
QTranslator *DevicePlugin::translator()
|
|
||||||
{
|
|
||||||
return m_translator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Returns true if the given \a locale could be set for this \l{DevicePlugin}. */
|
|
||||||
bool DevicePlugin::setLocale(const QLocale &locale)
|
|
||||||
{
|
|
||||||
// check if there are local translations
|
|
||||||
if (m_translator->load(locale, m_metaData.value("id").toString(), "-", QDir(QCoreApplication::applicationDirPath() + "../../translations/").absolutePath(), ".qm")) {
|
|
||||||
qCDebug(dcDeviceManager()) << "* Load translation" << locale.name() << "for" << pluginName() << "from" << QDir(QCoreApplication::applicationDirPath() + "../../translations/").absolutePath() + "/" + m_metaData.value("id").toString() + "-" + locale.name() + ".qm";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise use the system translations
|
|
||||||
if (m_translator->load(locale, m_metaData.value("id").toString(), "-", GuhSettings::translationsPath(), ".qm")) {
|
|
||||||
qCDebug(dcDeviceManager()) << "* Load translation" << locale.name() << "for" << pluginName() << "from" << GuhSettings::translationsPath();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (locale.name() != "en_US")
|
|
||||||
qCWarning(dcDeviceManager()) << "* Could not load translation" << locale.name() << "for plugin" << pluginName();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Override this if your plugin supports Device with DeviceClass::CreationMethodAuto.
|
|
||||||
This will be called at startup, after the configured devices have been loaded.
|
|
||||||
This is the earliest time you should start emitting autoDevicesAppeared(). If you
|
|
||||||
are monitoring some hardware/service for devices to appear, start monitoring now.
|
|
||||||
If you are building the devices based on a static list, you may emit
|
|
||||||
autoDevicesAppeard() in here.
|
|
||||||
*/
|
|
||||||
void DevicePlugin::startMonitoringAutoDevices()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Reimplement this if you support a DeviceClass with createMethod \l{DeviceManager}{CreateMethodDiscovery}.
|
|
||||||
This will be called to discover Devices for the given \a deviceClassId with the given \a params. This will always
|
|
||||||
be an async operation. Return \l{DeviceManager}{DeviceErrorAsync} or \l{DeviceManager}{DeviceErrorNoError}
|
|
||||||
if the discovery has been started successfully. Return an appropriate error otherwise.
|
|
||||||
Once devices are discovered, emit devicesDiscovered(). */
|
|
||||||
DeviceManager::DeviceError DevicePlugin::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms)
|
|
||||||
{
|
|
||||||
Q_UNUSED(deviceClassId)
|
|
||||||
Q_UNUSED(params)
|
|
||||||
return DeviceManager::DeviceErrorCreationMethodNotSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This will be called when a new device is created. The plugin has the chance to do some setup.
|
|
||||||
Return \l{DeviceManager}{DeviceSetupStatusFailure} if something bad happened during the setup in which case the \a device
|
|
||||||
will be disabled. Return \l{DeviceManager}{DeviceSetupStatusSuccess} if everything went well. If you can't tell yet and
|
|
||||||
need more time to set up the \a device (note: you should never block in this method) you can
|
|
||||||
return \l{DeviceManager}{DeviceSetupStatusAsync}. In that case the \l{DeviceManager} will wait for you to emit
|
|
||||||
\l{DevicePlugin}{deviceSetupFinished} to report the status.
|
|
||||||
*/
|
|
||||||
DeviceManager::DeviceSetupStatus DevicePlugin::setupDevice(Device *device)
|
|
||||||
{
|
|
||||||
Q_UNUSED(device)
|
|
||||||
return DeviceManager::DeviceSetupStatusSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This will be called when a new \a device was added successfully and the device setup is finished.*/
|
|
||||||
void DevicePlugin::postSetupDevice(Device *device)
|
|
||||||
{
|
|
||||||
Q_UNUSED(device)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This will be called when a \a device removed. The plugin has the chance to do some teardown.
|
|
||||||
* The device is still valid during this call, but already removed from the system.
|
|
||||||
* The device will be deleted as soon as this method returns.*/
|
|
||||||
void DevicePlugin::deviceRemoved(Device *device)
|
|
||||||
{
|
|
||||||
Q_UNUSED(device)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This method will be called for \l{Device}{Devices} with the \l{DeviceClass::SetupMethodDisplayPin} right after the paring request
|
|
||||||
* with the given \a pairingTransactionId for the given \a deviceDescriptor.*/
|
|
||||||
DeviceManager::DeviceError DevicePlugin::displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor)
|
|
||||||
{
|
|
||||||
Q_UNUSED(pairingTransactionId)
|
|
||||||
Q_UNUSED(deviceDescriptor)
|
|
||||||
|
|
||||||
qCWarning(dcDeviceManager) << "Plugin does not implement the display pin setup method.";
|
|
||||||
|
|
||||||
return DeviceManager::DeviceErrorNoError;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Confirms the pairing of a \a deviceClassId with the given \a pairingTransactionId and \a params.
|
|
||||||
* Returns \l{DeviceManager::DeviceError}{DeviceError} to inform about the result. The optional paramerter
|
|
||||||
* \a secret contains for example the pin for \l{Device}{Devices} with the setup method \l{DeviceClass::SetupMethodDisplayPin}.*/
|
|
||||||
DeviceManager::DeviceSetupStatus DevicePlugin::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret = QString())
|
|
||||||
{
|
|
||||||
Q_UNUSED(pairingTransactionId)
|
|
||||||
Q_UNUSED(deviceClassId)
|
|
||||||
Q_UNUSED(params)
|
|
||||||
Q_UNUSED(secret)
|
|
||||||
|
|
||||||
qCWarning(dcDeviceManager) << "Plugin does not implement pairing.";
|
|
||||||
return DeviceManager::DeviceSetupStatusFailure;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This will be called to actually execute actions on the hardware. The \{Device} and
|
|
||||||
* the \{Action} are contained in the \a device and \a action parameters.
|
|
||||||
* Return the appropriate \l{DeviceManager::DeviceError}{DeviceError}.
|
|
||||||
*
|
|
||||||
* It is possible to execute actions asynchronously. You never should do anything blocking for
|
|
||||||
* a long time (e.g. wait on a network reply from the internet) but instead return
|
|
||||||
* DeviceManager::DeviceErrorAsync and continue processing in an async manner. Once
|
|
||||||
* you have the reply ready, emit actionExecutionFinished() with the appropriate parameters.
|
|
||||||
*
|
|
||||||
* \sa actionExecutionFinished()
|
|
||||||
*/
|
|
||||||
DeviceManager::DeviceError DevicePlugin::executeAction(Device *device, const Action &action)
|
|
||||||
{
|
|
||||||
Q_UNUSED(device)
|
|
||||||
Q_UNUSED(action)
|
|
||||||
return DeviceManager::DeviceErrorNoError;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! Returns the configuration description of this DevicePlugin as a list of \l{ParamType}{ParamTypes}. */
|
|
||||||
QList<ParamType> DevicePlugin::configurationDescription() const
|
|
||||||
{
|
|
||||||
return m_configurationDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! This will be called when the DeviceManager initializes the plugin and set up the things behind the scenes.
|
|
||||||
When implementing a new plugin, use \l{DevicePlugin::init()} instead in order to do initialisation work. */
|
|
||||||
void DevicePlugin::initPlugin(DeviceManager *deviceManager)
|
|
||||||
{
|
|
||||||
m_deviceManager = deviceManager;
|
|
||||||
|
|
||||||
// parse plugin configuration params
|
|
||||||
if (m_metaData.contains("paramTypes")) {
|
|
||||||
QPair<bool, QList<ParamType> > paramVerification = parseParamTypes(m_metaData.value("paramTypes").toArray());
|
|
||||||
if (paramVerification.first)
|
|
||||||
m_configurationDescription << paramVerification.second;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -892,7 +893,7 @@ DeviceManager *DevicePlugin::deviceManager() const
|
|||||||
QList<Device *> DevicePlugin::myDevices() const
|
QList<Device *> DevicePlugin::myDevices() const
|
||||||
{
|
{
|
||||||
QList<DeviceClassId> myDeviceClassIds;
|
QList<DeviceClassId> myDeviceClassIds;
|
||||||
foreach (const DeviceClass &deviceClass, supportedDevices()) {
|
foreach (const DeviceClass &deviceClass, m_supportedDevices) {
|
||||||
myDeviceClassIds.append(deviceClass.id());
|
myDeviceClassIds.append(deviceClass.id());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -158,6 +158,8 @@ private:
|
|||||||
|
|
||||||
QJsonObject m_metaData;
|
QJsonObject m_metaData;
|
||||||
|
|
||||||
|
mutable QList<DeviceClass> m_supportedDevices;
|
||||||
|
|
||||||
friend class DeviceManager;
|
friend class DeviceManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user