diff --git a/apps/aqhome-cgi/main.c b/apps/aqhome-cgi/main.c index b02433b..a53bded 100644 --- a/apps/aqhome-cgi/main.c +++ b/apps/aqhome-cgi/main.c @@ -108,10 +108,12 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles { AQH_MODULE *mRoot; AQH_MODULE *mParent; + AQH_SESSION *session; const GWEN_STRINGLIST *sl; mRoot=AQH_ModRoot_new(sv, sPathStaticFiles); mParent=mRoot; + session=AQH_ModService_ReadSession(mRoot, rq); sl=AQCGI_Request_GetStringlistPath(rq); if (sl) { @@ -129,8 +131,9 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles AQH_MODULE *m; DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last"); - m=AQH_ModService_LoadSubModule(mParent, rq, s); - if (m==NULL) { + m=AQH_ModService_LoadSubModule(mParent, rq, session, s); + if (m==NULL) { + AQH_Session_free(session); AQH_Module_free(mRoot); AQCGI_SendResponseWithStatus(rq, 404, "Not found"); return GWEN_ERROR_GENERIC; @@ -141,9 +144,10 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles int rv; /* last, let module handle remaining part */ - rv=AQH_ModService_HandleRequest(mParent, rq, s); + rv=AQH_ModService_HandleRequest(mParent, rq, session, s); if (rv<0) { DBG_INFO(NULL, "here (%d)", rv); + AQH_Session_free(session); AQH_Module_free(mRoot); return rv; } @@ -153,10 +157,12 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles se=seNext; } + AQH_Session_free(session); AQH_Module_free(mRoot); return 0; } else { + AQH_Session_free(session); AQH_Module_free(mRoot); return GWEN_ERROR_GENERIC; } diff --git a/apps/aqhome-cgi/modules/0BUILD b/apps/aqhome-cgi/modules/0BUILD index ac02ab6..ebed6f4 100644 --- a/apps/aqhome-cgi/modules/0BUILD +++ b/apps/aqhome-cgi/modules/0BUILD @@ -20,7 +20,7 @@ - + $(visibility_cflags) @@ -51,6 +51,8 @@ mservice.h mroot.h + mdataclient.h + mdevices.h @@ -65,6 +67,8 @@ mservice.c mroot.c + mdataclient.c + mdevices.c diff --git a/apps/aqhome-cgi/modules/mdataclient.c b/apps/aqhome-cgi/modules/mdataclient.c new file mode 100644 index 0000000..ddacf8d --- /dev/null +++ b/apps/aqhome-cgi/modules/mdataclient.c @@ -0,0 +1,107 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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 "./mdataclient.h" + +#include "aqhome-cgi/service/module.h" + +#include "aqhome/msg/ipc/m_ipc.h" +#include "aqhome/msg/ipc/data/m_ipcd.h" + +#include +#include + + + +/* ------------------------------------------------------------------------------------------------ + * defs and enums + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * global vars + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * code + * ------------------------------------------------------------------------------------------------ + */ + +void AQH_ModDataClient_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder) +{ + + AQH_ModService_Extend(m, sv, baseFolder); +} + + + +int AQH_ModDataClient_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_MODDATACLIENT_RUN_FN runFn) +{ + AQH_EVENT_LOOP *eventLoop; + AQH_DATACLIENT *dc; + GWEN_BUFFER *dbuf; + int rv; + + rv=AQH_Init(); + if (rv<0) { + DBG_ERROR(NULL, "here (%d)", rv); + AQCGI_SendResponseWithStatus(rq, 500, "Internal Error"); + return rv; + } + + eventLoop=AQH_EventLoop_new(); + dc=AQH_DataClient_new(eventLoop, AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION); + rv=AQH_DataClient_ReadConfigFile(dc); + if (rv<0) { + DBG_ERROR(NULL, "here (%d)", rv); + AQCGI_SendResponseWithStatus(rq, 500, "Internal Error"); + AQH_Session_free(session); + return rv; + } + + rv=AQH_DataClient_ConnectWithArgs(dc, 0); + if (rv<0) { + DBG_ERROR(NULL, "Error connecting (%d)", rv); + AQH_DataClient_free(dc); + AQH_EventLoop_free(eventLoop); + AQCGI_SendResponseWithStatus(rq, 500, "Internal Error"); + AQH_Session_free(session); + return GWEN_ERROR_GENERIC; + } + + dbuf=GWEN_Buffer_new(0, 256, 0, 1); + AQH_ModService_AddHeader(m, "en", dbuf); + if (runFn) + runFn(m, rq, session, dc, dbuf); + AQH_ModService_AddFooter(m, "en", dbuf); + AQCGI_Request_SetBufferResponseBody(rq, dbuf); + AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html"); + AQCGI_SendResponseWithStatus(rq, 200, "Ok"); + GWEN_Buffer_free(dbuf); + + AQH_DataClient_free(dc); + AQH_EventLoop_free(eventLoop); + AQH_Session_free(session); + + AQH_Fini(); + return 0; +} + + + diff --git a/apps/aqhome-cgi/modules/mdataclient.h b/apps/aqhome-cgi/modules/mdataclient.h new file mode 100644 index 0000000..7ac5d82 --- /dev/null +++ b/apps/aqhome-cgi/modules/mdataclient.h @@ -0,0 +1,33 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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_CGI_MDATACLIENT_H +#define AQHOME_CGI_MDATACLIENT_H + +#include + +#include + +#include "aqhome/aqhome.h" +#include "aqhome/dataclient/client.h" + +#include + + + +typedef void (*AQH_MODDATACLIENT_RUN_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); + + +void AQH_ModDataClient_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder); +int AQH_ModDataClient_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_MODDATACLIENT_RUN_FN runFn); + + + + +#endif + diff --git a/apps/aqhome-cgi/modules/mdevices.c b/apps/aqhome-cgi/modules/mdevices.c new file mode 100644 index 0000000..553c840 --- /dev/null +++ b/apps/aqhome-cgi/modules/mdevices.c @@ -0,0 +1,229 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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 "./mroot_p.h" +#include "./mdevices.h" + +#include "aqhome-cgi/service/module.h" +#include "aqhome-cgi/modules/mdataclient.h" + +#include +#include +#include + + + +/* ------------------------------------------------------------------------------------------------ + * defs and enums + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * global vars + * ------------------------------------------------------------------------------------------------ + */ + +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + +static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName); +static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem); +static void _runIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); +static void _runValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf); + + +/* ------------------------------------------------------------------------------------------------ + * code + * ------------------------------------------------------------------------------------------------ + */ + +void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder) +{ + AQH_ModService_Extend(m, sv, baseFolder); + AQH_ModService_SetHandleRequestFn(m, _handleRequest); + AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule); +} + + + +AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName) +{ + return NULL; +} + + + +int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) +{ + if (strcasecmp(sLastPathElem, "index.html")==0) + return AQH_ModDataClient_HandleRequest(m, rq, session, _runIndex); + else if (strcasecmp(sLastPathElem, "values.html")==0) + return AQH_ModDataClient_HandleRequest(m, rq, session, _runValues); + else { + AQCGI_SendResponseWithStatus(rq, 404, "Not Found"); + return GWEN_ERROR_NOT_IMPLEMENTED; + } +} + + + +void _runIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf) +{ + AQH_DEVICE_LIST *deviceList; + AQH_DEVICE *device; + + deviceList=AQH_DataClient_GetDevices(dc, NULL); + if (deviceList==NULL) { + DBG_ERROR(NULL, "No device received"); + GWEN_Buffer_AppendString(dbuf, "Empty device list."); + return; + } + + GWEN_Buffer_AppendString(dbuf, "

Devices

\n"); + GWEN_Buffer_AppendString(dbuf, + "\n" + "\n" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "\n" + "\n" + "\n"); + + device=AQH_Device_List_First(deviceList); + while(device) { + const char *s; + + GWEN_Buffer_AppendArgs(dbuf, ""); + /* name for system */ + s=AQH_Device_GetNameForSystem(device); + GWEN_Buffer_AppendString(dbuf,"", s?s:""); + /* room */ + s=AQH_Device_GetRoomName(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* location */ + s=AQH_Device_GetLocation(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* description */ + s=AQH_Device_GetDescription(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* device type */ + s=AQH_Device_GetDeviceType(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* driver */ + s=AQH_Device_GetDriver(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* short device name */ + s=AQH_Device_GetName(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* GUI name for device */ + s=AQH_Device_GetNameForGui(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + /* manufacturer */ + s=AQH_Device_GetManufacturer(device); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + GWEN_Buffer_AppendArgs(dbuf, ""); + device=AQH_Device_List_Next(device); + } + + GWEN_Buffer_AppendString(dbuf, + "\n" + "
Name For SystemRoomLocationDescriptionTypeDriverNameGUI NameManufacturer
%s%s%s%s%s%s%s%s%s
\n"); + + AQH_Device_List_free(deviceList); +} + + + +void _runValues(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf) +{ + GWEN_DB_NODE *dbQuery; + const char *sDeviceName; + + dbQuery=AQCGI_Request_GetDbQuery(rq); + sDeviceName=GWEN_DB_GetCharValue(dbQuery, "device", 0, NULL); + if (!(sDeviceName && *sDeviceName)) + _runIndex(m, rq, session, dc, dbuf); + else { + AQH_VALUE_LIST *valueList; + + valueList=AQH_DataClient_GetValues(dc, sDeviceName, 0); + if (valueList) { + AQH_VALUE *value; + + GWEN_Buffer_AppendArgs(dbuf, "

Values for Device %s

\n", sDeviceName); + GWEN_Buffer_AppendString(dbuf, + "\n" + "" + "" + "" + "" + "" + "" + "" + "" + "\n" + "\n"); + + value=AQH_Value_List_First(valueList); + while(value) { + const char *s; + + GWEN_Buffer_AppendString(dbuf, ""); + + s=AQH_Value_GetName(value); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + s=AQH_ValueType_toString(AQH_Value_GetValueType(value)); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + s=AQH_Value_GetDriver(value); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + s=AQH_Value_GetDeviceNameForSystem(value); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + s=AQH_Value_GetNameForSystem(value); + GWEN_Buffer_AppendArgs(dbuf, "", s?s:""); + + GWEN_Buffer_AppendArgs(dbuf, "\n"); + + value=AQH_Value_List_Next(value); + } + GWEN_Buffer_AppendString(dbuf, + "\n" + "
NameTypeDriverDeviceName for System
%s%s%s%s%s
\n"); + AQH_Value_List_free(valueList); + } + } +} + + + + + + + + diff --git a/apps/aqhome-cgi/modules/mdevices.h b/apps/aqhome-cgi/modules/mdevices.h new file mode 100644 index 0000000..e61cbb1 --- /dev/null +++ b/apps/aqhome-cgi/modules/mdevices.h @@ -0,0 +1,28 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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_CGI_MODULES_DEVICES_H +#define AQHOME_CGI_MODULES_DEVICES_H + + +#include "aqhome/aqhome.h" +#include "aqhome/dataclient/client.h" + +#include + +#include + + +void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder); + + + + + +#endif + diff --git a/apps/aqhome-cgi/modules/mroot.c b/apps/aqhome-cgi/modules/mroot.c index 24e4375..5e2352f 100644 --- a/apps/aqhome-cgi/modules/mroot.c +++ b/apps/aqhome-cgi/modules/mroot.c @@ -14,6 +14,7 @@ #include "./mroot_p.h" #include "aqhome-cgi/service/module.h" +#include "aqhome-cgi/modules/mdevices.h" #include #include @@ -35,8 +36,9 @@ * ------------------------------------------------------------------------------------------------ */ -static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName); -static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem); +static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName); +static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem); +static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq); static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq); static int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq); static AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq); @@ -51,7 +53,8 @@ AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder) { AQH_MODULE *m; - m=AQH_ModService_new(sv, baseFolder); + m=AQH_Module_new(); + AQH_ModService_Extend(m, sv, baseFolder); AQH_ModService_SetHandleRequestFn(m, _handleRequest); AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule); @@ -60,14 +63,34 @@ AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder) -AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName) +AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName) { + AQH_SERVICE *sv; + + sv=AQH_ModService_GetService(m); + if (strcasecmp(sModuleName, "devices")==0) { + AQH_MODULE *mSub; + + mSub=AQH_Service_LoadModule(sv, sModuleName); + if (mSub) { + const char *s; + GWEN_BUFFER *nbuf; + + nbuf=GWEN_Buffer_new(0, 256, 0, 1); + s=AQH_ModService_GetBaseFolder(m); + GWEN_Buffer_AppendArgs(nbuf, "%s/devices", s?s:"."); + + AQH_ModDevices_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf)); + GWEN_Buffer_free(nbuf); + return mSub; + } + } return NULL; } -int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem) +int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) { if (strcasecmp(sLastPathElem, "login")==0) return _handleRqLogin(m, rq); @@ -79,6 +102,8 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem) AQCGI_SendResponseWithStatus(rq, 501, "Not Implemented"); return GWEN_ERROR_NOT_IMPLEMENTED; } + else if (strcasecmp(sLastPathElem, "index.html")==0) + return _handleRqIndex(m, rq); else { AQCGI_SendResponseWithStatus(rq, 404, "Not Found"); return GWEN_ERROR_NOT_IMPLEMENTED; @@ -87,6 +112,16 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem) +int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq) +{ + if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) + return AQH_ModService_RespondWithFile(m, rq, "en", "index.html"); + AQCGI_SendResponseWithStatus(rq, 404, "Not Found"); + return GWEN_ERROR_GENERIC; +} + + + int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq) { int rv; @@ -218,6 +253,7 @@ AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq) } buf=GWEN_Buffer_new(0, 256, 0, 1); AQCGI_HashMd256ToBuffer(sPasswd, buf); + DBG_ERROR(NULL, "Password: [%s]", sPasswd); // TODO: Remove!!! DBG_ERROR(NULL, "Hashed password: [%s]", GWEN_Buffer_GetStart(buf)); if (strcasecmp(GWEN_Buffer_GetStart(buf), hashedPaswd)!=0) { DBG_ERROR(NULL, "Bad password for user \"%s\"", sUserName); diff --git a/apps/aqhome-cgi/modules/mservice.c b/apps/aqhome-cgi/modules/mservice.c index 7d1c9dd..4e68ebe 100644 --- a/apps/aqhome-cgi/modules/mservice.c +++ b/apps/aqhome-cgi/modules/mservice.c @@ -52,19 +52,15 @@ static void GWENHYWFAR_CB _freeData(void *bp, void *p); * ------------------------------------------------------------------------------------------------ */ -AQH_MODULE *AQH_ModService_new(AQH_SERVICE *sv, const char *baseFolder) +void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder) { - AQH_MODULE *m; AQH_MOD_SERVICE *xm; - m=AQH_Module_new(); GWEN_NEW_OBJECT(AQH_MOD_SERVICE, xm); GWEN_INHERIT_SETDATA(AQH_MODULE, AQH_MOD_SERVICE, m, xm, _freeData); xm->service=sv; xm->baseFolder=(baseFolder && *baseFolder)?strdup(baseFolder):NULL; - - return m; } @@ -138,56 +134,76 @@ void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODU -int AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf) +void AQH_ModService_SetAddHeaderFn(AQH_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn) { - if (m && dbuf) { - AQH_MODULE *mParent; + if (m) { + AQH_MOD_SERVICE *xm; - mParent=AQH_Module_Tree2_GetParent(m); - if (mParent) { - int rv; - - rv=AQH_ModService_AddHeader(mParent, lang, dbuf); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; - } + xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); + if (xm) { + xm->addHeaderFn=fn; } - return AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_HEADERFILE, dbuf); } - DBG_ERROR(NULL, "Argument missing"); - return GWEN_ERROR_INVALID; } -int AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf) +void AQH_ModService_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn) +{ + if (m) { + AQH_MOD_SERVICE *xm; + + xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); + if (xm) { + xm->addFooterFn=fn; + } + } +} + + + +void AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf) { if (m && dbuf) { - AQH_MODULE *mParent; - int rv; + AQH_MOD_SERVICE *xm; - rv=AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; - } + xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); + if (xm) { + if (xm->addHeaderFn) + xm->addHeaderFn(m, lang, dbuf); + else { + AQH_MODULE *mParent; - mParent=AQH_Module_Tree2_GetParent(m); - if (mParent) { - int rv; - - rv=AQH_ModService_AddFooter(mParent, lang, dbuf); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; + mParent=AQH_Module_Tree2_GetParent(m); + if (mParent) + AQH_ModService_AddHeader(mParent, lang, dbuf); + AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_HEADERFILE, dbuf); } } - return 0; } - else { - DBG_ERROR(NULL, "Argument missing"); - return GWEN_ERROR_INVALID; +} + + + +void AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf) +{ + if (m && dbuf) { + AQH_MOD_SERVICE *xm; + + xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); + if (xm) { + if (xm->addFooterFn) + xm->addFooterFn(m, lang, dbuf); + else { + AQH_MODULE *mParent; + + AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf); + + mParent=AQH_Module_Tree2_GetParent(m); + if (mParent) + AQH_ModService_AddFooter(mParent, lang, dbuf); + } + } } } @@ -199,24 +215,14 @@ int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char int rv; buf=GWEN_Buffer_new(0, 256, 0, 1); - rv=AQH_ModService_AddHeader(m, lang, buf); - if (rv<0) { - AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); - GWEN_Buffer_free(buf); - return GWEN_ERROR_INTERNAL; - } + AQH_ModService_AddHeader(m, lang, buf); rv=AQH_ModService_ReadStaticFile(m, lang, sFilename, buf); if (rv<0) { AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); GWEN_Buffer_free(buf); return GWEN_ERROR_INTERNAL; } - rv=AQH_ModService_AddFooter(m, lang, buf); - if (rv<0) { - AQCGI_SendResponseWithStatus(rq, 500, "Internal error"); - GWEN_Buffer_free(buf); - return GWEN_ERROR_INTERNAL; - } + AQH_ModService_AddFooter(m, lang, buf); AQCGI_Request_SetBufferResponseBody(rq, buf); AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html"); AQCGI_SendResponseWithStatus(rq, 200, "Ok"); @@ -226,28 +232,28 @@ int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char -int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem) +int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem) { if (m) { AQH_MOD_SERVICE *xm; xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); if (xm && xm->handleRequestFn) - return xm->handleRequestFn(m, rq, sLastPathElem); + return xm->handleRequestFn(m, rq, session, sLastPathElem); } return GWEN_ERROR_NOT_IMPLEMENTED; } -AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName) +AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName) { if (m) { AQH_MOD_SERVICE *xm; xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m); if (xm && xm->loadSubModuleFn) - return xm->loadSubModuleFn(m, rq, sModuleName); + return xm->loadSubModuleFn(m, rq, session, sModuleName); } return NULL; } @@ -287,5 +293,50 @@ int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *f +AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq) +{ + AQH_SERVICE *sv; + GWEN_DB_NODE *db; + const char *s; + + sv=AQH_ModService_GetService(m); + db=AQCGI_Request_GetDbRequestHeader(rq); + s=GWEN_DB_GetCharValue(db, "cookies/session", 0, NULL); + if (s && *s) { + AQH_SESSION *session; + + session=AQH_Service_LoadSession(sv, s); + if (session==NULL) { + DBG_ERROR(NULL, "Session \"%s\" not found", s); + return NULL; + } + else { + const char *sUserName; + + sUserName=AQH_Session_GetUserAlias(session); + if (sUserName && *sUserName) { + AQH_USER *user; + + user=AQH_Service_LoadUser(sv, sUserName); + if (user==NULL) { + DBG_ERROR(NULL, "User \"%s\" not found", sUserName); + AQH_Session_free(session); + return NULL; + } + AQH_Session_SetUser(session, user); + } + return session; + } + } + else { + DBG_ERROR(NULL, "No session cookie"); + } + return NULL; +} + + + + + diff --git a/apps/aqhome-cgi/modules/mservice.h b/apps/aqhome-cgi/modules/mservice.h index 6bc7024..a511996 100644 --- a/apps/aqhome-cgi/modules/mservice.h +++ b/apps/aqhome-cgi/modules/mservice.h @@ -11,28 +11,34 @@ #include #include +#include #include #include -typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem); -typedef AQH_MODULE* (*AQH_MODSERVICE_LOADSUBMODULE_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName); +typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem); +typedef AQH_MODULE* (*AQH_MODSERVICE_LOADSUBMODULE_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName); +typedef void (*AQH_MODSERVICE_ADDHEADER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); +typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); -AQH_MODULE *AQH_ModService_new(AQH_SERVICE *sv, const char *baseFolder); +void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder); AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m); const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m); -int AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); -int AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); +void AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); +void AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf); + +AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName); +int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem); + +AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq); -AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName); -int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem); int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename); int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf); @@ -41,6 +47,9 @@ int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *f void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn); void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn); +void AQH_ModService_SetAddHeaderFn(AQH_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn); +void AQH_ModService_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn); + #endif diff --git a/apps/aqhome-cgi/modules/mservice_p.h b/apps/aqhome-cgi/modules/mservice_p.h index 45a460a..bda04cd 100644 --- a/apps/aqhome-cgi/modules/mservice_p.h +++ b/apps/aqhome-cgi/modules/mservice_p.h @@ -19,6 +19,8 @@ struct AQH_MOD_SERVICE { AQH_MODSERVICE_HANDLEREQUEST_FN handleRequestFn; AQH_MODSERVICE_LOADSUBMODULE_FN loadSubModuleFn; + AQH_MODSERVICE_ADDHEADER_FN addHeaderFn; + AQH_MODSERVICE_ADDFOOTER_FN addFooterFn; }; diff --git a/apps/aqhome-cgi/modules/static/en/0BUILD b/apps/aqhome-cgi/modules/static/en/0BUILD index d99dbf2..532e9c2 100644 --- a/apps/aqhome-cgi/modules/static/en/0BUILD +++ b/apps/aqhome-cgi/modules/static/en/0BUILD @@ -6,6 +6,7 @@ header.html footer.html login.html + index.html diff --git a/apps/aqhome-cgi/modules/static/en/index.html b/apps/aqhome-cgi/modules/static/en/index.html new file mode 100644 index 0000000..2aa3019 --- /dev/null +++ b/apps/aqhome-cgi/modules/static/en/index.html @@ -0,0 +1,6 @@ + + +

AqHome Main Page

+ +

Nothing to see for now

+