diff --git a/apps/aqhome-data/0BUILD b/apps/aqhome-data/0BUILD index 97fde3b..b690de8 100644 --- a/apps/aqhome-data/0BUILD +++ b/apps/aqhome-data/0BUILD @@ -35,11 +35,6 @@ - aqhome_data.h - aqhome_data_p.h - fini.h - init.h - loop.h server.h server_p.h s_connect.h @@ -51,33 +46,11 @@ s_setdata.h s_getdatapoints.h s_moddevice.h - c_connect.h - c_updatedata.h - c_getvalues.h - c_getdevices.h - c_getdatapoints.h - c_setdata.h - c_addvalue.h - c_annvalue.h - c_moddevice.h $(local/typefiles) - aqhome_data.c - fini.c - init.c - loop.c - c_connect.c - c_updatedata.c - c_getvalues.c - c_getdevices.c - c_getdatapoints.c - c_setdata.c - c_addvalue.c - c_annvalue.c - c_moddevice.c server.c s_connect.c s_getdevices.c diff --git a/apps/aqhome-data/aqhome_data.c b/apps/aqhome-data/aqhome_data.c deleted file mode 100644 index 4223084..0000000 --- a/apps/aqhome-data/aqhome_data.c +++ /dev/null @@ -1,152 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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_p.h" -#include "aqhome/ipc/endpoint_ipc.h" - -#include -#include - - - - - -AQHOME_DATA *AqHomeData_new() -{ - AQHOME_DATA *aqh; - - GWEN_NEW_OBJECT(AQHOME_DATA, aqh); - aqh->storageMutex=GWEN_Mutex_new(); - aqh->requestTree=GWEN_MsgRequest_new(); - - return aqh; -} - - - -void AqHomeData_free(AQHOME_DATA *aqh) -{ - if (aqh) { - GWEN_Mutex_free(aqh->storageMutex); - - GWEN_MsgRequest_free(aqh->requestTree); - GWEN_MsgEndpoint_free(aqh->ipcdEndpoint); - GWEN_DB_Group_free(aqh->dbArgs); - AQH_Storage_free(aqh->storage); - free(aqh->pidFile); - - GWEN_FREE_OBJECT(aqh); - } -} - - - -GWEN_MSG_ENDPOINT *AqHomeData_GetIpcdEndpoint(const AQHOME_DATA *aqh) -{ - return aqh?(aqh->ipcdEndpoint):NULL; -} - - - -GWEN_DB_NODE *AqHomeData_GetDbArgs(const AQHOME_DATA *aqh) -{ - return aqh?(aqh->dbArgs):NULL; -} - - - -AQH_STORAGE *AqHomeData_GetStorage(const AQHOME_DATA *aqh) -{ - return aqh?(aqh->storage):NULL; -} - - - -GWEN_MSG_REQUEST *AqHomeData_GetRequestTree(const AQHOME_DATA *aqh) -{ - return aqh?aqh->requestTree:NULL; -} - - - -void AqHomeData_AddRequestToTree(AQHOME_DATA *aqh, GWEN_MSG_REQUEST *rq) -{ - if (aqh && rq) - GWEN_MsgRequest_Tree2_AddChild(aqh->requestTree, rq); -} - - - -const char *AqHomeData_GetPidFile(const AQHOME_DATA *aqh) -{ - return aqh?aqh->pidFile:NULL; -} - - - -int AqHomeData_GetTimeout(const AQHOME_DATA *aqh) -{ - return aqh?aqh->timeout:0; -} - - - -int AqHomeData_LockStorage(AQHOME_DATA *aqh) -{ - int rv; - - rv=GWEN_Mutex_Lock(aqh->storageMutex); - if (rv<0) { - DBG_ERROR(AQH_LOGDOMAIN, "Error obtaining lock on storage mutex"); - return rv; - } - return rv; -} - - - -int AqHomeData_UnlockStorage(AQHOME_DATA *aqh) -{ - int rv; - - rv=GWEN_Mutex_Unlock(aqh->storageMutex); - if (rv<0) { - DBG_ERROR(AQH_LOGDOMAIN, "Error releasing lock on storage mutex"); - return rv; - } - return rv; -} - - - -GWEN_MSG_ENDPOINT *AqHomeData_GetIpcEndpointByServiceName(const AQHOME_DATA *aqh, const char *serviceName) -{ - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - const char *s; - - s=AQH_IpcEndpoint_GetServiceName(ep); - if (s && *s && strcasecmp(s, serviceName)==0) - return ep; - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - - return NULL; -} - - - - - diff --git a/apps/aqhome-data/aqhome_data.h b/apps/aqhome-data/aqhome_data.h deleted file mode 100644 index 17503f3..0000000 --- a/apps/aqhome-data/aqhome_data.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_H -#define AQHOME_DATA_H - - -#include "aqhome/data/storage.h" - -#include -#include - - - -typedef struct AQHOME_DATA AQHOME_DATA; - - -AQHOME_DATA *AqHomeData_new(); -void AqHomeData_free(AQHOME_DATA *aqh); - -GWEN_MSG_ENDPOINT *AqHomeData_GetIpcdEndpoint(const AQHOME_DATA *aqh); - -GWEN_MSG_ENDPOINT *AqHomeData_GetIpcEndpointByServiceName(const AQHOME_DATA *aqh, const char *serviceName); - -GWEN_DB_NODE *AqHomeData_GetDbArgs(const AQHOME_DATA *aqh); - -AQH_STORAGE *AqHomeData_GetStorage(const AQHOME_DATA *aqh); - -const char *AqHomeData_GetPidFile(const AQHOME_DATA *aqh); - -int AqHomeData_GetTimeout(const AQHOME_DATA *aqh); - -int AqHomeData_LockStorage(AQHOME_DATA *aqh); -int AqHomeData_UnlockStorage(AQHOME_DATA *aqh); - -GWEN_MSG_REQUEST *AqHomeData_GetRequestTree(const AQHOME_DATA *aqh); -void AqHomeData_AddRequestToTree(AQHOME_DATA *aqh, GWEN_MSG_REQUEST *rq); - - - -#endif - diff --git a/apps/aqhome-data/aqhome_data_p.h b/apps/aqhome-data/aqhome_data_p.h deleted file mode 100644 index 65a2dc5..0000000 --- a/apps/aqhome-data/aqhome_data_p.h +++ /dev/null @@ -1,44 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_P_H -#define AQHOME_DATA_P_H - - -#include "./aqhome_data.h" - -#include - - -#define AQHOME_DATA_DEFAULT_PIDFILE "/var/run/aqhome-data.pid" -#define AQHOME_DATA_DEFAULT_DATADIR "/var/lib/aqhome-data/data" -#define AQHOME_DATA_DEFAULT_IPC_PORT 45456 - -#define AQHOME_DATA_STATEFILENAME "statefile" - - - -struct AQHOME_DATA { - GWEN_MSG_ENDPOINT *ipcdEndpoint; - - GWEN_DB_NODE *dbArgs; - - AQH_STORAGE *storage; - - char *pidFile; - - int timeout; /* timeout for run e.g. inside valgrind */ - - GWEN_MUTEX *storageMutex; - - GWEN_MSG_REQUEST *requestTree; -}; - - -#endif - diff --git a/apps/aqhome-data/c_addvalue.c b/apps/aqhome-data/c_addvalue.c deleted file mode 100644 index 67d1fbe..0000000 --- a/apps/aqhome-data/c_addvalue.c +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_addvalue.h" -#include "./aqhome_data_p.h" -#include "./loop.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/data/msg_data_values.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleAddValue(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - AQH_VALUE *recvdValue; - - AQH_ValuesDataIpcMsg_Parse(msg, 0); - recvdValue=AQH_ValuesDataIpcMsg_ReadFirstValue(msg); - if (recvdValue) { - AQH_VALUE *value; - - value=AqHomeData_GetOrCreateValueForDriverWithTemplate(aqh, ep, recvdValue); - if (value==NULL) - resultCode=AQH_MSG_IPC_ERROR_PERMS; - AQH_Value_free(recvdValue); - } - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - diff --git a/apps/aqhome-data/c_addvalue.h b/apps/aqhome-data/c_addvalue.h deleted file mode 100644 index 8220873..0000000 --- a/apps/aqhome-data/c_addvalue.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_ADDVALUE_H -#define AQHOME_DATA_C_ADDVALUE_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleAddValue(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_annvalue.c b/apps/aqhome-data/c_annvalue.c deleted file mode 100644 index 48d9519..0000000 --- a/apps/aqhome-data/c_annvalue.c +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (c) by 2024 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 "./c_annvalue.h" -#include "./aqhome_data_p.h" -#include "./loop.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/data/msg_data_values.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleAnnounceValue(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - AQH_VALUE *recvdValue; - - AQH_ValuesDataIpcMsg_Parse(msg, 0); - recvdValue=AQH_ValuesDataIpcMsg_ReadFirstValue(msg); - if (recvdValue) { - AQH_VALUE *value; - - value=AqHomeData_GetOrCreateValueForDriverWithTemplate(aqh, ep, recvdValue); - if (value==NULL) { - DBG_ERROR(AQH_LOGDOMAIN, "Could not create announced value"); - } - AQH_Value_free(recvdValue); - } -} - - - diff --git a/apps/aqhome-data/c_annvalue.h b/apps/aqhome-data/c_annvalue.h deleted file mode 100644 index b19d753..0000000 --- a/apps/aqhome-data/c_annvalue.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (c) by 2024 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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_ANNVALUE_H -#define AQHOME_DATA_C_ANNVALUE_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleAnnounceValue(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_connect.c b/apps/aqhome-data/c_connect.c deleted file mode 100644 index 3eb1261..0000000 --- a/apps/aqhome-data/c_connect.c +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_connect.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/data/msg_data_connect.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleConnect(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - char *clientId=NULL; - char *userId=NULL; - char *passw=NULL; - uint32_t flags; - - AQH_ConnectDataIpcMsg_Parse(msg, 0); - clientId=AQH_Tag16IpcMsg_GetTagDataAsNewString(msg, AQH_MSGDATA_CONNECT_TAGS_CLIENTID, NULL); - userId=AQH_Tag16IpcMsg_GetTagDataAsNewString(msg, AQH_MSGDATA_CONNECT_TAGS_USERID, NULL); - flags=AQH_Tag16IpcMsg_GetTagDataAsUint32(msg, AQH_MSGDATA_CONNECT_TAGS_FLAGS, 0); - passw=AQH_Tag16IpcMsg_GetTagDataAsNewString(msg, AQH_MSGDATA_CONNECT_TAGS_PASSWORD, NULL); - - if (clientId) - AQH_IpcEndpoint_SetServiceName(ep, clientId); - if (userId) - AQH_IpcEndpoint_SetUserName(ep, userId); - - if (flags & AQH_MSGDATA_CONNECT_FLAGS_WANTUPDATES) - GWEN_MsgEndpoint_AddFlags(ep, AQH_IPCENDPOINT_FLAGS_WANTUPDATES); - - /* TODO: add user management, for now we allow all */ - AQH_IpcEndpoint_SetPermissions(ep, - AQH_IPCENDPOINT_PERMS_LISTVALUES | - AQH_IPCENDPOINT_PERMS_READVALUE | - AQH_IPCENDPOINT_PERMS_ADDVALUE | - AQH_IPCENDPOINT_PERMS_LISTDATA | - AQH_IPCENDPOINT_PERMS_READDATA | - AQH_IPCENDPOINT_PERMS_ADDDATA | - AQH_IPCENDPOINT_PERMS_LISTDEVICES | - AQH_IPCENDPOINT_PERMS_READDEVICE | - AQH_IPCENDPOINT_PERMS_ADDDEVICE | - AQH_IPCENDPOINT_PERMS_MODDEVICE); - free(passw); - free(userId); - free(clientId); - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - diff --git a/apps/aqhome-data/c_connect.h b/apps/aqhome-data/c_connect.h deleted file mode 100644 index c6a3792..0000000 --- a/apps/aqhome-data/c_connect.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_CONNECT_H -#define AQHOME_DATA_C_CONNECT_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleConnect(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_getdatapoints.c b/apps/aqhome-data/c_getdatapoints.c deleted file mode 100644 index ebd8912..0000000 --- a/apps/aqhome-data/c_getdatapoints.c +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_getdatapoints.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_multidata.h" -#include "aqhome/ipc/data/msg_data_getdata.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define AQHOMEDATA_HANDLEGETDATAPOINTS_MAXTABLEENTRIES 2048 -#define AQHOMEDATA_HANDLEGETDATAPOINTS_MAXDATAPOINTS 1024 - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _getAndSendDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, - const AQH_VALUE *value, - uint64_t tsBegin, uint64_t tsEnd, uint64_t num, uint32_t refMsgId); -static int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, - uint32_t refMsgId); -static int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num, uint32_t refMsgId); -static void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr, - uint32_t refMsgId); -static void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint32_t refMsgId); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomeData_HandleGetDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - - if (AQH_IpcEndpoint_GetPermissions(ep) & AQH_IPCENDPOINT_PERMS_READDATA) { - AQH_VALUE *value; - char *valueName; - uint64_t tsBegin; - uint64_t tsEnd; - uint64_t numRequested; - - AQH_GetDataDataIpcMsg_Parse(recvdMsg, 0); - valueName=AQH_Tag16IpcMsg_GetTagDataAsNewString(recvdMsg, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); - tsBegin=AQH_Tag16IpcMsg_GetTagDataAsUint64(recvdMsg, AQH_MSGDATA_GETDATA_TAGS_BEGIN, 0); - tsEnd=AQH_Tag16IpcMsg_GetTagDataAsUint64(recvdMsg, AQH_MSGDATA_GETDATA_TAGS_END, 0); - numRequested=AQH_Tag16IpcMsg_GetTagDataAsUint64(recvdMsg, AQH_MSGDATA_GETDATA_TAGS_NUM, 0); - - value=AQH_Storage_GetValueByNameForSystem(aqh->storage, valueName); - if (value) { - resultCode=_getAndSendDataPoints(aqh, ep, value, tsBegin, tsEnd, numRequested, GWEN_IpcMsg_GetMsgId(recvdMsg)); - if (resultCode==AQH_MSG_IPC_SUCCESS) - return; - } - else { - DBG_INFO(NULL, "Value \"%s\" does not exist", valueName); - resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; - } - free(valueName); - } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); - resultCode=AQH_MSG_IPC_ERROR_PERMS; - } - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - -int _getAndSendDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, uint64_t num, - uint32_t refMsgId) -{ - if (num==0) - return _getAndSendDataPointsNoNum(aqh, ep, value, tsBegin, tsEnd, refMsgId); - else if (num==1) { - _getAndSendLastDatapoint(aqh, ep, value, refMsgId); - return AQH_MSG_IPC_SUCCESS; - } - else - return _getAndSendDataPointsWithNum(aqh, ep, value, num, refMsgId); -} - - - -int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, - uint32_t refMsgId) -{ - uint64_t valueId; - uint64_t *tablePtr; - - valueId=AQH_Value_GetId(value); - tablePtr=AQH_Storage_GetDataPoints(aqh->storage, valueId, tsBegin, tsEnd, AQHOMEDATA_HANDLEGETDATAPOINTS_MAXTABLEENTRIES); - if (tablePtr) { - _sendDataPointsResponse(aqh, ep, value, tablePtr, refMsgId); - free(tablePtr); - return AQH_MSG_IPC_SUCCESS; - } - else { - DBG_INFO(NULL, "No matching datapoints for value \"%s\"", AQH_Value_GetNameForSystem(value)); - return AQH_MSG_IPC_ERROR_NODATA; - } -} - - - -int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num, uint32_t refMsgId) -{ - uint64_t valueId; - uint64_t *tablePtr; - - if (num>AQHOMEDATA_HANDLEGETDATAPOINTS_MAXDATAPOINTS) - num=AQHOMEDATA_HANDLEGETDATAPOINTS_MAXDATAPOINTS; - valueId=AQH_Value_GetId(value); - tablePtr=AQH_Storage_GetLastNDataPoints(aqh->storage, valueId, num); - if (tablePtr) { - _sendDataPointsResponse(aqh, ep, value, tablePtr, refMsgId); - free(tablePtr); - return AQH_MSG_IPC_SUCCESS; - } - else { - DBG_INFO(NULL, "No matching datapoints for value \"%s\"", AQH_Value_GetNameForSystem(value)); - return AQH_MSG_IPC_ERROR_NODATA; - } -} - - - -void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr, - uint32_t refMsgId) -{ - int numTableEntries; - int numDataPoints; - GWEN_MSG *outMsg; - - numTableEntries=(int)(tablePtr[0]); - numDataPoints=numTableEntries/2; - outMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, - value, &(tablePtr[1]), numDataPoints); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - -void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint32_t refMsgId) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - int rv; - uint64_t timestamp=0; - double data=0.0; - - rv=AQH_Storage_GetLastDataPoint(aqh->storage, AQH_Value_GetId(value), ×tamp, &data); - if (rv<0) { - switch(rv) { - case GWEN_ERROR_INVALID: resultCode=AQH_MSG_IPC_ERROR_INVALID; break; - case GWEN_ERROR_NO_DATA: resultCode=AQH_MSG_IPC_ERROR_NODATA; break; - default: resultCode=AQH_MSG_IPC_ERROR_GENERIC; break; - } - } - else { - outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, - value, timestamp, data); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); - return; - } - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - - - - diff --git a/apps/aqhome-data/c_getdatapoints.h b/apps/aqhome-data/c_getdatapoints.h deleted file mode 100644 index 3add821..0000000 --- a/apps/aqhome-data/c_getdatapoints.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_GETDATAPOINTS_H -#define AQHOME_DATA_C_GETDATAPOINTS_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleGetDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_getdevices.c b/apps/aqhome-data/c_getdevices.c deleted file mode 100644 index 8b8ba69..0000000 --- a/apps/aqhome-data/c_getdevices.c +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_getdevices.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_devices.h" -#include "aqhome/ipc/msg_ipc_result.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define AQHOMEDATA_DEVICESPERMSG 10 - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags, uint32_t refMsgId); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleGetDevices(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - const AQH_DEVICE_LIST *origDeviceList; - - DBG_INFO(NULL, "HandleGetDevices"); - origDeviceList=AQH_Storage_GetDeviceList(aqh->storage); - if (origDeviceList) { - DBG_INFO(NULL, "Have a list of %d devices", AQH_Device_List_GetCount(origDeviceList)); - if (AQH_Device_List_GetCount(origDeviceList)=AQHOMEDATA_DEVICESPERMSG) { - DBG_INFO(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(aqh, ep, tmpDeviceList, next?0:AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); - AQH_Device_List_Clear(tmpDeviceList); - } - v=next; - } - if (AQH_Device_List_GetCount(tmpDeviceList)) { - DBG_INFO(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(aqh, ep, tmpDeviceList, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); /* send remaining */ - } - AQH_Device_List_free(tmpDeviceList); - } - } - else { - /* empty list */ - _sendDeviceList(aqh, ep, NULL, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); - } -} - - - -void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags, uint32_t refMsgId) -{ - GWEN_MSG *msg; - - msg=AQH_DevicesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDEVICES_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, - flags, vl); - GWEN_MsgEndpoint_AddSendMessage(ep, msg); -} - - - diff --git a/apps/aqhome-data/c_getdevices.h b/apps/aqhome-data/c_getdevices.h deleted file mode 100644 index 5d1dc01..0000000 --- a/apps/aqhome-data/c_getdevices.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_GETDEVICES_H -#define AQHOME_DATA_C_GETDEVICES_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleGetDevices(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_getlastdatapoint.c b/apps/aqhome-data/c_getlastdatapoint.c deleted file mode 100644 index 33aac85..0000000 --- a/apps/aqhome-data/c_getlastdatapoint.c +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_getlastdatapoint.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_getdata.h" -#include "aqhome/ipc/data/msg_data_multidata.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomeData_HandleGetLastDataPoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - - if (AQH_IpcEndpoint_GetPermissions(ep) & AQH_IPCENDPOINT_PERMS_READDATA) { - char *valueName; - - AQH_GetDataDataIpcMsg_Parse(recvdMsg, 0); - valueName=AQH_Tag16IpcMsg_GetTagDataAsNewString(recvdMsg, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); - if (valueName && *valueName) { - const AQH_VALUE *storedValue; - - storedValue=AQH_Storage_GetValueByNameForSystem(aqh->storage, valueName); - if (storedValue) { - uint64_t timestamp=0; - double data=0.0; - int rv; - - rv=AQH_Storage_GetLastDataPoint(aqh->storage, AQH_Value_GetId(storedValue), ×tamp, &data); - if (rv<0) { - switch(rv) { - case GWEN_ERROR_INVALID: resultCode=AQH_MSG_IPC_ERROR_INVALID; break; - case GWEN_ERROR_NO_DATA: resultCode=AQH_MSG_IPC_ERROR_NODATA; break; - default: resultCode=AQH_MSG_IPC_ERROR_GENERIC; break; - } - } - else { - outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), - storedValue, timestamp, data); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); - free(valueName); - return; - } - } - else { - DBG_INFO(NULL, "Value \"%s\" not found", valueName); - resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; - } - free(valueName); - } - else { - DBG_INFO(NULL, "No name for value"); - resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; - } - } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); - resultCode=AQH_MSG_IPC_ERROR_PERMS; - } - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - diff --git a/apps/aqhome-data/c_getlastdatapoint.h b/apps/aqhome-data/c_getlastdatapoint.h deleted file mode 100644 index 2524c2d..0000000 --- a/apps/aqhome-data/c_getlastdatapoint.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_GETLASTDATAPOINT_H -#define AQHOME_DATA_C_GETLASTDATAPOINT_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleGetLastDataPoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_getvalues.c b/apps/aqhome-data/c_getvalues.c deleted file mode 100644 index 49bcf16..0000000 --- a/apps/aqhome-data/c_getvalues.c +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_getvalues.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_values.h" -#include "aqhome/ipc/msg_ipc_result.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define AQHOMEDATA_VALUESPERMSG 10 - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags, uint32_t refMsgId); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleGetValues(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - const AQH_VALUE_LIST *origValueList; - - DBG_INFO(NULL, "HandleGetValues"); - origValueList=AQH_Storage_GetValueList(aqh->storage); - if (origValueList) { - DBG_INFO(NULL, "Have a list of %d values", AQH_Value_List_GetCount(origValueList)); - if (AQH_Value_List_GetCount(origValueList)=AQHOMEDATA_VALUESPERMSG) { - DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList)); - _sendValueList(aqh, ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); - AQH_Value_List_Clear(tmpValueList); - } - v=next; - } - if (AQH_Value_List_GetCount(tmpValueList)) { - DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList)); - _sendValueList(aqh, ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); /* send remaining */ - } - AQH_Value_List_free(tmpValueList); - } - } - else { - /* empty list */ - _sendValueList(aqh, ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); - } -} - - - -void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags, uint32_t refMsgId) -{ - GWEN_MSG *msg; - - msg=AQH_ValuesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, - flags, vl); - GWEN_MsgEndpoint_AddSendMessage(ep, msg); -} - - - diff --git a/apps/aqhome-data/c_getvalues.h b/apps/aqhome-data/c_getvalues.h deleted file mode 100644 index 5cdfde6..0000000 --- a/apps/aqhome-data/c_getvalues.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_GETVALUES_H -#define AQHOME_DATA_C_GETVALUES_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleGetValues(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_moddevice.c b/apps/aqhome-data/c_moddevice.c deleted file mode 100644 index 0d26117..0000000 --- a/apps/aqhome-data/c_moddevice.c +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_getlastdatapoint.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_devices.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomeData_HandleModDevice(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - - if (AQH_IpcEndpoint_GetPermissions(ep) & AQH_IPCENDPOINT_PERMS_MODDEVICE) { - AQH_DEVICE *device; - - AQH_DevicesDataIpcMsg_Parse(recvdMsg, 0); - device=AQH_DevicesDataIpcMsg_ReadFirstDevice(recvdMsg); - if (device) { - const char *deviceNameForSystem; - - deviceNameForSystem=AQH_Device_GetNameForSystem(device); - if (deviceNameForSystem && *deviceNameForSystem) { - AQH_DEVICE *storedDevice; - - storedDevice=AQH_Storage_GetDeviceByNameForSystem(aqh->storage, deviceNameForSystem); - if (storedDevice) { - const char *s; - - s=AQH_Device_GetNameForGui(device); - if (s && *s) - AQH_Device_SetNameForGui(storedDevice, s); - - s=AQH_Device_GetRoomName(device); - if (s && *s) - AQH_Device_SetRoomName(storedDevice, s); - - s=AQH_Device_GetLocation(device); - if (s && *s) - AQH_Device_SetLocation(storedDevice, s); - - s=AQH_Device_GetDescription(device); - if (s && *s) - AQH_Device_SetDescription(storedDevice, s); - - AQH_Storage_AddRuntimeFlags(aqh->storage, AQH_STORAGE_RTFLAGS_MODIFIED); - resultCode=AQH_MSG_IPC_SUCCESS; - } - else { - DBG_INFO(NULL, "Device \"%s\" not found", deviceNameForSystem); - resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; - } - } - else { - DBG_INFO(NULL, "No name for value"); - resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; - } - } - else { - DBG_INFO(NULL, "No device info in message"); - resultCode=AQH_MSG_IPC_ERROR_INVALID; - } - } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); - resultCode=AQH_MSG_IPC_ERROR_PERMS; - } - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - diff --git a/apps/aqhome-data/c_moddevice.h b/apps/aqhome-data/c_moddevice.h deleted file mode 100644 index e3cea44..0000000 --- a/apps/aqhome-data/c_moddevice.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_MODDEVICE_H -#define AQHOME_DATA_C_MODDEVICE_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleModDevice(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_setdata.c b/apps/aqhome-data/c_setdata.c deleted file mode 100644 index 326e8fd..0000000 --- a/apps/aqhome-data/c_setdata.c +++ /dev/null @@ -1,258 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_setdata.h" -#include "./aqhome_data_p.h" -#include "./loop.h" -#include "aqhome/aqhome.h" -#include "aqhome/ipc/requests.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_set.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define R_SETDATA_REQUEST_EXPIRE_SECS 20 -#define R_SETDATA_SUBREQUEST_EXPIRE_SECS 10 - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static GWEN_MSG_REQUEST *_mkRequest_SetData(AQHOME_DATA *aqh, - GWEN_MSG_ENDPOINT *epSrc, uint32_t requestMsgId, - GWEN_MSG_ENDPOINT *epDriver, - const AQH_VALUE *v, const char *data); -static void _rqSubRequestFinished(GWEN_MSG_REQUEST *rq, GWEN_MSG_REQUEST *subRq, int reason); -static void _rqAbort(GWEN_MSG_REQUEST *rq, int reason); - -static GWEN_MSG_REQUEST *_mkSubRequest_SetData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epDriver, const AQH_VALUE *v, const char *data); -static int _subRqHandleResponse(GWEN_MSG_REQUEST *rq, GWEN_MSG *msg); -static void _subRqAbort(GWEN_MSG_REQUEST *rq, int reason); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleSetData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epSrc, GWEN_MSG *recvdMsg) -{ - uint32_t msgId; - AQH_VALUE *recvdValue; - const char *valueName; - char *valueDataFreeable; - AQH_VALUE *systemValue; - - msgId=GWEN_IpcMsg_GetMsgId(recvdMsg); - DBG_INFO(NULL, "Received IPC SetDataRequest message (msgId=%d)", msgId); - - AQH_SetDataIpcMsg_Parse(recvdMsg, 0); - recvdValue=AQH_SetDataIpcMsg_ReadValue(recvdMsg); - valueName=recvdValue?AQH_Value_GetNameForSystem(recvdValue):NULL; - valueDataFreeable=AQH_SetDataIpcMsg_ReadData(recvdMsg); - - systemValue=AQH_Storage_GetValueByNameForSystem(aqh->storage, valueName); - if (systemValue) { - if (AQH_Value_GetValueType(systemValue)==AQH_ValueType_Actor) { - const char *driverName; - - driverName=AQH_Value_GetDriver(systemValue); - if (driverName && *driverName) { - GWEN_MSG_ENDPOINT *epDriver; - - epDriver=AqHomeData_GetIpcEndpointByServiceName(aqh, driverName); - if (epDriver) { - GWEN_MSG_REQUEST *rq; - - DBG_DEBUG(NULL, "Creating SETDATA request for driver endpoint (%s)", GWEN_MsgEndpoint_GetName(epDriver)); - rq=_mkRequest_SetData(aqh, epSrc, msgId, epDriver, systemValue, valueDataFreeable); - AqHomeData_AddRequestToTree(aqh, rq); - } - else { - DBG_ERROR(NULL, "Driver \"%s\" not available", driverName); - AQH_IpcEndpoint_SendResponseResult(epSrc, msgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_GENERIC); - } - } - else { - DBG_ERROR(NULL, "No driver name"); - AQH_IpcEndpoint_SendResponseResult(epSrc, msgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_GENERIC); - } - } - else { - DBG_ERROR(NULL, "Value \"%s\" is not an actor", valueName); - AQH_IpcEndpoint_SendResponseResult(epSrc, msgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_INVALID); - } - } - else { - DBG_ERROR(NULL, "Unknown value \"%s\"", valueName); - AQH_IpcEndpoint_SendResponseResult(epSrc, msgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_NOTFOUND); - } - AQH_Value_free(recvdValue); - free(valueDataFreeable); -} - - - -/* ------------------------------------------------------------------------------------------------ - * IPC Request SETDATA - */ - -GWEN_MSG_REQUEST *_mkRequest_SetData(AQHOME_DATA *aqh, - GWEN_MSG_ENDPOINT *epSrc, uint32_t requestMsgId, - GWEN_MSG_ENDPOINT *epDriver, - const AQH_VALUE *v, const char *data) -{ - GWEN_MSG_REQUEST *rq; - GWEN_MSG_REQUEST *subRq; - - rq=GWEN_MsgRequest_new(); - GWEN_MsgRequest_SetPrivateData(rq, aqh); - GWEN_MsgRequest_SetEndpoint(rq, epSrc); - GWEN_MsgRequest_SetRequestMsgId(rq, requestMsgId); - GWEN_MsgRequest_SetSubRequestFinishedFn(rq, _rqSubRequestFinished); - GWEN_MsgRequest_SetAbortFn(rq, _rqAbort); - GWEN_MsgRequest_SetTimestamps(rq, R_SETDATA_REQUEST_EXPIRE_SECS); - - subRq=_mkSubRequest_SetData(aqh, epDriver, v, data); - GWEN_MsgRequest_Tree2_AddChild(rq, subRq); - - return rq; -} - - - -void _rqSubRequestFinished(GWEN_MSG_REQUEST *rq, GWEN_MSG_REQUEST *subRq, int reason) -{ - GWEN_MSG_ENDPOINT *ep; - uint32_t refMsgId; - int result; - - DBG_DEBUG(NULL, "SubRequest finished (reason: %d)", reason); - refMsgId=GWEN_MsgRequest_GetRequestMsgId(rq); - ep=GWEN_MsgRequest_GetEndpoint(rq); - result=GWEN_MsgRequest_GetResult(subRq); - - if (reason==GWEN_MSG_REQUEST_REASON_ABORTED) - AQH_IpcEndpoint_SendResponseResult(ep, refMsgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_GENERIC); - else - AQH_IpcEndpoint_SendResponseResult(ep, refMsgId, AQH_MSGTYPE_IPC_DATA_RESULT, result); - - GWEN_MsgRequest_SetResult(rq, result); - GWEN_MsgRequest_SetState(rq, GWEN_MSG_REQUEST_STATE_DONE); -} - - - -void _rqAbort(GWEN_MSG_REQUEST *rq, int reason) -{ - GWEN_MSG_ENDPOINT *ep; - uint32_t refMsgId; - GWEN_MSG_REQUEST *rqParent; - - DBG_INFO(NULL, "Aborting request"); - refMsgId=GWEN_MsgRequest_GetRequestMsgId(rq); - ep=GWEN_MsgRequest_GetEndpoint(rq); - AQH_IpcEndpoint_SendResponseResult(ep, refMsgId, AQH_MSGTYPE_IPC_DATA_RESULT, AQH_MSG_IPC_ERROR_GENERIC); - GWEN_MsgRequest_SetState(rq, GWEN_MSG_REQUEST_STATE_DONE); - - rqParent=GWEN_MsgRequest_Tree2_GetParent(rq); - if (rqParent) - GWEN_MsgRequest_SubRequestFinished(rqParent, rq, reason); -} - - - -/* ------------------------------------------------------------------------------------------------ - * Driver Request SETDATA - */ - - -GWEN_MSG_REQUEST *_mkSubRequest_SetData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epDriver, const AQH_VALUE *v, const char *data) -{ - GWEN_MSG_REQUEST *rq; - uint16_t msgId; - GWEN_MSG *driverMsg; - - rq=GWEN_MsgRequest_new(); - GWEN_MsgRequest_SetPrivateData(rq, aqh); - GWEN_MsgRequest_SetEndpoint(rq, epDriver); - - GWEN_MsgRequest_SetHandleResponseFn(rq, _subRqHandleResponse); - GWEN_MsgRequest_SetAbortFn(rq, _subRqAbort); - - msgId=GWEN_MsgEndpoint_GetNextMessageId(epDriver); - GWEN_MsgRequest_SetRequestMsgId(rq, msgId); - GWEN_MsgRequest_SetTimestamps(rq, R_SETDATA_SUBREQUEST_EXPIRE_SECS); - - driverMsg=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, msgId, 0, v, data); - GWEN_MsgEndpoint_AddSendMessage(epDriver, driverMsg); - - return rq; -} - - - -int _subRqHandleResponse(GWEN_MSG_REQUEST *rq, GWEN_MSG *msg) -{ - DBG_DEBUG(NULL, "Checking message from driver"); - if (GWEN_IpcMsg_GetCode(msg)==AQH_MSGTYPE_IPC_DATA_RESULT) { - uint32_t result; - GWEN_MSG_REQUEST *rqParent; - - result=AQH_ResultIpcMsg_GetResultCode(msg); - DBG_INFO(NULL, "Received result for request: %d", result); - GWEN_MsgRequest_SetResult(rq, result); - GWEN_MsgRequest_SetState(rq, GWEN_MSG_REQUEST_STATE_DONE); - rqParent=GWEN_MsgRequest_Tree2_GetParent(rq); - if (rqParent) - GWEN_MsgRequest_SubRequestFinished(rqParent, rq, GWEN_MSG_REQUEST_REASON_DONE); - return GWEN_MSG_REQUEST_RESULT_HANDLED; - } - else { - DBG_ERROR(NULL, "Unexpected response message %d", GWEN_IpcMsg_GetCode(msg)); - } - - return GWEN_MSG_REQUEST_RESULT_NOT_HANDLED; -} - - - -void _subRqAbort(GWEN_MSG_REQUEST *rq, int reason) -{ - GWEN_MSG_REQUEST *rqParent; - - DBG_INFO(NULL, "Aborting request"); - - GWEN_MsgRequest_SetResult(rq, AQH_MSG_IPC_ERROR_GENERIC); - GWEN_MsgRequest_SetState(rq, GWEN_MSG_REQUEST_STATE_DONE); - - rqParent=GWEN_MsgRequest_Tree2_GetParent(rq); - if (rqParent) - GWEN_MsgRequest_SubRequestFinished(rqParent, rq, reason); -} - - diff --git a/apps/aqhome-data/c_setdata.h b/apps/aqhome-data/c_setdata.h deleted file mode 100644 index f4c0566..0000000 --- a/apps/aqhome-data/c_setdata.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_SETDATA_H -#define AQHOME_DATA_C_SETDATA_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleSetData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/c_updatedata.c b/apps/aqhome-data/c_updatedata.c deleted file mode 100644 index f515f24..0000000 --- a/apps/aqhome-data/c_updatedata.c +++ /dev/null @@ -1,153 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./c_updatedata.h" -#include "./aqhome_data_p.h" -#include "./loop.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_multidata.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/msg_ipc_tag16.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define DISABLE_DEBUGLOG - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _storeDataPoints(AQHOME_DATA *aqh, const AQH_VALUE *v, const uint64_t *dataPoints, unsigned int numValues); -static void _sendDataChangedMsgToAllClients(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epSrc, const AQH_VALUE *v, - const uint64_t *dataPoints, uint32_t numValues); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_HandleUpdateData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg) -{ - GWEN_MSG *outMsg; - int resultCode=AQH_MSG_IPC_SUCCESS; - const GWEN_TAG16 *tag; - AQH_VALUE *recvdValue; - const char *valueName; - const uint64_t *dataPoints=NULL; - unsigned int numberOfPoints=0; - - AQH_MultiDataDataIpcMsg_Parse(recvdMsg, 0); - - recvdValue=AQH_MultiDataDataIpcMsg_ReadValue(recvdMsg); - valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; - tag=AQH_Tag16IpcMsg_FindFirstTagByType(recvdMsg, AQH_MSGDATA_MULTIDATA_TAGS_DATA); - dataPoints=tag?((const uint64_t*)GWEN_Tag16_GetTagData(tag)):NULL; - numberOfPoints=(tag?GWEN_Tag16_GetTagLength(tag):0)/(2*sizeof(uint64_t)); - - if (numberOfPoints>0) { - AQH_VALUE *value; - - value=AqHomeData_GetOrCreateValueForDriverWithTemplate(aqh, ep, recvdValue); - if (value) { - resultCode=_storeDataPoints(aqh, value, dataPoints, numberOfPoints); - if (resultCode==AQH_MSG_IPC_SUCCESS) - _sendDataChangedMsgToAllClients(aqh, ep, value, dataPoints, numberOfPoints); - } - else { - DBG_INFO(NULL, "No permissions to add datapoint for value \"%s\"", valueName); - resultCode=AQH_MSG_IPC_ERROR_PERMS; - } - } - else { - DBG_INFO(NULL, "No datapoints"); - resultCode=AQH_MSG_IPC_ERROR_INVALID; - } - AQH_Value_free(recvdValue); - - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), - resultCode); - GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); -} - - - -int _storeDataPoints(AQHOME_DATA *aqh, const AQH_VALUE *v, const uint64_t *dataPoints, unsigned int numValues) -{ - uint32_t i; - - for(i=0; istorage, AQH_Value_GetId(v), timestamp, u.f); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return AQH_MSG_IPC_ERROR_GENERIC; - } - else { - DBG_DEBUG(NULL, "Datapoint added for value \"%s\"", AQH_Value_GetNameForSystem(v)); - } - } /* for */ - - return AQH_MSG_IPC_SUCCESS; -} - - - -void _sendDataChangedMsgToAllClients(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epSrc, const AQH_VALUE *v, - const uint64_t *dataPoints, uint32_t numValues) -{ - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - if (ep!=epSrc) { - if (GWEN_MsgEndpoint_GetFlags(ep) & AQH_IPCENDPOINT_FLAGS_WANTUPDATES) { - GWEN_MSG *msg; - - DBG_DEBUG(AQH_LOGDOMAIN, "Sending update msg to endpoint %s", GWEN_MsgEndpoint_GetName(ep)); - msg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_DATACHANGED, - GWEN_MsgEndpoint_GetNextMessageId(ep), 0, - v, dataPoints, numValues); - GWEN_MsgEndpoint_AddSendMessage(ep, msg); - } - else { - DBG_DEBUG(AQH_LOGDOMAIN, "Endpoint %s doesn't want updates", GWEN_MsgEndpoint_GetName(ep)); - } - } - else { - DBG_DEBUG(AQH_LOGDOMAIN, "Not sending update msg to source of updates"); - } - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } -} - - - diff --git a/apps/aqhome-data/c_updatedata.h b/apps/aqhome-data/c_updatedata.h deleted file mode 100644 index ca09fd2..0000000 --- a/apps/aqhome-data/c_updatedata.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_C_UPDATEDATA_H -#define AQHOME_DATA_C_UPDATEDATA_H - - -#include "./aqhome_data.h" - - -void AqHomeData_HandleUpdateData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg); - - - -#endif - - - - - diff --git a/apps/aqhome-data/fini.c b/apps/aqhome-data/fini.c deleted file mode 100644 index 6bd434c..0000000 --- a/apps/aqhome-data/fini.c +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./fini.h" -#include "./aqhome_data_p.h" - -#include -#include -#include -#include - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _disconnectTree(GWEN_MSG_ENDPOINT *ep); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_Fini(AQHOME_DATA *aqh) -{ - if (aqh) { - if (aqh->ipcdEndpoint) { - _disconnectTree(aqh->ipcdEndpoint); - GWEN_MsgEndpoint_Disconnect(aqh->ipcdEndpoint); - } - GWEN_MsgEndpoint_free(aqh->ipcdEndpoint); - aqh->ipcdEndpoint=NULL; - - if (aqh->pidFile) - remove(aqh->pidFile); - } -} - - - -void _disconnectTree(GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG_ENDPOINT *epChild; - - epChild=GWEN_MsgEndpoint_Tree2_GetFirstChild(ep); - while(epChild) { - _disconnectTree(epChild); - epChild=GWEN_MsgEndpoint_Tree2_GetNext(epChild); - } /* while */ - - GWEN_MsgEndpoint_Disconnect(ep); -} - - - - diff --git a/apps/aqhome-data/fini.h b/apps/aqhome-data/fini.h deleted file mode 100644 index 93564fd..0000000 --- a/apps/aqhome-data/fini.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_FINI_H -#define AQHOME_DATA_FINI_H - - -#include "./aqhome_data.h" - - - -void AqHomeData_Fini(AQHOME_DATA *aqh); - - - -#endif - - diff --git a/apps/aqhome-data/init.c b/apps/aqhome-data/init.c deleted file mode 100644 index dd98631..0000000 --- a/apps/aqhome-data/init.c +++ /dev/null @@ -1,341 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./init.h" -#include "./aqhome_data_p.h" - -#include "aqhome/aqhome.h" -#include "aqhome/ipc/endpoint_ipc.h" - -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -#ifdef HAVE_SYS_STAT_H -# include -#endif - -#include -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _setupStorage(AQHOME_DATA *aqh, GWEN_DB_NODE *dbArgs); - -static void _setupIpc(AQHOME_DATA *aqh, GWEN_DB_NODE *dbArgs); - -static GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, const GWEN_INETADDRESS *addr, void *data); - -static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); -static int _createPidFile(const char *pidFilename); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -int AqHomeData_Init(AQHOME_DATA *aqh, int argc, char **argv) -{ - GWEN_DB_NODE *dbArgs; - int rv; - const char *s; - - dbArgs=GWEN_DB_Group_new("args"); - rv=_readArgs(argc, argv, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error reading args (%d)", rv); - return rv; - } - AQH_MergeConfigFileIntoConfig(dbArgs, "ConfigFile"); - - aqh->dbArgs=dbArgs; - - s=GWEN_DB_GetCharValue(dbArgs, "loglevel", 0, NULL); - if (s && *s) { - GWEN_LOGGER_LEVEL ll; - - ll=GWEN_Logger_Name2Level(s); - GWEN_Logger_SetLevel(NULL, ll); - } - - aqh->timeout=GWEN_DB_GetIntValue(dbArgs, "timeout", 0, 0); - - s=GWEN_DB_GetCharValue(dbArgs, "pidfile", 0, AQHOME_DATA_DEFAULT_PIDFILE); - if (s && *s) { - free(aqh->pidFile); - aqh->pidFile=strdup(s); - rv=_createPidFile(s); - if (rv<0) { - DBG_ERROR(NULL, "Error creating PID file (%d)", rv); - return rv; - } - } - - rv=_setupStorage(aqh, dbArgs); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; - } - - _setupIpc(aqh, dbArgs); - - return 0; -} - - - -int _setupStorage(AQHOME_DATA *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *dataFolder; - GWEN_BUFFER *nameBuf; - AQH_STORAGE *sto; - int rv; - - dataFolder=GWEN_DB_GetCharValue(dbArgs, "dataFolder", 0, AQHOME_DATA_DEFAULT_DATADIR); - nameBuf=GWEN_Buffer_new(0, 256, 0, 1); - GWEN_Buffer_AppendArgs(nameBuf, "%s%s%s", dataFolder, GWEN_DIR_SEPARATOR_S, AQHOME_DATA_STATEFILENAME); - - sto=AQH_Storage_new(); - AQH_Storage_SetStateFile(sto, GWEN_Buffer_GetStart(nameBuf)); - AQH_Storage_SetDataFileFolder(sto, dataFolder); - GWEN_Buffer_free(nameBuf); - - rv=AQH_Storage_Init(sto); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - AQH_Storage_free(sto); - return rv; - } - aqh->storage=sto; - return 0; -} - - - -void _setupIpc(AQHOME_DATA *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *tcpAddress; - int tcpPort; - - tcpAddress=GWEN_DB_GetCharValue(dbArgs, "tcpAddress", 0, NULL); - if (!(tcpAddress && *tcpAddress)) - tcpAddress=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/brokerAddress", 0, NULL); - - tcpPort=GWEN_DB_GetIntValue(dbArgs, "tcpPort", 0, -1); - if (tcpPort<0) - tcpPort=GWEN_DB_GetIntValue(dbArgs, "ConfigFile/brokerPort", 0, AQHOME_DATA_DEFAULT_IPC_PORT); - - if (tcpAddress && *tcpAddress && tcpPort>0) { - GWEN_MSG_ENDPOINT *ep; - - DBG_INFO(NULL, "Starting TCP service on \"%s\":%d", tcpAddress, tcpPort); - ep=GWEN_TcpdEndpoint_new(tcpAddress, tcpPort, NULL, 0); - GWEN_TcpdEndpoint_SetAcceptFn(ep, _acceptIpcFn, aqh); - - aqh->ipcdEndpoint=ep; - } -} - - - -GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, - GWEN_SOCKET *sk, - const GWEN_INETADDRESS *addr, - GWEN_UNUSED void *data) -{ -/* AQHOME_DATA *aqh; - * - * aqh=(AQHOME_DATA*) data; - */ - DBG_INFO(NULL, "Incoming IPC connection"); - return AQH_IpcEndpoint_CreateIpcTcpServiceForSocket(sk, NULL, 0); -} - - - -int _createPidFile(const char *pidFilename) -{ - FILE *f; - int pidfd; - - if (remove(pidFilename)==0) { - DBG_ERROR(0, "Old PID file existed, removed. (Unclean shutdown?)"); - } - -#ifdef HAVE_SYS_STAT_H - pidfd = open(pidFilename, O_EXCL|O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (pidfd < 0) { - DBG_ERROR(NULL, "Could not create PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - - f = fdopen(pidfd, "w"); -#else /* HAVE_STAT_H */ - f=fopen(pidFilename,"w+"); -#endif /* HAVE_STAT_H */ - - /* write pid */ -#ifdef HAVE_GETPID - fprintf(f,"%d\n",getpid()); -#else - fprintf(f,"-1\n"); -#endif - if (fclose(f)) { - DBG_ERROR(0, "Could not close PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - return 0; -} - - - - -int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs) -{ - int rv; - const GWEN_ARGS args[]= { - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "loglevel", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "L", /* short option */ - "loglevel", /* long option */ - I18S("Specify loglevel"), /* short description */ - I18S("Specify loglevel") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "tcpAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "t", /* short option */ - "tcpaddress", /* long option */ - I18S("Specify the TCP address to listen on (disabled if missing)"), - I18S("Specify the TCP address to listen on (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "tcpPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "P", /* short option */ - "tcpport", /* long option */ - I18S("Specify the TCP port to listen on"), - I18S("Specify the TCP port to listen on") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "datafolder", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - NULL, /* short option */ - "datafolder", /* long option */ - I18S("Folder where data files are stored"), - I18S("Folder where data files are stored") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "pidfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "p", /* short option */ - "pidfile", /* long option */ - I18S("Specify the PID file"), - I18S("Specify the PID file") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "timeout", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "T", /* short option */ - "timeout", /* long option */ - I18S("Specify timeout in second (default: no timeout)"), - I18S("Specify timeout in second (default: no timeout)") - }, - { - GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ - GWEN_ArgsType_Int, /* type */ - "help", /* name */ - 0, /* minnum */ - 0, /* maxnum */ - "h", /* short option */ - "help", - I18S("Show this help screen."), - I18S("Show this help screen.") - } - }; - - rv=GWEN_Args_Check(argc, argv, 1, 0, args, dbArgs); - if (rv==GWEN_ARGS_RESULT_ERROR) { - fprintf(stderr, "ERROR: Could not parse arguments main\n"); - return GWEN_ERROR_INVALID; - } - else if (rv==GWEN_ARGS_RESULT_HELP) { - GWEN_BUFFER *ubuf; - - ubuf=GWEN_Buffer_new(0, 1024, 0, 1); - GWEN_Buffer_AppendArgs(ubuf, - I18N("This is version %s.\nUsage: %s [OPTIONS]\n\nOptions:\n"), - AQHOME_VERSION_STRING, - argv[0]); - if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { - fprintf(stderr, "ERROR: Could not create help string\n"); - return 1; - } - GWEN_Buffer_AppendString(ubuf, "\n"); - - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); - GWEN_Buffer_free(ubuf); - return GWEN_ERROR_CLOSE; - } - return 0; -} - - - diff --git a/apps/aqhome-data/init.h b/apps/aqhome-data/init.h deleted file mode 100644 index 082bbc2..0000000 --- a/apps/aqhome-data/init.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_INIT_H -#define AQHOME_DATA_INIT_H - - -#include "./aqhome_data.h" - - - -int AqHomeData_Init(AQHOME_DATA *aqh, int argc, char **argv); - - - -#endif - - diff --git a/apps/aqhome-data/loop.c b/apps/aqhome-data/loop.c deleted file mode 100644 index a7a2aff..0000000 --- a/apps/aqhome-data/loop.c +++ /dev/null @@ -1,258 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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 "./loop.h" -#include "./c_connect.h" -#include "./c_updatedata.h" -#include "./c_getdatapoints.h" -#include "./c_getvalues.h" -#include "./c_getdevices.h" -#include "./c_setdata.h" -#include "./c_addvalue.h" -#include "./c_annvalue.h" -#include "./c_moddevice.h" -#include "./aqhome_data_p.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_values.h" -#include "aqhome/ipc/data/msg_data_datapoints.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/requests.h" - -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define DISABLE_DEBUGLOG - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _readAndHandleIpcMessages(AQHOME_DATA *aqh); -static void _handleIpcEndpoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep); -static void _handleIpcMsg(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); -static AQH_DEVICE *_getOrCreateDeviceForDriver(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epDriver, const char *nameForDriver); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeData_Loop(AQHOME_DATA *aqh, int timeoutInMsecs) -{ - if (aqh) { - GWEN_MsgEndpoint_IoLoop(aqh->ipcdEndpoint, timeoutInMsecs); - _readAndHandleIpcMessages(aqh); - - AQH_Requests_CheckTimeouts(aqh->requestTree); - AQH_Requests_Cleanup(aqh->requestTree); - } -} - - - -int AqHomeData_WriteStorageIfChanged(AQHOME_DATA *aqh) -{ - if (AQH_Storage_GetRuntimeFlags(aqh->storage) & AQH_STORAGE_RTFLAGS_MODIFIED) { - int rv; - - DBG_INFO(NULL, "Storage modified, writing statefile"); - rv=AqHomeData_LockStorage(aqh); - if (rv<0) { - DBG_INFO(NULL, "Error locking storage (%d)", rv); - return rv; - } - rv=AQH_Storage_WriteState(aqh->storage); - if (rv<0) { - DBG_INFO(NULL, "Error writing state file (%d)", rv); - AqHomeData_UnlockStorage(aqh); - return rv; - } - - rv=AqHomeData_UnlockStorage(aqh); - if (rv<0) { - DBG_INFO(NULL, "Error unlocking storage (%d)", rv); - return rv; - } - } - - return 0; -} - - - -AQH_VALUE *AqHomeData_GetOrCreateValueForDriverWithTemplate(AQHOME_DATA *aqh, - GWEN_MSG_ENDPOINT *epDriver, - const AQH_VALUE *valueTemplate) -{ - const char *serviceName; - AQH_VALUE *v; - GWEN_BUFFER *buf; - const char *valueName; - const char *deviceName; - - serviceName=AQH_IpcEndpoint_GetServiceName(epDriver); - valueName=AQH_Value_GetName(valueTemplate); - deviceName=AQH_Value_GetDeviceName(valueTemplate); - - buf=GWEN_Buffer_new(0, 256, 0, 1); - if (deviceName && *deviceName) - GWEN_Buffer_AppendArgs(buf, "%s/%s/%s", (serviceName && *serviceName)?serviceName:"unknown", deviceName, valueName); - else - GWEN_Buffer_AppendArgs(buf, "%s/%s", (serviceName && *serviceName)?serviceName:"unknown", valueName); - - v=AQH_Storage_GetValueByNameForSystem(aqh->storage, GWEN_Buffer_GetStart(buf)); - if (v==NULL) { - if (AQH_IpcEndpoint_GetPermissions(epDriver) & AQH_IPCENDPOINT_PERMS_ADDVALUE) { - AQH_DEVICE *device; - - DBG_INFO(AQH_LOGDOMAIN, "Creating value \"%s\"", GWEN_Buffer_GetStart(buf)); - device=(deviceName && *deviceName)?_getOrCreateDeviceForDriver(aqh, epDriver, deviceName):NULL; - - v=AQH_Value_new(); - AQH_Value_SetDriver(v, serviceName); - AQH_Value_SetName(v, AQH_Value_GetName(valueTemplate)); - AQH_Value_SetNameForSystem(v, GWEN_Buffer_GetStart(buf)); - AQH_Value_SetValueUnits(v, AQH_Value_GetValueUnits(valueTemplate)); - AQH_Value_SetValueType(v, AQH_Value_GetValueType(valueTemplate)); - AQH_Value_SetModality(v, AQH_Value_GetModality(valueTemplate)); - AQH_Value_SetTimestampCreation(v, (uint64_t) time(NULL)); - if (device) { - AQH_Value_SetDeviceNameForSystem(v, AQH_Device_GetNameForSystem(device)); - AQH_Value_SetDeviceName(v, AQH_Device_GetName(device)); - } - AQH_Storage_AddValue(aqh->storage, v); - } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to create value \"%s\"", GWEN_Buffer_GetStart(buf)); - GWEN_Buffer_free(buf); - return NULL; - } - } - GWEN_Buffer_free(buf); - return v; -} - - - -AQH_DEVICE *_getOrCreateDeviceForDriver(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epDriver, const char *deviceName) -{ - const char *serviceName; - AQH_DEVICE *device; - GWEN_BUFFER *buf; - - serviceName=AQH_IpcEndpoint_GetServiceName(epDriver); - - buf=GWEN_Buffer_new(0, 256, 0, 1); - GWEN_Buffer_AppendArgs(buf, "%s/%s", (serviceName && *serviceName)?serviceName:"unknown", deviceName); - - device=AQH_Storage_GetDeviceByNameForSystem(aqh->storage, GWEN_Buffer_GetStart(buf)); - if (device==NULL) { - if (AQH_IpcEndpoint_GetPermissions(epDriver) & AQH_IPCENDPOINT_PERMS_ADDDEVICE) { - DBG_INFO(AQH_LOGDOMAIN, "Creating device \"%s\"", GWEN_Buffer_GetStart(buf)); - device=AQH_Device_new(); - AQH_Device_SetDriver(device, serviceName); - AQH_Device_SetName(device, deviceName); - AQH_Device_SetNameForSystem(device, GWEN_Buffer_GetStart(buf)); - AQH_Device_SetTimestampCreation(device, (uint64_t) time(NULL)); - AQH_Storage_AddDevice(aqh->storage, device); - } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to create device \"%s\"", GWEN_Buffer_GetStart(buf)); - GWEN_Buffer_free(buf); - return NULL; - } - } - GWEN_Buffer_free(buf); - return device; -} - - - -void _readAndHandleIpcMessages(AQHOME_DATA *aqh) -{ - if (aqh->ipcdEndpoint) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - _handleIpcEndpoint(aqh, ep); - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - } -} - - - -void _handleIpcEndpoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG *msg; - - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { - DBG_INFO(NULL, "Got IPS message %d (msgId=%d, refMsgId=%d) [%s]", - GWEN_IpcMsg_GetCode(msg), - GWEN_IpcMsg_GetMsgId(msg), - GWEN_IpcMsg_GetRefMsgId(msg), - GWEN_MsgEndpoint_GetName(ep)); - if (AQH_Requests_HandleIpcMsg(aqh->requestTree, ep, msg)!=GWEN_MSG_REQUEST_RESULT_HANDLED) - _handleIpcMsg(aqh, ep, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleIpcMsg(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - uint16_t code; - uint8_t protoId; - - /* exec IPC message */ - code=GWEN_IpcMsg_GetCode(msg); - protoId=GWEN_IpcMsg_GetProtoId(msg); - if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet %d (%x)", (int) code, code); - switch(code) { - case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeData_HandleConnect(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeData_HandleUpdateData(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeData_HandleGetValues(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeData_HandleGetDataPoints(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeData_HandleSetData(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_ADDVALUE: AqHomeData_HandleAddValue(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE: AqHomeData_HandleAnnounceValue(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ: AqHomeData_HandleGetDevices(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ: AqHomeData_HandleModDevice(aqh, ep, msg); break; - default: break; - } - } - else { - DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); - } -} - - - diff --git a/apps/aqhome-data/loop.h b/apps/aqhome-data/loop.h deleted file mode 100644 index 2fb1f0a..0000000 --- a/apps/aqhome-data/loop.h +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** - * This file is part of the project AqHome. - * AqHome (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. - ****************************************************************************/ - -#ifndef AQHOME_DATA_LOOP_H -#define AQHOME_DATA_LOOP_H - - -#include "./aqhome_data.h" - - -void AqHomeData_Loop(AQHOME_DATA *aqh, int timeoutInMsecs); - -int AqHomeData_WriteStorageIfChanged(AQHOME_DATA *aqh); - -AQH_VALUE *AqHomeData_GetOrCreateValueForDriverWithTemplate(AQHOME_DATA *aqh, - GWEN_MSG_ENDPOINT *epDriver, - const AQH_VALUE *valueTemplate); - - -#endif - - - - -