void DVRServer::disconnectedSlot() { while (!m_visibleCameras.isEmpty()) { DVRCamera *c = m_visibleCameras.takeFirst(); c->setOnline(false); emit cameraRemoved(c); } m_devicesLoaded = false; m_statusAlertMessage.clear(); emit statusAlertMessageChanged(QString()); }
void DVRServer::updateCamerasReply() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) return; qDebug() << "DVRServer: Received cameras list reply"; reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { /* TODO: Handle this well */ qWarning() << "DVRServer: Error from updating cameras:" << reply->errorString(); return; } QByteArray data = reply->readAll(); QXmlStreamReader xml(data); QSet<int> idSet; bool hasDevicesElement = false; bool wasEmpty = m_visibleCameras.isEmpty(); while (xml.readNextStartElement()) { if (xml.name() == QLatin1String("devices")) { hasDevicesElement = true; while (xml.readNext() != QXmlStreamReader::Invalid) { if (xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == QLatin1String("devices")) break; else if (xml.tokenType() != QXmlStreamReader::StartElement) continue; if (xml.name() == QLatin1String("device")) { bool ok = false; QString idv = xml.attributes().value(QLatin1String("id")).toString(); if (idv.isNull()) continue; int deviceId = (int)idv.toUInt(&ok); if (!ok) { xml.raiseError(QLatin1String("Invalid device ID")); continue; } idSet.insert(deviceId); DVRCamera *camera = getCamera(deviceId); if (camera) { camera->setOnline(true); DVRCameraXMLReader xmlReader; if (!xmlReader.readCamera(camera, xml)) { if (!xml.hasError()) xml.raiseError(QLatin1String("Device parsing failed")); continue; } else { DVRCameraSettingsWriter settingsWriter; settingsWriter.writeCamera(camera); } } if (!m_visibleCameras.contains(camera)) { m_visibleCameras.append(camera); emit cameraAdded(camera); } } } break; } else xml.skipCurrentElement(); } if (!hasDevicesElement) xml.raiseError(QLatin1String("Invalid format: no devices element")); if (xml.hasError()) { qWarning() << "DVRServer: Error while parsing camera list:" << xml.errorString(); return; } for (int i = 0; i < m_visibleCameras.size(); ++i) { if (!idSet.contains(m_visibleCameras[i]->data().id())) { DVRCamera *c = m_visibleCameras[i]; m_visibleCameras.removeAt(i); m_camerasMap.remove(c->data().id()); qDebug("DVRServer: camera %d removed", c->data().id()); emit cameraRemoved(c); --i; delete c; } } if (!m_devicesLoaded || (wasEmpty && !m_visibleCameras.isEmpty())) { m_devicesLoaded = true; emit devicesReady(); } }