187 lines
5.0 KiB
C
187 lines
5.0 KiB
C
/****************************************************************************
|
|
* This file is part of the project Gwenhywfar.
|
|
* Gwenhywfar (c) by 2023 Martin Preuss, all rights reserved.
|
|
*
|
|
* The license for this file can be found in the file COPYING which you
|
|
* should have received along with this file.
|
|
****************************************************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "aqhome/data/storage_readxml.h"
|
|
#include "aqhome/data/storage_p.h"
|
|
|
|
#include <gwenhywfar/debug.h>
|
|
#include <gwenhywfar/xml.h>
|
|
#include <gwenhywfar/directory.h>
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* forward declarations
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
static void _readLastIdsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode);
|
|
static void _readRoomsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode);
|
|
static void _readDevicesFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode);
|
|
static void _readTopicsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode);
|
|
static void _readValuesFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode);
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* implementations
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
int AQH_Storage_ReadStateFile(AQH_STORAGE *sto, const char *sFilename)
|
|
{
|
|
GWEN_XMLNODE *rootNode;
|
|
int rv;
|
|
|
|
rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, NULL);
|
|
rv=GWEN_XML_ReadFile(rootNode, sFilename, GWEN_XML_FLAGS_DEFAULT);
|
|
if (rv<0) {
|
|
DBG_ERROR(AQH_LOGDOMAIN, "Error reading XML file \"%s\": %d", sFilename, rv);
|
|
GWEN_XMLNode_free(rootNode);
|
|
return rv;
|
|
}
|
|
|
|
_readLastIdsFromXml(sto, rootNode);
|
|
_readRoomsFromXml(sto, rootNode);
|
|
_readDevicesFromXml(sto, rootNode);
|
|
_readTopicsFromXml(sto, rootNode);
|
|
_readValuesFromXml(sto, rootNode);
|
|
|
|
GWEN_XMLNode_free(rootNode);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void _readLastIdsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode)
|
|
{
|
|
GWEN_XMLNODE *nLastIds;
|
|
|
|
nLastIds=GWEN_XMLNode_FindFirstTag(rootNode, AQH_STORAGE_XML_ELEMENTNAME_LASTIDS, NULL, NULL);
|
|
if (nLastIds) {
|
|
sto->lastRoomId=GWEN_XMLNode_GetIntValue(nLastIds, "lastRoomId", 0);
|
|
sto->lastDeviceId=GWEN_XMLNode_GetIntValue(nLastIds, "lastDeviceId", 0);
|
|
sto->lastTopicId=GWEN_XMLNode_GetIntValue(nLastIds, "lastTopicId", 0);
|
|
sto->lastValueId=GWEN_XMLNode_GetIntValue(nLastIds, "lastValueId", 0);
|
|
}
|
|
else {
|
|
sto->lastRoomId=0;
|
|
sto->lastDeviceId=0;
|
|
sto->lastTopicId=0;
|
|
sto->lastValueId=0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _readRoomsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode)
|
|
{
|
|
GWEN_XMLNODE *nRooms;
|
|
|
|
nRooms=GWEN_XMLNode_FindFirstTag(rootNode, AQH_STORAGE_XML_ELEMENTNAME_ROOMS, NULL, NULL);
|
|
if (nRooms) {
|
|
GWEN_XMLNODE *nRoom;
|
|
|
|
nRoom=GWEN_XMLNode_FindFirstTag(nRooms, AQH_STORAGE_XML_ELEMENTNAME_ROOM, NULL, NULL);
|
|
while(nRoom) {
|
|
AQH_ROOM *r;
|
|
|
|
r=AQH_Room_fromXml(nRoom);
|
|
if (r) {
|
|
AQH_Room_List_Add(r, sto->roomList);
|
|
}
|
|
nRoom=GWEN_XMLNode_FindNextTag(nRoom, AQH_STORAGE_XML_ELEMENTNAME_ROOM, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _readDevicesFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode)
|
|
{
|
|
GWEN_XMLNODE *nDevices;
|
|
|
|
nDevices=GWEN_XMLNode_FindFirstTag(rootNode, AQH_STORAGE_XML_ELEMENTNAME_DEVICES, NULL, NULL);
|
|
if (nDevices) {
|
|
GWEN_XMLNODE *nDevice;
|
|
|
|
nDevice=GWEN_XMLNode_FindFirstTag(nDevices, AQH_STORAGE_XML_ELEMENTNAME_DEVICE, NULL, NULL);
|
|
while(nDevice) {
|
|
AQH_DEVICE *device;
|
|
|
|
device=AQH_Device_fromXml(nDevice);
|
|
if (device) {
|
|
AQH_Device_List_Add(device, sto->deviceList);
|
|
}
|
|
nDevice=GWEN_XMLNode_FindNextTag(nDevice, AQH_STORAGE_XML_ELEMENTNAME_DEVICE, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _readTopicsFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode)
|
|
{
|
|
GWEN_XMLNODE *nTopics;
|
|
|
|
nTopics=GWEN_XMLNode_FindFirstTag(rootNode, AQH_STORAGE_XML_ELEMENTNAME_TOPICS, NULL, NULL);
|
|
if (nTopics) {
|
|
GWEN_XMLNODE *nTopic;
|
|
|
|
nTopic=GWEN_XMLNode_FindFirstTag(nTopics, AQH_STORAGE_XML_ELEMENTNAME_TOPIC, NULL, NULL);
|
|
while(nTopic) {
|
|
AQH_MQTT_TOPIC *topic;
|
|
|
|
topic=AQH_MqttTopic_fromXml(nTopic);
|
|
if (topic) {
|
|
AQH_MqttTopic_List_Add(topic, sto->mqttTopicList);
|
|
}
|
|
nTopic=GWEN_XMLNode_FindNextTag(nTopic, AQH_STORAGE_XML_ELEMENTNAME_TOPIC, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _readValuesFromXml(AQH_STORAGE *sto, GWEN_XMLNODE *rootNode)
|
|
{
|
|
GWEN_XMLNODE *nValues;
|
|
|
|
nValues=GWEN_XMLNode_FindFirstTag(rootNode, AQH_STORAGE_XML_ELEMENTNAME_VALUES, NULL, NULL);
|
|
if (nValues) {
|
|
GWEN_XMLNODE *nValue;
|
|
|
|
nValue=GWEN_XMLNode_FindFirstTag(nValues, AQH_STORAGE_XML_ELEMENTNAME_VALUE, NULL, NULL);
|
|
while(nValue) {
|
|
AQH_VALUE *value;
|
|
|
|
value=AQH_Value_fromXml(nValue);
|
|
if (value) {
|
|
AQH_Value_List_Add(value, sto->valueList);
|
|
}
|
|
nValue=GWEN_XMLNode_FindNextTag(nValue, AQH_STORAGE_XML_ELEMENTNAME_VALUE, NULL, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|