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 "private/datacontainer_p.h"
00022
00023 #include <QVariant>
00024
00025 #include <kdebug.h>
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.isEmpty()) {
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,
00078 Plasma::IntervalAlignment alignment)
00079 {
00080
00081
00082 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00083 bool connected = objIt != d->relayObjects.end();
00084 if (connected) {
00085
00086
00087 SignalRelay *relay = objIt.value();
00088 if (relay) {
00089
00090
00091 if (relay->m_interval == pollingInterval) {
00092
00093
00094 return;
00095 }
00096
00097 if (relay->receiverCount() == 1) {
00098
00099 d->relays.remove(relay->m_interval);
00100 delete relay;
00101 } else {
00102 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00103 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00104
00105 }
00106 } else if (pollingInterval < 1) {
00107
00108
00109
00110
00111 return;
00112 } else {
00113 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00114 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00115 }
00116 } else {
00117 connect(visualization, SIGNAL(destroyed(QObject*)),
00118 this, SLOT(disconnectVisualization(QObject*)));
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
00129
00130
00131 bool immediateUpdate = connected || d->relayObjects.count() > 1;
00132 SignalRelay *relay = d->signalRelay(this, visualization, pollingInterval,
00133 alignment, immediateUpdate);
00134 connect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00135 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00136 }
00137 }
00138
00139 void DataContainer::disconnectVisualization(QObject *visualization)
00140 {
00141 QMap<QObject *, SignalRelay *>::iterator objIt = d->relayObjects.find(visualization);
00142
00143 if (objIt == d->relayObjects.end() || !objIt.value()) {
00144
00145 disconnect(this, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00146 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00147 } else {
00148 SignalRelay *relay = objIt.value();
00149
00150 if (relay->receiverCount() == 1) {
00151 d->relays.remove(relay->m_interval);
00152 delete relay;
00153 } else {
00154 disconnect(relay, SIGNAL(dataUpdated(QString,Plasma::DataEngine::Data)),
00155 visualization, SLOT(dataUpdated(QString,Plasma::DataEngine::Data)));
00156 }
00157 }
00158
00159 d->relayObjects.erase(objIt);
00160 checkUsage();
00161 }
00162
00163 void DataContainer::checkForUpdate()
00164 {
00165
00166 if (d->dirty) {
00167 emit dataUpdated(objectName(), d->data);
00168
00169 foreach (SignalRelay *relay, d->relays) {
00170 relay->checkQueueing();
00171 }
00172
00173 d->dirty = false;
00174 }
00175 }
00176
00177 uint DataContainer::timeSinceLastUpdate() const
00178 {
00179
00180
00181 return d->updateTs.elapsed();
00182 }
00183
00184 void DataContainer::setNeedsUpdate(bool update)
00185 {
00186 d->cached = update;
00187 }
00188
00189 void DataContainer::checkUsage()
00190 {
00191 if (d->relays.count() < 1 &&
00192 receivers(SIGNAL(dataUpdated(QString, Plasma::DataEngine::Data))) < 1) {
00193
00194 emit becameUnused(objectName());
00195 }
00196 }
00197
00198 }
00199
00200 #include "datacontainer.moc"
00201