/**************************************************************************** * 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 #endif #include "aqhome/data/storage_readxml.h" #include "aqhome/data/storage_p.h" #include #include #include /* ------------------------------------------------------------------------------------------------ * 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->roomList); } nValue=GWEN_XMLNode_FindNextTag(nValue, AQH_STORAGE_XML_ELEMENTNAME_VALUE, NULL, NULL); } } }