From fecaaaf341ec4094fc9888435b38d7dfdaa5a72b Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Tue, 11 Mar 2025 22:59:18 +0100 Subject: [PATCH] aqhome apps: fixed taglist handling. --- apps/aqhome-data/s_addvalue.c | 54 ++++++++------- apps/aqhome-data/s_annvalue.c | 18 ++--- apps/aqhome-data/s_connect.c | 78 ++++++++++----------- apps/aqhome-data/s_getdatapoints.c | 74 ++++++++++---------- apps/aqhome-data/s_getdevices.c | 92 +++++++++++++------------ apps/aqhome-data/s_getvalues.c | 94 ++++++++++++------------- apps/aqhome-data/s_moddevice.c | 100 ++++++++++++++------------- apps/aqhome-data/s_setdata.c | 106 +++++++++++++++-------------- apps/aqhome-data/s_updatedata.c | 86 +++++++++++------------ apps/aqhome-data/server.c | 44 ++++++------ apps/aqhome-nodes/r_connect.c | 89 ++++++++++++------------ 11 files changed, 426 insertions(+), 409 deletions(-) diff --git a/apps/aqhome-data/s_addvalue.c b/apps/aqhome-data/s_addvalue.c index dca76f0..1049b23 100644 --- a/apps/aqhome-data/s_addvalue.c +++ b/apps/aqhome-data/s_addvalue.c @@ -31,33 +31,35 @@ void AqHomeDataServer_HandleAddValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - AQH_MESSAGE *outMsg; - int resultCode=AQH_MSGDATA_RESULT_SUCCESS; - AQH_VALUE *recvdValue; - - recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); - if (recvdValue) { - AQH_VALUE *value; - - value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - if (value==NULL) - resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; - AQH_Value_free(recvdValue); + if (tagList) { + AQHOME_SERVER *xo; + + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + AQH_MESSAGE *outMsg; + int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + AQH_VALUE *recvdValue; + + recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); + if (recvdValue) { + AQH_VALUE *value; + + value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + if (value==NULL) + resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; + AQH_Value_free(recvdValue); + } + else + resultCode=AQH_MSGDATA_RESULT_ERROR_BADDATA; + + outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, + AQH_IPC_PROTOCOL_DATA_VERSION, + AQH_MSGTYPE_IPC_DATA_RESULT, + AQH_Endpoint_GetNextMessageId(ep), + AQH_IpcMessage_GetMsgId(msg), + resultCode, NULL); + AQH_Endpoint_AddMsgOut(ep, outMsg); } - else - resultCode=AQH_MSGDATA_RESULT_ERROR_BADDATA; - - outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, - AQH_IPC_PROTOCOL_DATA_VERSION, - AQH_MSGTYPE_IPC_DATA_RESULT, - AQH_Endpoint_GetNextMessageId(ep), - AQH_IpcMessage_GetMsgId(msg), - resultCode, NULL); - AQH_Endpoint_AddMsgOut(ep, outMsg); } } diff --git a/apps/aqhome-data/s_annvalue.c b/apps/aqhome-data/s_annvalue.c index 8cebbda..a8ed2f3 100644 --- a/apps/aqhome-data/s_annvalue.c +++ b/apps/aqhome-data/s_annvalue.c @@ -31,16 +31,18 @@ void AqHomeDataServer_HandleAnnounceValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; + if (tagList) { + AQHOME_SERVER *xo; - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - AQH_VALUE *recvdValue; + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + AQH_VALUE *recvdValue; - recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); - if (recvdValue) { - AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - AQH_Value_free(recvdValue); + recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); + if (recvdValue) { + AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + AQH_Value_free(recvdValue); + } } } } diff --git a/apps/aqhome-data/s_connect.c b/apps/aqhome-data/s_connect.c index 2a8b74c..d91683f 100644 --- a/apps/aqhome-data/s_connect.c +++ b/apps/aqhome-data/s_connect.c @@ -31,49 +31,51 @@ void AqHomeDataServer_HandleConnect(GWEN_UNUSED AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQH_MESSAGE *outMsg; - int resultCode=AQH_MSGDATA_RESULT_SUCCESS; - char *clientId=NULL; - char *userId=NULL; - char *passw=NULL; - uint32_t flags; + if (tagList) { + AQH_MESSAGE *outMsg; + int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + char *clientId=NULL; + char *userId=NULL; + char *passw=NULL; + uint32_t flags; - clientId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_CLIENTID, NULL); - userId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_USERID, NULL); - flags=AQH_Tag16_GetTagDataAsUint32(tagList, AQH_MSG_CONNECT_TAGS_FLAGS, 0); - passw=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_PASSWORD, NULL); + clientId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_CLIENTID, NULL); + userId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_USERID, NULL); + flags=AQH_Tag16_GetTagDataAsUint32(tagList, AQH_MSG_CONNECT_TAGS_FLAGS, 0); + passw=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_PASSWORD, NULL); - if (clientId) - AQH_Endpoint_SetServiceName(ep, clientId); - if (userId) - AQH_Endpoint_SetUserName(ep, userId); + if (clientId) + AQH_Endpoint_SetServiceName(ep, clientId); + if (userId) + AQH_Endpoint_SetUserName(ep, userId); - if (flags & AQH_MSG_CONNECT_FLAGS_WANTUPDATES) - AQH_Endpoint_AddFlags(ep, AQH_ENDPOINT_FLAGS_WANTUPDATES); + if (flags & AQH_MSG_CONNECT_FLAGS_WANTUPDATES) + AQH_Endpoint_AddFlags(ep, AQH_ENDPOINT_FLAGS_WANTUPDATES); - /* TODO: add user management, for now we allow all */ - AQH_Endpoint_SetPermissions(ep, - AQH_ENDPOINT_PERMS_LISTVALUES | - AQH_ENDPOINT_PERMS_READVALUE | - AQH_ENDPOINT_PERMS_ADDVALUE | - AQH_ENDPOINT_PERMS_LISTDATA | - AQH_ENDPOINT_PERMS_READDATA | - AQH_ENDPOINT_PERMS_ADDDATA | - AQH_ENDPOINT_PERMS_LISTDEVICES | - AQH_ENDPOINT_PERMS_READDEVICE | - AQH_ENDPOINT_PERMS_ADDDEVICE | - AQH_ENDPOINT_PERMS_MODDEVICE); - free(passw); - free(userId); - free(clientId); + /* TODO: add user management, for now we allow all */ + AQH_Endpoint_SetPermissions(ep, + AQH_ENDPOINT_PERMS_LISTVALUES | + AQH_ENDPOINT_PERMS_READVALUE | + AQH_ENDPOINT_PERMS_ADDVALUE | + AQH_ENDPOINT_PERMS_LISTDATA | + AQH_ENDPOINT_PERMS_READDATA | + AQH_ENDPOINT_PERMS_ADDDATA | + AQH_ENDPOINT_PERMS_LISTDEVICES | + AQH_ENDPOINT_PERMS_READDEVICE | + AQH_ENDPOINT_PERMS_ADDDEVICE | + AQH_ENDPOINT_PERMS_MODDEVICE); + free(passw); + free(userId); + free(clientId); - outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, - AQH_IPC_PROTOCOL_DATA_VERSION, - AQH_MSGTYPE_IPC_DATA_RESULT, - AQH_Endpoint_GetNextMessageId(ep), - AQH_IpcMessage_GetMsgId(msg), - resultCode, NULL); - AQH_Endpoint_AddMsgOut(ep, outMsg); + outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, + AQH_IPC_PROTOCOL_DATA_VERSION, + AQH_MSGTYPE_IPC_DATA_RESULT, + AQH_Endpoint_GetNextMessageId(ep), + AQH_IpcMessage_GetMsgId(msg), + resultCode, NULL); + AQH_Endpoint_AddMsgOut(ep, outMsg); + } } diff --git a/apps/aqhome-data/s_getdatapoints.c b/apps/aqhome-data/s_getdatapoints.c index e88eb2d..f2db538 100644 --- a/apps/aqhome-data/s_getdatapoints.c +++ b/apps/aqhome-data/s_getdatapoints.c @@ -62,49 +62,51 @@ static void _getAndSendLastDatapoint(AQH_STORAGE *storage, AQH_OBJECT *ep, const void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - uint32_t refMsgId; - - refMsgId=AQH_IpcMessage_GetMsgId(recvdMsg); - if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_READDATA) { - char *valueName; - - valueName=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); - if (valueName && *valueName) { - AQH_VALUE *value; - uint64_t tsBegin; - uint64_t tsEnd; - uint64_t numRequested; - - tsBegin=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_BEGIN, 0); - tsEnd=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_END, 0); - numRequested=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_NUM, 0); - - value=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); - if (value) { - int resultCode; - - resultCode=_getAndSendDataPoints(xo->storage, ep, value, tsBegin, tsEnd, numRequested, refMsgId); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, resultCode); + if (tagList) { + AQHOME_SERVER *xo; + + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + uint32_t refMsgId; + + refMsgId=AQH_IpcMessage_GetMsgId(recvdMsg); + if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_READDATA) { + char *valueName; + + valueName=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); + if (valueName && *valueName) { + AQH_VALUE *value; + uint64_t tsBegin; + uint64_t tsEnd; + uint64_t numRequested; + + tsBegin=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_BEGIN, 0); + tsEnd=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_END, 0); + numRequested=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_NUM, 0); + + value=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); + if (value) { + int resultCode; + + resultCode=_getAndSendDataPoints(xo->storage, ep, value, tsBegin, tsEnd, numRequested, refMsgId); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, resultCode); + } + else { + DBG_INFO(NULL, "Value \"%s\" does not exist", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + } + free(valueName); } else { - DBG_INFO(NULL, "Value \"%s\" does not exist", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + DBG_INFO(NULL, "Missing value name"); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } - free(valueName); } else { - DBG_INFO(NULL, "Missing value name"); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); + DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_PERMS); } } - else { - DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_PERMS); - } } } diff --git a/apps/aqhome-data/s_getdevices.c b/apps/aqhome-data/s_getdevices.c index 0830aeb..9be4988 100644 --- a/apps/aqhome-data/s_getdevices.c +++ b/apps/aqhome-data/s_getdevices.c @@ -49,55 +49,57 @@ static void _sendDeviceList(AQH_OBJECT *ep, const AQH_DEVICE_LIST *vl, uint32_t void AqHomeDataServer_HandleGetDevices(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - const AQH_DEVICE_LIST *origDeviceList; - uint32_t refMsgId; - - refMsgId=AQH_IpcMessage_GetMsgId(msg); - - DBG_ERROR(NULL, "HandleGetDevices"); - origDeviceList=AQH_Storage_GetDeviceList(xo->storage); - if (origDeviceList) { - DBG_ERROR(NULL, "Have a list of %d devices", AQH_Device_List_GetCount(origDeviceList)); - if (AQH_Device_List_GetCount(origDeviceList)storage); + if (origDeviceList) { + DBG_ERROR(NULL, "Have a list of %d devices", AQH_Device_List_GetCount(origDeviceList)); + if (AQH_Device_List_GetCount(origDeviceList)=AQHOMEDATA_DEVICESPERMSG) { + DBG_ERROR(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); + _sendDeviceList(ep, tmpDeviceList, next?0:AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); + AQH_Device_List_Clear(tmpDeviceList); + } + v=next; + } + if (AQH_Device_List_GetCount(tmpDeviceList)) { + DBG_ERROR(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); + _sendDeviceList(ep, tmpDeviceList, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); /* send remaining */ + } + AQH_Device_List_free(tmpDeviceList); + } } else { - AQH_DEVICE_LIST *tmpDeviceList; - const AQH_DEVICE *v; - - DBG_INFO(NULL, "Sending entries in multiple messages"); - tmpDeviceList=AQH_Device_List_new(); - v=AQH_Device_List_First(origDeviceList); - while(v) { - const AQH_DEVICE *next; - AQH_DEVICE *copyOfDevice; - - next=AQH_Device_List_Next(v); - copyOfDevice=AQH_Device_dup(v); - AQH_Device_List_Add(copyOfDevice, tmpDeviceList); - if (AQH_Device_List_GetCount(tmpDeviceList)>=AQHOMEDATA_DEVICESPERMSG) { - DBG_ERROR(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(ep, tmpDeviceList, next?0:AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); - AQH_Device_List_Clear(tmpDeviceList); - } - v=next; - } - if (AQH_Device_List_GetCount(tmpDeviceList)) { - DBG_ERROR(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(ep, tmpDeviceList, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); /* send remaining */ - } - AQH_Device_List_free(tmpDeviceList); + /* empty list */ + _sendDeviceList(ep, NULL, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); } } - else { - /* empty list */ - _sendDeviceList(ep, NULL, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, refMsgId); - } } } diff --git a/apps/aqhome-data/s_getvalues.c b/apps/aqhome-data/s_getvalues.c index 8fe4477..64567a5 100644 --- a/apps/aqhome-data/s_getvalues.c +++ b/apps/aqhome-data/s_getvalues.c @@ -49,56 +49,58 @@ static void _sendValueList(AQH_OBJECT *ep, const AQH_VALUE_LIST *vl, uint32_t fl void AqHomeDataServer_HandleGetValues(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - const AQH_VALUE_LIST *origValueList; - - uint32_t refMsgId; - - refMsgId=AQH_IpcMessage_GetMsgId(msg); - - DBG_INFO(NULL, "HandleGetValues"); - origValueList=AQH_Storage_GetValueList(xo->storage); - if (origValueList) { - DBG_INFO(NULL, "Have a list of %d values", AQH_Value_List_GetCount(origValueList)); - if (AQH_Value_List_GetCount(origValueList)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(ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); + 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(ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); /* send remaining */ + } + AQH_Value_List_free(tmpValueList); + } } else { - AQH_VALUE_LIST *tmpValueList; - const AQH_VALUE *v; - - DBG_INFO(NULL, "Sending entries in multiple messages"); - tmpValueList=AQH_Value_List_new(); - v=AQH_Value_List_First(origValueList); - while(v) { - const AQH_VALUE *next; - AQH_VALUE *copyOfValue; - - next=AQH_Value_List_Next(v); - copyOfValue=AQH_Value_dup(v); - AQH_Value_List_Add(copyOfValue, tmpValueList); - if (AQH_Value_List_GetCount(tmpValueList)>=AQHOMEDATA_VALUESPERMSG) { - DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList)); - _sendValueList(ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); - 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(ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); /* send remaining */ - } - AQH_Value_List_free(tmpValueList); + /* empty list */ + _sendValueList(ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); } } - else { - /* empty list */ - _sendValueList(ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, refMsgId); - } } } diff --git a/apps/aqhome-data/s_moddevice.c b/apps/aqhome-data/s_moddevice.c index 26fc19f..c94104e 100644 --- a/apps/aqhome-data/s_moddevice.c +++ b/apps/aqhome-data/s_moddevice.c @@ -36,66 +36,68 @@ void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - int resultCode=AQH_MSGDATA_RESULT_SUCCESS; - - if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_MODDEVICE) { - AQH_DEVICE *device; - - device=AQH_IpcdMessageDevices_ReadFirstDevice(tagList); - if (device) { - const char *deviceNameForSystem; - - deviceNameForSystem=AQH_Device_GetNameForSystem(device); - if (deviceNameForSystem && *deviceNameForSystem) { - AQH_DEVICE *storedDevice; - - storedDevice=AQH_Storage_GetDeviceByNameForSystem(xo->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(xo->storage, AQH_STORAGE_RTFLAGS_MODIFIED); - resultCode=AQH_MSGDATA_RESULT_SUCCESS; + if (tagList) { + AQHOME_SERVER *xo; + + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + + if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_MODDEVICE) { + AQH_DEVICE *device; + + device=AQH_IpcdMessageDevices_ReadFirstDevice(tagList); + if (device) { + const char *deviceNameForSystem; + + deviceNameForSystem=AQH_Device_GetNameForSystem(device); + if (deviceNameForSystem && *deviceNameForSystem) { + AQH_DEVICE *storedDevice; + + storedDevice=AQH_Storage_GetDeviceByNameForSystem(xo->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(xo->storage, AQH_STORAGE_RTFLAGS_MODIFIED); + resultCode=AQH_MSGDATA_RESULT_SUCCESS; + } + else { + DBG_INFO(NULL, "Device \"%s\" not found", deviceNameForSystem); + resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; + } } else { - DBG_INFO(NULL, "Device \"%s\" not found", deviceNameForSystem); + DBG_INFO(NULL, "No name for value"); resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; } } else { - DBG_INFO(NULL, "No name for value"); - resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; + DBG_INFO(NULL, "No device info in message"); + resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } } else { - DBG_INFO(NULL, "No device info in message"); - resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; + DBG_ERROR(NULL, "No permissions to read data"); + resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; } + AqHomeDataServer_SendResponseResultToEndpoint(ep, AQH_IpcMessage_GetMsgId(recvdMsg), resultCode); } - else { - DBG_ERROR(NULL, "No permissions to read data"); - resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; - } - AqHomeDataServer_SendResponseResultToEndpoint(ep, AQH_IpcMessage_GetMsgId(recvdMsg), resultCode); } } diff --git a/apps/aqhome-data/s_setdata.c b/apps/aqhome-data/s_setdata.c index f129818..a80e113 100644 --- a/apps/aqhome-data/s_setdata.c +++ b/apps/aqhome-data/s_setdata.c @@ -62,67 +62,69 @@ static void _subRqAbort(AQH_MSG_REQUEST *rq, int reason); void AqHomeDataServer_HandleSetData(AQH_OBJECT *o, AQH_OBJECT *epSrc, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - uint32_t msgId; - AQH_VALUE *recvdValue; - - msgId=AQH_IpcMessage_GetMsgId(recvdMsg); - DBG_INFO(NULL, "Received IPC SetDataRequest message (msgId=%d)", msgId); - - recvdValue=AQH_IpcdMessageSetData_ReadValue(tagList); - if (recvdValue) { - const char *valueName; - char *valueDataFreeable; - AQH_VALUE *systemValue; - - valueName=AQH_Value_GetNameForSystem(recvdValue); - valueDataFreeable=AQH_IpcdMessageSetData_ReadData(tagList); - - systemValue=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); - if (systemValue) { - if (AQH_Value_GetValueType(systemValue)==AQH_ValueType_Actor) { - const char *driverName; - - driverName=AQH_Value_GetDriver(systemValue); - if (driverName && *driverName) { - AQH_OBJECT *epDriver; - - epDriver=AqHomeDataServer_GetIpcEndpointByServiceName(o, driverName); - if (epDriver) { - AQH_MSG_REQUEST *rq; - - DBG_ERROR(NULL, "Creating SETDATA request for driver endpoint (%s)", AQH_Endpoint_GetServiceName(epDriver)); - rq=_mkRequest_SetData(o, epSrc, msgId, epDriver, systemValue, valueDataFreeable); - AqHomeDataServer_AddRequestToTree(o, rq); + if (tagList) { + AQHOME_SERVER *xo; + + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + uint32_t msgId; + AQH_VALUE *recvdValue; + + msgId=AQH_IpcMessage_GetMsgId(recvdMsg); + DBG_INFO(NULL, "Received IPC SetDataRequest message (msgId=%d)", msgId); + + recvdValue=AQH_IpcdMessageSetData_ReadValue(tagList); + if (recvdValue) { + const char *valueName; + char *valueDataFreeable; + AQH_VALUE *systemValue; + + valueName=AQH_Value_GetNameForSystem(recvdValue); + valueDataFreeable=AQH_IpcdMessageSetData_ReadData(tagList); + + systemValue=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); + if (systemValue) { + if (AQH_Value_GetValueType(systemValue)==AQH_ValueType_Actor) { + const char *driverName; + + driverName=AQH_Value_GetDriver(systemValue); + if (driverName && *driverName) { + AQH_OBJECT *epDriver; + + epDriver=AqHomeDataServer_GetIpcEndpointByServiceName(o, driverName); + if (epDriver) { + AQH_MSG_REQUEST *rq; + + DBG_ERROR(NULL, "Creating SETDATA request for driver endpoint (%s)", AQH_Endpoint_GetServiceName(epDriver)); + rq=_mkRequest_SetData(o, epSrc, msgId, epDriver, systemValue, valueDataFreeable); + AqHomeDataServer_AddRequestToTree(o, rq); + } + else { + DBG_ERROR(NULL, "Driver \"%s\" not available", driverName); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); + } } else { - DBG_ERROR(NULL, "Driver \"%s\" not available", driverName); + DBG_ERROR(NULL, "No driver name"); AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); } - } + } /* if actor */ else { - DBG_ERROR(NULL, "No driver name"); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); + DBG_ERROR(NULL, "Value \"%s\" is not an actor", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_INVALID); } - } /* if actor */ - else { - DBG_ERROR(NULL, "Value \"%s\" is not an actor", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_INVALID); } - } + else { + DBG_ERROR(NULL, "Unknown value \"%s\"", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + } + AQH_Value_free(recvdValue); + free(valueDataFreeable); + } /* if recvdValue */ else { - DBG_ERROR(NULL, "Unknown value \"%s\"", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + DBG_ERROR(NULL, "No value in message"); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } - AQH_Value_free(recvdValue); - free(valueDataFreeable); - } /* if recvdValue */ - else { - DBG_ERROR(NULL, "No value in message"); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } } } diff --git a/apps/aqhome-data/s_updatedata.c b/apps/aqhome-data/s_updatedata.c index 6546073..671cd17 100644 --- a/apps/aqhome-data/s_updatedata.c +++ b/apps/aqhome-data/s_updatedata.c @@ -53,60 +53,62 @@ static void _sendDataChangedMsgToAllClients(AQHOME_SERVER *xo, AQH_OBJECT *epSrc void AqHomeDataServer_HandleUpdateData(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQHOME_SERVER *xo; - - xo=AqHomeDataServer_GetServerData(o); - if (xo) { - AQH_MESSAGE *outMsg; - int resultCode=AQH_MSGDATA_RESULT_SUCCESS; - AQH_VALUE *recvdValue; - - recvdValue=AQH_IpcdMessageMultiData_ReadValue(tagList); - if (recvdValue) { - const char *valueName; - const uint64_t *dataPoints=NULL; - uint64_t numberOfPoints=0; - - valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; - AQH_IpcdMessageMultiData_ReadDatapoints(tagList, &dataPoints, &numberOfPoints); - if (numberOfPoints>0) { - AQH_VALUE *value; - - value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - if (value) { - if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_ADDDATA) { - resultCode=_storeDataPoints(xo, value, dataPoints, numberOfPoints); - if (resultCode==AQH_MSGDATA_RESULT_SUCCESS) - _sendDataChangedMsgToAllClients(xo, ep, value, dataPoints, numberOfPoints); + if (tagList) { + AQHOME_SERVER *xo; + + xo=AqHomeDataServer_GetServerData(o); + if (xo) { + AQH_MESSAGE *outMsg; + int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + AQH_VALUE *recvdValue; + + recvdValue=AQH_IpcdMessageMultiData_ReadValue(tagList); + if (recvdValue) { + const char *valueName; + const uint64_t *dataPoints=NULL; + uint64_t numberOfPoints=0; + + valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; + AQH_IpcdMessageMultiData_ReadDatapoints(tagList, &dataPoints, &numberOfPoints); + if (numberOfPoints>0) { + AQH_VALUE *value; + + value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + if (value) { + if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_ADDDATA) { + resultCode=_storeDataPoints(xo, value, dataPoints, numberOfPoints); + if (resultCode==AQH_MSGDATA_RESULT_SUCCESS) + _sendDataChangedMsgToAllClients(xo, ep, value, dataPoints, numberOfPoints); + } + else { + DBG_INFO(NULL, "No permissions to add data to value \"%s\"", valueName); + resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; + } } else { - DBG_INFO(NULL, "No permissions to add data to value \"%s\"", valueName); + DBG_INFO(NULL, "No permissions to add/create value \"%s\"", valueName); resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; } } else { - DBG_INFO(NULL, "No permissions to add/create value \"%s\"", valueName); - resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; + DBG_INFO(NULL, "No datapoints"); + resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } + AQH_Value_free(recvdValue); } else { - DBG_INFO(NULL, "No datapoints"); + DBG_INFO(NULL, "No value"); resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } - AQH_Value_free(recvdValue); + + outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, + AQH_IPC_PROTOCOL_DATA_VERSION, + AQH_MSGTYPE_IPC_DATA_RESULT, + AQH_Endpoint_GetNextMessageId(ep), + AQH_IpcMessage_GetMsgId(msg), + resultCode, NULL); + AQH_Endpoint_AddMsgOut(ep, outMsg); } - else { - DBG_INFO(NULL, "No value"); - resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; - } - - outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, - AQH_IPC_PROTOCOL_DATA_VERSION, - AQH_MSGTYPE_IPC_DATA_RESULT, - AQH_Endpoint_GetNextMessageId(ep), - AQH_IpcMessage_GetMsgId(msg), - resultCode, NULL); - AQH_Endpoint_AddMsgOut(ep, outMsg); } } diff --git a/apps/aqhome-data/server.c b/apps/aqhome-data/server.c index 3a3c313..55e7d85 100644 --- a/apps/aqhome-data/server.c +++ b/apps/aqhome-data/server.c @@ -423,34 +423,32 @@ void _handleMsgsFromClient(AQH_OBJECT *o, AQHOME_SERVER *xo, AQH_OBJECT *ep) void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) { GWEN_TAG16_LIST *tagList; + uint16_t code; + uint8_t protoId; tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); - if (tagList) { - uint16_t code; - uint8_t protoId; - code=AQH_IpcMessage_GetCode(msg); - protoId=AQH_IpcMessage_GetProtoId(msg); - if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { - DBG_INFO(NULL, "Received IPC packet %d (%x)", (int) code, code); - switch(code) { - case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeDataServer_HandleConnect(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeDataServer_HandleUpdateData(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeDataServer_HandleGetValues(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeDataServer_HandleGetDataPoints(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeDataServer_HandleSetData(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_ADDVALUE: AqHomeDataServer_HandleAddValue(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE: AqHomeDataServer_HandleAnnounceValue(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ: AqHomeDataServer_HandleGetDevices(o, ep, msg, tagList); break; - case AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ: AqHomeDataServer_HandleModDevice(o, ep, msg, tagList); break; - default: break; - } + code=AQH_IpcMessage_GetCode(msg); + protoId=AQH_IpcMessage_GetProtoId(msg); + if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { + DBG_INFO(NULL, "Received IPC packet %d (%x)", (int) code, code); + switch(code) { + case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeDataServer_HandleConnect(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeDataServer_HandleUpdateData(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeDataServer_HandleGetValues(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeDataServer_HandleGetDataPoints(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeDataServer_HandleSetData(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_ADDVALUE: AqHomeDataServer_HandleAddValue(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE: AqHomeDataServer_HandleAnnounceValue(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ: AqHomeDataServer_HandleGetDevices(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ: AqHomeDataServer_HandleModDevice(o, ep, msg, tagList); break; + default: break; } - else { - DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); - } - GWEN_Tag16_List_free(tagList); } + else { + DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); + } + GWEN_Tag16_List_free(tagList); } diff --git a/apps/aqhome-nodes/r_connect.c b/apps/aqhome-nodes/r_connect.c index 4559baf..3b799f7 100644 --- a/apps/aqhome-nodes/r_connect.c +++ b/apps/aqhome-nodes/r_connect.c @@ -31,50 +31,51 @@ void AQH_NodeServer_HandleConnect(GWEN_UNUSED AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - AQH_MESSAGE *outMsg; - int resultCode=AQH_MSGDATA_RESULT_SUCCESS; - char *clientId=NULL; - char *userId=NULL; - char *passw=NULL; - uint32_t flags; - - clientId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_CLIENTID, NULL); - userId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_USERID, NULL); - flags=AQH_Tag16_GetTagDataAsUint32(tagList, AQH_MSG_CONNECT_TAGS_FLAGS, 0); - passw=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_PASSWORD, NULL); - - if (clientId) - AQH_Endpoint_SetServiceName(ep, clientId); - if (userId) - AQH_Endpoint_SetUserName(ep, userId); - - if (flags & AQH_MSG_CONNECT_FLAGS_WANTUPDATES) - AQH_Endpoint_AddFlags(ep, AQH_ENDPOINT_FLAGS_WANTUPDATES); - - /* TODO: add user management, for now we allow all */ - AQH_Endpoint_SetPermissions(ep, - AQH_ENDPOINT_PERMS_LISTVALUES | - AQH_ENDPOINT_PERMS_READVALUE | - AQH_ENDPOINT_PERMS_ADDVALUE | - AQH_ENDPOINT_PERMS_LISTDATA | - AQH_ENDPOINT_PERMS_READDATA | - AQH_ENDPOINT_PERMS_ADDDATA | - AQH_ENDPOINT_PERMS_LISTDEVICES | - AQH_ENDPOINT_PERMS_READDEVICE | - AQH_ENDPOINT_PERMS_ADDDEVICE | - AQH_ENDPOINT_PERMS_MODDEVICE); - free(passw); - free(userId); - free(clientId); - - outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_NODES_ID, - AQH_IPC_PROTOCOL_NODES_VERSION, - AQH_MSGTYPE_IPC_NODES_RESULT, - AQH_Endpoint_GetNextMessageId(ep), - AQH_IpcMessage_GetMsgId(msg), - resultCode, NULL); - AQH_Endpoint_AddMsgOut(ep, outMsg); - DBG_ERROR(NULL, "Client connected"); + if (tagList) { + AQH_MESSAGE *outMsg; + int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + char *clientId=NULL; + char *userId=NULL; + char *passw=NULL; + uint32_t flags; + + clientId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_CLIENTID, NULL); + userId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_USERID, NULL); + flags=AQH_Tag16_GetTagDataAsUint32(tagList, AQH_MSG_CONNECT_TAGS_FLAGS, 0); + passw=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_PASSWORD, NULL); + + if (clientId) + AQH_Endpoint_SetServiceName(ep, clientId); + if (userId) + AQH_Endpoint_SetUserName(ep, userId); + + if (flags & AQH_MSG_CONNECT_FLAGS_WANTUPDATES) + AQH_Endpoint_AddFlags(ep, AQH_ENDPOINT_FLAGS_WANTUPDATES); + + /* TODO: add user management, for now we allow all */ + AQH_Endpoint_SetPermissions(ep, + AQH_ENDPOINT_PERMS_LISTVALUES | + AQH_ENDPOINT_PERMS_READVALUE | + AQH_ENDPOINT_PERMS_ADDVALUE | + AQH_ENDPOINT_PERMS_LISTDATA | + AQH_ENDPOINT_PERMS_READDATA | + AQH_ENDPOINT_PERMS_ADDDATA | + AQH_ENDPOINT_PERMS_LISTDEVICES | + AQH_ENDPOINT_PERMS_READDEVICE | + AQH_ENDPOINT_PERMS_ADDDEVICE | + AQH_ENDPOINT_PERMS_MODDEVICE); + free(passw); + free(userId); + free(clientId); + + outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_NODES_ID, + AQH_IPC_PROTOCOL_NODES_VERSION, + AQH_MSGTYPE_IPC_NODES_RESULT, + AQH_Endpoint_GetNextMessageId(ep), + AQH_IpcMessage_GetMsgId(msg), + resultCode, NULL); + AQH_Endpoint_AddMsgOut(ep, outMsg); + } }