20#include "private/datacontainer_p.h"
21#include "private/storage_p.h"
30DataContainer::DataContainer(
QObject *parent)
32 d(new DataContainerPrivate(this))
36DataContainer::~DataContainer()
46void DataContainer::setData(
const QString &key,
const QVariant &value)
48 if (!value.isValid()) {
51 d->data.insert(key, value);
55 d->updateTimer.start();
62 d->storageTimer.start(180000,
this);
68void DataContainer::removeAllData()
70 if (d->data.isEmpty()) {
77 d->updateTimer.start();
80bool DataContainer::visualizationIsConnected(
QObject *visualization)
const
82 return d->relayObjects.contains(visualization);
85void DataContainer::connectVisualization(
QObject *visualization, uint pollingInterval,
90 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
91 bool connected = objIt != d->relayObjects.end();
99 if (relay->m_interval == pollingInterval) {
105 if (relay->receiverCount() == 1) {
107 d->relays.remove(relay->m_interval);
114 }
else if (pollingInterval < 1) {
125 connect(visualization, SIGNAL(destroyed(
QObject*)),
129 if (pollingInterval < 1) {
131 d->relayObjects[visualization] = 0;
139 bool immediateUpdate = connected || d->relayObjects.count() > 1;
140 SignalRelay *relay = d->signalRelay(
this, visualization, pollingInterval,
141 alignment, immediateUpdate);
147void DataContainer::setStorageEnabled(
bool store)
149 QTime time = QTime::currentTime();
150 qsrand((uint)time.msec());
151 d->enableStorage = store;
153 QTimer::singleShot(qrand() % (2000 + 1) ,
this, SLOT(retrieve()));
157bool DataContainer::isStorageEnabled()
const
159 return d->enableStorage;
162bool DataContainer::needsToBeStored()
const
167void DataContainer::setNeedsToBeStored(
bool store)
169 d->isStored = !store;
178 o =
dynamic_cast<QObject *
> (o->parent());
187void DataContainerPrivate::store()
189 if (!q->needsToBeStored() || !q->isStorageEnabled()) {
193 DataEngine* de = q->getDataEngine();
198 q->setNeedsToBeStored(
false);
201 storage =
new Storage(q);
204 KConfigGroup op = storage->operationDescription(
"save");
205 op.writeEntry(
"group", q->objectName());
206 StorageJob *job =
static_cast<StorageJob *
>(storage->startOperationCall(op));
209 QObject::connect(job, SIGNAL(finished(
KJob*)), q, SLOT(storeJobFinished(
KJob*)));
212void DataContainerPrivate::storeJobFinished(
KJob* )
215 if (storageCount < 1) {
216 storage->deleteLater();
221void DataContainerPrivate::retrieve()
223 DataEngine* de = q->getDataEngine();
229 storage =
new Storage(q);
232 KConfigGroup retrieveGroup = storage->operationDescription(
"retrieve");
233 retrieveGroup.writeEntry(
"group", q->objectName());
234 ServiceJob* retrieveJob = storage->startOperationCall(retrieveGroup);
235 QObject::connect(retrieveJob, SIGNAL(result(
KJob*)), q,
236 SLOT(populateFromStoredData(
KJob*)));
239void DataContainerPrivate::populateFromStoredData(
KJob *job)
245 StorageJob *ret =
dynamic_cast<StorageJob*
>(job);
252 if (data.isEmpty() && !ret->data().isEmpty()) {
255 q->forceImmediateUpdate();
258 KConfigGroup expireGroup = storage->operationDescription(
"expire");
260 expireGroup.writeEntry(
"age", 345600);
261 storage->startOperationCall(expireGroup);
264void DataContainer::disconnectVisualization(
QObject *visualization)
266 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
267 disconnect(visualization, SIGNAL(destroyed(
QObject*)),
270 if (objIt == d->relayObjects.end() || !objIt.value()) {
277 if (relay->receiverCount() == 1) {
278 d->relays.remove(relay->m_interval);
286 d->relayObjects.erase(objIt);
290void DataContainer::checkForUpdate()
297 relay->checkQueueing();
304void DataContainer::forceImmediateUpdate()
312 relay->forceImmediateUpdate();
316uint DataContainer::timeSinceLastUpdate()
const
318 return d->updateTimer.elapsed();
321void DataContainer::setNeedsUpdate(
bool update)
326void DataContainer::checkUsage()
328 if (!d->checkUsageTimer.isActive()) {
329 d->checkUsageTimer.start(10,
this);
333void DataContainer::timerEvent(QTimerEvent * event)
335 if (event->timerId() == d->checkUsageTimer.timerId()) {
336 if (d->relays.count() < 1 &&
339 kDebug() << objectName() <<
"is unused";
342 d->checkUsageTimer.stop();
343 }
else if (event->timerId() == d->storageTimer.timerId()) {
345 d->storageTimer.stop();
351#include "datacontainer.moc"
void setNeedsToBeStored(bool store)
sets that the data container needs to be stored or not.
void becameUnused(const QString &source)
Emitted when the last visualization is disconnected.
void checkUsage()
Check if the DataContainer is still in use.
bool isStorageEnabled() const
void dataUpdated(const QString &source, const Plasma::DataEngine::Data &data)
Emitted when the data has been updated, allowing visualizations to reflect the new data.
bool needsToBeStored() const
void disconnectVisualization(QObject *visualization)
Disconnects an object from this DataContainer.
Data provider for plasmoids (Plasma plugins)
QHash< QString, QVariant > Data
Namespace for everything in libplasma.
IntervalAlignment
Possible timing alignments.