aqhome-cgi: rewrite of the page module.
This commit is contained in:
211
apps/aqhome-cgi/modules/devices/mdevices_pagectx.c
Normal file
211
apps/aqhome-cgi/modules/devices/mdevices_pagectx.c
Normal file
@@ -0,0 +1,211 @@
|
||||
/****************************************************************************
|
||||
* This file is part of the project AqHome.
|
||||
* AqHome (c) by 2026 Martin Preuss, all rights reserved.
|
||||
*
|
||||
* The license for this file can be found in the file COPYING which you
|
||||
* should have received along with this file.
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include "./mdevices_pagectx_p.h"
|
||||
|
||||
#include <gwenhywfar/misc.h>
|
||||
#include <gwenhywfar/text.h>
|
||||
#include <gwenhywfar/debug.h>
|
||||
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* global vars
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
GWEN_TREE2_FUNCTIONS(AQH_MD_PAGECTX, AQH_MDPageCtx);
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* forward declarations
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int _valueMatches(const AQH_VALUE *value, int varType, const char *room, int modality, const char *vname);
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* code
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
AQH_MD_PAGECTX *AQH_MDPageCtx_new(AQCGI_MODULE *module, AQH_DATACLIENT *dataClient)
|
||||
{
|
||||
AQH_MD_PAGECTX *ctx;
|
||||
|
||||
GWEN_NEW_OBJECT(AQH_MD_PAGECTX, ctx);
|
||||
if (ctx) {
|
||||
GWEN_TREE2_INIT(AQH_MD_PAGECTX, ctx, AQH_MDPageCtx);
|
||||
ctx->module=module;
|
||||
ctx->dataClient=dataClient;
|
||||
ctx->dbVars=GWEN_DB_Group_new("vars");
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AQH_MDPageCtx_free(AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
if (ctx) {
|
||||
GWEN_DB_Group_free(ctx->dbVars);
|
||||
AQH_Value_List_free(ctx->valueList);
|
||||
GWEN_TREE2_FINI(AQH_MD_PAGECTX, ctx, AQH_MDPageCtx);
|
||||
GWEN_FREE_OBJECT(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_MD_PAGECTX *AQH_MDPageCtx_CopyWithMatchingVars(const AQH_MD_PAGECTX *octx,
|
||||
int varType, const char *room, int modality, const char *vname)
|
||||
{
|
||||
AQH_MD_PAGECTX *ctx=NULL;
|
||||
|
||||
if (octx) {
|
||||
ctx=AQH_MDPageCtx_new(octx->module, octx->dataClient);
|
||||
if (ctx) {
|
||||
/* copy dbVars */
|
||||
GWEN_DB_Group_free(ctx->dbVars);
|
||||
ctx->dbVars=GWEN_DB_Group_dup(octx->dbVars);
|
||||
/* copy device list */
|
||||
ctx->deviceList=octx->deviceList;
|
||||
/* copy matching values from value list */
|
||||
if (octx->valueList) {
|
||||
AQH_VALUE_LIST *valueList;
|
||||
const AQH_VALUE *vSrc;
|
||||
|
||||
DBG_ERROR(NULL, "Copying values");
|
||||
valueList=AQH_Value_List_new();
|
||||
vSrc=AQH_Value_List_First(octx->valueList);
|
||||
while(vSrc) {
|
||||
if (_valueMatches(vSrc, varType, room, modality, vname)) {
|
||||
AQH_VALUE *vDest;
|
||||
|
||||
DBG_ERROR(NULL, "+ %s", AQH_Value_GetNameForSystem(vSrc));
|
||||
vDest=AQH_Value_dup(vSrc);
|
||||
AQH_Value_List_Add(vDest, valueList);
|
||||
}
|
||||
vSrc=AQH_Value_List_Next(vSrc);
|
||||
}
|
||||
|
||||
AQH_Value_List_free(ctx->valueList);
|
||||
if (AQH_Value_List_GetCount(valueList))
|
||||
ctx->valueList=valueList;
|
||||
else
|
||||
AQH_Value_List_free(valueList);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int _valueMatches(const AQH_VALUE *value, int varType, const char *room, int modality, const char *vname)
|
||||
{
|
||||
int matches=1;
|
||||
|
||||
/* fast compares first */
|
||||
if ((varType!=AQH_ValueType_Unknown) && (AQH_Value_GetValueType(value)!=varType))
|
||||
matches=0;
|
||||
if (matches && modality && modality!=AQH_Value_GetModality(value))
|
||||
matches=0;
|
||||
/* then slower compares */
|
||||
if (matches && vname) {
|
||||
const char *sName;
|
||||
|
||||
sName=AQH_Value_GetNameForSystem(value);
|
||||
if (GWEN_Text_ComparePattern(sName, vname, 0)==-1)
|
||||
matches=0;
|
||||
}
|
||||
|
||||
if (matches && room) {
|
||||
const AQH_DEVICE *device;
|
||||
|
||||
device=AQH_Value_GetDevicePtr(value);
|
||||
if (device) {
|
||||
const char *s;
|
||||
|
||||
s=AQH_Device_GetRoomName(device);
|
||||
if (s && strcasecmp(s, room)!=0)
|
||||
matches=0;
|
||||
}
|
||||
}
|
||||
|
||||
return matches?1:0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const AQH_DEVICE_LIST *AQH_MDPageCtx_GetDevices(const AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
return ctx?ctx->deviceList:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AQH_MDPageCtx_SetDevices(AQH_MD_PAGECTX *ctx, const AQH_DEVICE_LIST *dList)
|
||||
{
|
||||
if (ctx)
|
||||
ctx->deviceList=dList;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_VALUE_LIST *AQH_MDPageCtx_GetValues(const AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
return ctx?ctx->valueList:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AQH_MDPageCtx_SetValues(AQH_MD_PAGECTX *ctx, AQH_VALUE_LIST *vList)
|
||||
{
|
||||
if (ctx)
|
||||
ctx->valueList=vList;
|
||||
}
|
||||
|
||||
|
||||
|
||||
GWEN_DB_NODE *AQH_MDPageCtx_GetDbVars(const AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
return ctx?ctx->dbVars:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQCGI_MODULE *AQH_MDPageCtx_GetModule(const AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
return ctx?ctx->module:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_DATACLIENT *AQH_MDPageCtx_GetDataClient(const AQH_MD_PAGECTX *ctx)
|
||||
{
|
||||
return ctx?ctx->dataClient:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user