00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "datacontainer.h"
00021 #include "datacontainer_p.h"
00022
00023 #include <QVariant>
00024
00025 #include <KDebug>
00026
00027 #include "plasma.h"
00028
00029 namespace Plasma
00030 {
00031
00032 DataContainer::DataContainer(QObject* parent)
00033 : QObject(parent),
00034 d(new DataContainerPrivate())
00035 {
00036 }
00037
00038 DataContainer::~DataContainer()
00039 {
00040 delete d;
00041 }
00042
00043 const DataEngine::Data DataContainer::data() const
00044 {
00045 return d->data;
00046 }
00047
00048 void DataContainer::setData(const QString& key, const QVariant& value)
00049 {
00050 if (value.isNull() || !value.isValid()) {
00051 d->data.remove(key);
00052 } else {
00053 d->data[key] = value;
00054 }
00055
00056 d->dirty = true;
00057 d->updateTs.start();
00058 }
00059
00060 void DataContainer::removeAllData()
00061 {
00062 if (d->data.count() < 1) {
00063
00064 return;
00065 }
00066
00067 d->data.clear();
00068 d->dirty = true;
00069 d->updateTs.start();
00070 }
00071
00072 bool DataContainer::visualizationIsConnected(QObject *visualization) const
00073 {
00074 return d->relayObjects.contains(visualization);
00075 }
00076
00077 void DataContainer::connectVisualization(QObject* visualization, uint pollingInterval, Plasma::IntervalAlignment alignment)
00078 {
00079
00080
00081 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00082 bool connected = objIt != d->relayObjects.end();
00083 if (connected) {
00084
00085
00086 SignalRelay *relay = objIt.value();
00087 if (relay) {
00088
00089
00090 if (relay->m_interval == pollingInterval) {
00091
00092
00093 return;
00094 }
00095
00096 if (relay->receiverCount() == 1) {
00097
00098 d->relays.remove(relay->m_interval);
00099 delete relay;
00100 } else {
00101 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00102 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00103
00104 }
00105 } else if (pollingInterval < 1) {
00106
00107
00108
00109
00110 return;
00111 } else {
00112 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00113 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00114 }
00115 } else {
00116 connect(visualization, SIGNAL(destroyed(QObject*)),
00117 this, SLOT(disconnectVisualization(QObject*)));
00118 }
00119
00120
00121 if (pollingInterval < 1) {
00122
00123 d->relayObjects[visualization] = 0;
00124 connect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00125 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00126 } else {
00127
00128 SignalRelay *relay = d->signalRelay(this, visualization, pollingInterval, alignment);
00129 connect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00130 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00131 }
00132 }
00133
00134 void DataContainer::disconnectVisualization(QObject* visualization)
00135 {
00136 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00137
00138 if (objIt == d->relayObjects.end() || !objIt.value()) {
00139
00140 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00141 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00142 } else {
00143 SignalRelay *relay = objIt.value();
00144
00145 if (relay->receiverCount() == 1) {
00146 d->relays.remove(relay->m_interval);
00147 delete relay;
00148 } else {
00149 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00150 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00151 }
00152 }
00153
00154 d->relayObjects.erase(objIt);
00155 checkUsage();
00156 }
00157
00158 void DataContainer::checkForUpdate()
00159 {
00160 if (d->dirty) {
00161 emit dataUpdated(objectName(), d->data);
00162
00163 foreach (SignalRelay* relay, d->relays) {
00164 relay->checkQueueing();
00165 }
00166
00167 d->dirty = false;
00168 }
00169 }
00170
00171 uint DataContainer::timeSinceLastUpdate() const
00172 {
00173
00174
00175 return d->updateTs.elapsed();
00176 }
00177
00178 void DataContainer::setNeedsUpdate(bool update)
00179 {
00180 d->cached = update;
00181 }
00182
00183 void DataContainer::checkUsage()
00184 {
00185 if (d->relays.count() < 1 &&
00186 receivers(SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data))) < 1) {
00187
00188 emit becameUnused(objectName());
00189 }
00190 }
00191
00192 }
00193
00194 #include "datacontainer.moc"
00195 #include "datacontainer_p.moc"
00196