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"
+ ""
+ "| Name For System | "
+ "Room | "
+ "Location | "
+ "Description | "
+ "Type | "
+ "Driver | "
+ "Name | "
+ "GUI Name | "
+ "Manufacturer | "
+ "
\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?s:"");
+ /* room */
+ s=AQH_Device_GetRoomName(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* location */
+ s=AQH_Device_GetLocation(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* description */
+ s=AQH_Device_GetDescription(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* device type */
+ s=AQH_Device_GetDeviceType(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* driver */
+ s=AQH_Device_GetDriver(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* short device name */
+ s=AQH_Device_GetName(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* GUI name for device */
+ s=AQH_Device_GetNameForGui(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+ /* manufacturer */
+ s=AQH_Device_GetManufacturer(device);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+
+ GWEN_Buffer_AppendArgs(dbuf, "
");
+ device=AQH_Device_List_Next(device);
+ }
+
+ GWEN_Buffer_AppendString(dbuf,
+ "\n"
+ "
\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"
+ ""
+ ""
+ "| Name | "
+ "Type | "
+ "Driver | "
+ "Device | "
+ "Name for System | "
+ "
"
+ "\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:"");
+
+ s=AQH_ValueType_toString(AQH_Value_GetValueType(value));
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+
+ s=AQH_Value_GetDriver(value);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+
+ s=AQH_Value_GetDeviceNameForSystem(value);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+
+ s=AQH_Value_GetNameForSystem(value);
+ GWEN_Buffer_AppendArgs(dbuf, "%s | ", s?s:"");
+
+ GWEN_Buffer_AppendArgs(dbuf, "
\n");
+
+ value=AQH_Value_List_Next(value);
+ }
+ GWEN_Buffer_AppendString(dbuf,
+ "\n"
+ "
\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
+