Compare commits
256 Commits
0.3.0
...
mp-202608-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a386ac43ab | ||
|
|
2338f5333d | ||
|
|
91880f1cfb | ||
|
|
1e6a3f06d0 | ||
|
|
22e5e7853f | ||
|
|
3018b014bb | ||
|
|
1941b76aa7 | ||
|
|
c67fa6ebc9 | ||
|
|
b9f2d9e59a | ||
|
|
9d9ccbd46c | ||
|
|
568aec9c35 | ||
|
|
7ad51a251b | ||
|
|
dd58bac1a3 | ||
|
|
69a5f40e60 | ||
|
|
9c380316d2 | ||
|
|
f973ce1b14 | ||
|
|
296ead3241 | ||
|
|
f3820aee22 | ||
|
|
7bae2072aa | ||
|
|
44044e9bba | ||
|
|
928ebe1ec7 | ||
|
|
db53d0d905 | ||
|
|
bbb6c4ac7d | ||
|
|
273c8d215a | ||
|
|
e7f9bea979 | ||
|
|
3155c499ed | ||
|
|
1477293b49 | ||
|
|
5bf067166e | ||
|
|
a2da503e7d | ||
|
|
fe1937c9cd | ||
|
|
1cdec816f6 | ||
|
|
b961575906 | ||
|
|
27bb9d0f7f | ||
|
|
80259d39c9 | ||
|
|
3df7b69c2c | ||
|
|
e08054bbdf | ||
|
|
88a66f6822 | ||
|
|
d8498dceaf | ||
|
|
3286d8e1d7 | ||
|
|
f5c530507e | ||
|
|
56831ac53d | ||
|
|
0675538258 | ||
|
|
f81f031e23 | ||
|
|
ae2a0f33b0 | ||
|
|
391c49d647 | ||
|
|
6a8f4156a5 | ||
|
|
29d18e8732 | ||
|
|
07db3879a1 | ||
|
|
f4c60cf428 | ||
|
|
657853c1fe | ||
|
|
276127e139 | ||
|
|
a50c8da388 | ||
|
|
e811cf1a8d | ||
|
|
bafb9c289a | ||
|
|
a5559770ef | ||
|
|
9842d8a2e5 | ||
|
|
4dc2e0143f | ||
|
|
d51112e291 | ||
|
|
d4428128cb | ||
|
|
23cb3e62dc | ||
|
|
e6919677b3 | ||
|
|
db3f88f3af | ||
|
|
b863e29612 | ||
|
|
0ba4e879e6 | ||
|
|
f23806d884 | ||
|
|
cdb9da2f9e | ||
|
|
7a32f6deb7 | ||
|
|
cf2a0daae2 | ||
|
|
cbc3eab164 | ||
|
|
183adb192e | ||
|
|
b784f6bb45 | ||
|
|
3ae542f61b | ||
|
|
2974303007 | ||
|
|
343562f6ca | ||
|
|
fc2ef40d50 | ||
|
|
427d1e08f4 | ||
|
|
8488001f51 | ||
|
|
85b7b66db6 | ||
|
|
bda2a15da9 | ||
|
|
7ef6a22557 | ||
|
|
54ebc5ec69 | ||
|
|
b5c9557671 | ||
|
|
6117ce5cad | ||
|
|
c262c4a56a | ||
|
|
62741e1c16 | ||
|
|
f5ae108756 | ||
|
|
b8d2fc76eb | ||
|
|
03db148a3b | ||
|
|
5bb50d4187 | ||
|
|
62c86285f5 | ||
|
|
78ea72efe0 | ||
|
|
a65e6fbec2 | ||
|
|
776ec7a363 | ||
|
|
323122c4c7 | ||
|
|
a3220d74b1 | ||
|
|
710162e242 | ||
|
|
4b13f16e05 | ||
|
|
15edfd46e4 | ||
|
|
0c42acf76d | ||
|
|
311741ae64 | ||
|
|
4ad55e2c6e | ||
|
|
18e1751e14 | ||
|
|
b2e5be974e | ||
|
|
ed899dbe6f | ||
|
|
401cfc9ffb | ||
|
|
0c4a2aace9 | ||
|
|
73b7699054 | ||
|
|
79e7ac47d9 | ||
|
|
76def6c8dc | ||
|
|
a4722bc8f6 | ||
|
|
32061554c0 | ||
|
|
3d14c54df3 | ||
|
|
1b0d36b84d | ||
|
|
313b2c05a1 | ||
|
|
d54a259060 | ||
|
|
d07f411e51 | ||
|
|
b4ac70dbd1 | ||
|
|
d34062df39 | ||
|
|
b927bfdab6 | ||
|
|
39b3d4d174 | ||
|
|
0ec290e29c | ||
|
|
fc28a57b05 | ||
|
|
cd0d74d491 | ||
|
|
800b6d316e | ||
|
|
556cbb1d48 | ||
|
|
85a837d9ef | ||
|
|
6787b4f527 | ||
|
|
455b81d8eb | ||
|
|
41c947a486 | ||
|
|
afc6d3de24 | ||
|
|
8e6017a4ad | ||
|
|
2dec641f04 | ||
|
|
184195ba9f | ||
|
|
bb753b6009 | ||
|
|
d55c9b0cb7 | ||
|
|
dad807e7ad | ||
|
|
c165432c1c | ||
|
|
21b6a992ff | ||
|
|
35a45e5cb2 | ||
|
|
941948fc11 | ||
|
|
abe0bef99a | ||
|
|
22b3b14dfb | ||
|
|
f00b7975c0 | ||
|
|
97fd75e3ba | ||
|
|
33c750bb34 | ||
|
|
8a4b63422a | ||
|
|
781478d2d2 | ||
|
|
db97cf9644 | ||
|
|
d149c5667f | ||
|
|
b0d9c46d87 | ||
|
|
d236c9571e | ||
|
|
67e084b856 | ||
|
|
c746abcc0f | ||
|
|
c4af86c4f2 | ||
|
|
f154146b14 | ||
|
|
cc65fb8f0b | ||
|
|
245181112a | ||
|
|
5513878b24 | ||
|
|
31dca13123 | ||
|
|
d713e774ee | ||
|
|
c48423b4c1 | ||
|
|
6cb0ecd9ba | ||
|
|
80ac3cbebd | ||
|
|
8c077d2931 | ||
|
|
12a701014a | ||
|
|
d1c823c11e | ||
|
|
5300e50440 | ||
|
|
1c90e66f74 | ||
|
|
dfeedecf22 | ||
|
|
ce1fd901e7 | ||
|
|
5483df48cd | ||
|
|
c7f2206228 | ||
|
|
d50ff7f74f | ||
|
|
10496a67ef | ||
|
|
44a8acb845 | ||
|
|
538bb48968 | ||
|
|
c7de06f812 | ||
|
|
957c2ccc71 | ||
|
|
4d57f15dad | ||
|
|
0771986b28 | ||
|
|
bcbd777b8f | ||
|
|
636d6ce643 | ||
|
|
8a41b156aa | ||
|
|
c059b6aad3 | ||
|
|
43c69ca22e | ||
|
|
f98e591ca8 | ||
|
|
596def6e10 | ||
|
|
3c89a35645 | ||
|
|
99aae535e7 | ||
|
|
6bc747938b | ||
|
|
2e6c846f1e | ||
|
|
d14845db7a | ||
|
|
adcca2f306 | ||
|
|
44bb477680 | ||
|
|
67d5d1687d | ||
|
|
bea424de36 | ||
|
|
a9147f911c | ||
|
|
a9a87ab94b | ||
|
|
10fcb053a0 | ||
|
|
9613157753 | ||
|
|
7f28c22f6a | ||
|
|
47cd79d7aa | ||
|
|
7543afa7b8 | ||
|
|
721b06a044 | ||
|
|
db4825f483 | ||
|
|
5856913b6c | ||
|
|
8b25922b88 | ||
|
|
5767329895 | ||
|
|
7173ea14ac | ||
|
|
ac832bfefc | ||
|
|
8bd1ceaec2 | ||
|
|
6cf572ab44 | ||
|
|
1a31985c58 | ||
|
|
8b17a63fa1 | ||
|
|
3b7317bb0f | ||
|
|
606404095e | ||
|
|
f656895198 | ||
|
|
c49e794827 | ||
|
|
59c05d379c | ||
|
|
0ac20ba82c | ||
|
|
a0360d5373 | ||
|
|
9b10e454a9 | ||
|
|
a31f360e3c | ||
|
|
5e7c01c100 | ||
|
|
accc7d41a2 | ||
|
|
14edff1369 | ||
|
|
6948028284 | ||
|
|
c6fdc94a46 | ||
|
|
74e471ef28 | ||
|
|
240624c727 | ||
|
|
abac650427 | ||
|
|
cacfdaa6e7 | ||
|
|
0db8eda08b | ||
|
|
d48745394c | ||
|
|
bed8a4afc2 | ||
|
|
93aa9b46c3 | ||
|
|
8c567c3a87 | ||
|
|
00bb83ef4e | ||
|
|
0eeff3634c | ||
|
|
ea286e68ce | ||
|
|
decd2120a4 | ||
|
|
49c0088b0d | ||
|
|
71a9df7332 | ||
|
|
abe218e7b0 | ||
|
|
2d2105ae00 | ||
|
|
a995313750 | ||
|
|
23a8439b73 | ||
|
|
cc3c9dbd57 | ||
|
|
e5f9be1bff | ||
|
|
77484433f7 | ||
|
|
26cc4235be | ||
|
|
7054a42909 | ||
|
|
b643d2bbcc | ||
|
|
0c8d812a7a | ||
|
|
0be8ad101a | ||
|
|
3e78e2cdca |
2
0BUILD
2
0BUILD
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<gwbuild>
|
<gwbuild>
|
||||||
|
|
||||||
<project name="aqhome" version="0.3.0" so_current="4" so_age="3" so_revision="0" write_config_h="TRUE">
|
<project name="aqhome" version="0.4.1" so_current="5" so_age="4" so_revision="1" write_config_h="TRUE">
|
||||||
<setVar name="package">$(project_name)</setVar>
|
<setVar name="package">$(project_name)</setVar>
|
||||||
<setVar name="version">
|
<setVar name="version">
|
||||||
$(project_vmajor).$(project_vminor).$(project_vpatchlevel)
|
$(project_vmajor).$(project_vminor).$(project_vpatchlevel)
|
||||||
|
|||||||
@@ -51,7 +51,6 @@
|
|||||||
|
|
||||||
<useTargets>
|
<useTargets>
|
||||||
aqhomecgi
|
aqhomecgi
|
||||||
aqhcgi_service
|
|
||||||
aqhome
|
aqhome
|
||||||
</useTargets>
|
</useTargets>
|
||||||
|
|
||||||
@@ -121,7 +120,6 @@
|
|||||||
|
|
||||||
<useTargets>
|
<useTargets>
|
||||||
aqhome
|
aqhome
|
||||||
aqhcgi_service
|
|
||||||
aqhcgi_modules
|
aqhcgi_modules
|
||||||
</useTargets>
|
</useTargets>
|
||||||
|
|
||||||
@@ -133,7 +131,6 @@
|
|||||||
</libraries>
|
</libraries>
|
||||||
|
|
||||||
<subdirs>
|
<subdirs>
|
||||||
service
|
|
||||||
modules
|
modules
|
||||||
</subdirs>
|
</subdirs>
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles, const char *sBaseUrl);
|
static void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles, const char *sBaseUrl);
|
||||||
static int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles);
|
static int _handlePath(AQCGI_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles);
|
||||||
static void logStart(void);
|
static void logStart(void);
|
||||||
static int _init(const char *sPathRuntimeFiles, const char *sBaseUrl);
|
static int _init(const char *sPathRuntimeFiles, const char *sBaseUrl);
|
||||||
|
|
||||||
@@ -126,25 +126,26 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles, const char *sBaseUrl)
|
void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles, const char *sBaseUrl)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
sv=AQH_ServiceFiles_new(sPathRuntimeFiles, sBaseUrl);
|
sv=AQH_ServiceFiles_new(sPathRuntimeFiles, sBaseUrl);
|
||||||
|
AQCGI_Service_SetLoginUrl(sv, "/aqhome/login");
|
||||||
|
|
||||||
rv=_handlePath(sv, rq, sPathStaticFiles);
|
rv=_handlePath(sv, rq, sPathStaticFiles);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
}
|
}
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles)
|
int _handlePath(AQCGI_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles)
|
||||||
{
|
{
|
||||||
AQH_MODULE *mRoot;
|
AQCGI_MODULE *mRoot;
|
||||||
AQH_MODULE *mParent;
|
AQCGI_MODULE *mParent;
|
||||||
AQH_SESSION *session;
|
AQCGI_SESSION *session;
|
||||||
const GWEN_STRINGLIST *sl;
|
const GWEN_STRINGLIST *sl;
|
||||||
|
|
||||||
mRoot=AQH_ModRoot_new(sv, sPathStaticFiles);
|
mRoot=AQH_ModRoot_new(sv, sPathStaticFiles);
|
||||||
@@ -165,13 +166,13 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles
|
|||||||
s=GWEN_StringListEntry_Data(se);
|
s=GWEN_StringListEntry_Data(se);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
if (seNext) {
|
if (seNext) {
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
|
|
||||||
DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last");
|
DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last");
|
||||||
m=AQH_ModService_LoadSubModule(mParent, rq, session, s);
|
m=AQH_ModService_LoadSubModule(mParent, rq, session, s);
|
||||||
if (m==NULL) {
|
if (m==NULL) {
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
AQH_Module_free(mRoot);
|
AQCGI_Module_free(mRoot);
|
||||||
return GWEN_ERROR_GENERIC;
|
return GWEN_ERROR_GENERIC;
|
||||||
}
|
}
|
||||||
mParent=m;
|
mParent=m;
|
||||||
@@ -184,8 +185,8 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles
|
|||||||
rv=AQH_ModService_HandleRequest(mParent, rq, session, s);
|
rv=AQH_ModService_HandleRequest(mParent, rq, session, s);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
AQH_Module_free(mRoot);
|
AQCGI_Module_free(mRoot);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -194,13 +195,13 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles
|
|||||||
|
|
||||||
se=seNext;
|
se=seNext;
|
||||||
}
|
}
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
AQH_Module_free(mRoot);
|
AQCGI_Module_free(mRoot);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
AQH_Module_free(mRoot);
|
AQCGI_Module_free(mRoot);
|
||||||
return GWEN_ERROR_GENERIC;
|
return GWEN_ERROR_GENERIC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -222,7 +223,7 @@ void logStart()
|
|||||||
|
|
||||||
int _init(const char *sPathRuntimeFiles, const char *sBaseUrl)
|
int _init(const char *sPathRuntimeFiles, const char *sBaseUrl)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
DBG_ERROR(NULL, "Creating aqhome-cgi environment in \"%s\"", sPathRuntimeFiles);
|
DBG_ERROR(NULL, "Creating aqhome-cgi environment in \"%s\"", sPathRuntimeFiles);
|
||||||
@@ -230,32 +231,32 @@ int _init(const char *sPathRuntimeFiles, const char *sBaseUrl)
|
|||||||
rv=AQH_ModAdmin_Create(sv);
|
rv=AQH_ModAdmin_Create(sv);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error creating module \"admin\"");
|
DBG_ERROR(NULL, "Error creating module \"admin\"");
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv=AQH_ModAdmModules_Create(sv);
|
rv=AQH_ModAdmModules_Create(sv);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error creating module \"modules\"");
|
DBG_ERROR(NULL, "Error creating module \"modules\"");
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv=AQH_ModAdmUsers_Create(sv);
|
rv=AQH_ModAdmUsers_Create(sv);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error creating module \"users\"");
|
DBG_ERROR(NULL, "Error creating module \"users\"");
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv=AQH_ModDevices_Create(sv);
|
rv=AQH_ModDevices_Create(sv);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error creating module \"devices\"");
|
DBG_ERROR(NULL, "Error creating module \"devices\"");
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
<includes type="c" >
|
<includes type="c" >
|
||||||
$(gwenhywfar_cflags)
|
$(gwenhywfar_cflags)
|
||||||
|
$(aqcgi_cflags)
|
||||||
-I$(topsrcdir)
|
-I$(topsrcdir)
|
||||||
-I$(topbuilddir)
|
-I$(topbuilddir)
|
||||||
-I$(topsrcdir)/apps
|
-I$(topsrcdir)/apps
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
<includes type="c" >
|
<includes type="c" >
|
||||||
$(gwenhywfar_cflags)
|
$(gwenhywfar_cflags)
|
||||||
|
$(aqcgi_cflags)
|
||||||
-I$(topsrcdir)
|
-I$(topsrcdir)
|
||||||
-I$(topbuilddir)
|
-I$(topbuilddir)
|
||||||
-I$(topsrcdir)/apps
|
-I$(topsrcdir)/apps
|
||||||
|
|||||||
@@ -13,10 +13,11 @@
|
|||||||
|
|
||||||
#include "./madmin.h"
|
#include "./madmin.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/common/mmodules.h"
|
#include "aqhome-cgi/modules/common/mmodules.h"
|
||||||
#include "aqhome-cgi/modules/common/musers.h"
|
#include "aqhome-cgi/modules/common/musers.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
|
|
||||||
@@ -37,12 +38,12 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _createPermDefList(AQH_MODULE *m);
|
static void _createPermDefList(AQCGI_MODULE *m);
|
||||||
static void _createRoleList(AQH_MODULE *m);
|
static void _createRoleList(AQCGI_MODULE *m);
|
||||||
|
|
||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
|
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
static int _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -50,7 +51,7 @@ static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModAdmin_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModAdmin_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
@@ -59,65 +60,65 @@ void AQH_ModAdmin_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModAdmin_Create(AQH_SERVICE *sv)
|
int AQH_ModAdmin_Create(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
m=AQH_Module_new();
|
m=AQCGI_Module_new();
|
||||||
AQH_Module_SetName(m, "admin");
|
AQCGI_Module_SetName(m, "admin");
|
||||||
AQH_Module_SetDescr(m, "administration module");
|
AQCGI_Module_SetDescr(m, "administration module");
|
||||||
AQH_Module_SetGuestPerms(m, 0);
|
AQCGI_Module_SetGuestPerms(m, 0);
|
||||||
|
|
||||||
_createPermDefList(m);
|
_createPermDefList(m);
|
||||||
_createRoleList(m);
|
_createRoleList(m);
|
||||||
|
|
||||||
rv=AQH_Service_AddModule(sv, m);
|
rv=AQCGI_Service_AddModule(sv, m);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
}
|
}
|
||||||
AQH_Module_free(m);
|
AQCGI_Module_free(m);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createPermDefList(AQH_MODULE *m)
|
void _createPermDefList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
|
|
||||||
permDefList=AQH_PermDef_List_new();
|
permDefList=AQCGI_PermDef_List_new();
|
||||||
|
|
||||||
AQH_ModService_AddPermDef(permDefList, "AdminUsers", 0x001, "User Administration");
|
AQH_ModService_AddPermDef(permDefList, "AdminUsers", 0x001, "User Administration");
|
||||||
AQH_ModService_AddPermDef(permDefList, "AdminModules", 0x002, "Module Administration");
|
AQH_ModService_AddPermDef(permDefList, "AdminModules", 0x002, "Module Administration");
|
||||||
|
|
||||||
AQH_Module_SetPermDefList(m, permDefList);
|
AQCGI_Module_SetPermDefList(m, permDefList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createRoleList(AQH_MODULE *m)
|
void _createRoleList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
int id=0;
|
int id=1;
|
||||||
|
|
||||||
roleList=AQH_Role_List_new();
|
roleList=AQCGI_Role_List_new();
|
||||||
AQH_ModService_AddRole(roleList, id++, "userAdmin", AQH_MODADM_PERMS_ADMINUSERS, "User administrator");
|
AQH_ModService_AddRole(roleList, id++, "userAdmin", AQH_MODADM_PERMS_ADMINUSERS, "User administrator");
|
||||||
AQH_ModService_AddRole(roleList, id++, "moduleAdmin", AQH_MODADM_PERMS_ADMINMODULES, "Module administrator");
|
AQH_ModService_AddRole(roleList, id++, "moduleAdmin", AQH_MODADM_PERMS_ADMINMODULES, "Module administrator");
|
||||||
AQH_Module_SetRoleList(m, roleList);
|
AQCGI_Module_SetRoleList(m, roleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
if (strcasecmp(sModuleName, "modules")==0) {
|
if (strcasecmp(sModuleName, "modules")==0) {
|
||||||
AQH_MODULE *mSub;
|
AQCGI_MODULE *mSub;
|
||||||
|
|
||||||
mSub=AQH_Service_LoadModule(sv, sModuleName);
|
mSub=AQCGI_Service_LoadModule(sv, sModuleName);
|
||||||
if (mSub) {
|
if (mSub) {
|
||||||
const char *s;
|
const char *s;
|
||||||
GWEN_BUFFER *nbuf;
|
GWEN_BUFFER *nbuf;
|
||||||
@@ -127,15 +128,15 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
GWEN_Buffer_AppendArgs(nbuf, "%s/modules", s?s:".");
|
GWEN_Buffer_AppendArgs(nbuf, "%s/modules", s?s:".");
|
||||||
|
|
||||||
AQH_ModAdmModules_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
AQH_ModAdmModules_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
||||||
AQH_Module_Tree2_AddChild(m, mSub);
|
AQCGI_Module_Tree2_AddChild(m, mSub);
|
||||||
GWEN_Buffer_free(nbuf);
|
GWEN_Buffer_free(nbuf);
|
||||||
return mSub;
|
return mSub;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcasecmp(sModuleName, "users")==0) {
|
else if (strcasecmp(sModuleName, "users")==0) {
|
||||||
AQH_MODULE *mSub;
|
AQCGI_MODULE *mSub;
|
||||||
|
|
||||||
mSub=AQH_Service_LoadModule(sv, sModuleName);
|
mSub=AQCGI_Service_LoadModule(sv, sModuleName);
|
||||||
if (mSub) {
|
if (mSub) {
|
||||||
const char *s;
|
const char *s;
|
||||||
GWEN_BUFFER *nbuf;
|
GWEN_BUFFER *nbuf;
|
||||||
@@ -145,7 +146,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
GWEN_Buffer_AppendArgs(nbuf, "%s/modules", s?s:".");
|
GWEN_Buffer_AppendArgs(nbuf, "%s/modules", s?s:".");
|
||||||
|
|
||||||
AQH_ModAdmUsers_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
AQH_ModAdmUsers_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
||||||
AQH_Module_Tree2_AddChild(m, mSub);
|
AQCGI_Module_Tree2_AddChild(m, mSub);
|
||||||
GWEN_Buffer_free(nbuf);
|
GWEN_Buffer_free(nbuf);
|
||||||
return mSub;
|
return mSub;
|
||||||
}
|
}
|
||||||
@@ -155,7 +156,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *dbuf;
|
GWEN_BUFFER *dbuf;
|
||||||
int rv=0;
|
int rv=0;
|
||||||
@@ -166,10 +167,8 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
if (strcasecmp(sLastPathElem, "index.html")==0) {
|
if (strcasecmp(sLastPathElem, "index.html")==0) {
|
||||||
if (AQH_ModService_GetUserPerms(m) & (AQH_MODADM_PERMS_ADMINUSERS | AQH_MODADM_PERMS_ADMINMODULES))
|
if (AQH_ModService_GetUserPerms(m) & (AQH_MODADM_PERMS_ADMINUSERS | AQH_MODADM_PERMS_ADMINMODULES))
|
||||||
rv=_handleRqIndex(m, rq, dbuf);
|
rv=_handleRqIndex(m, rq, dbuf);
|
||||||
else {
|
else
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
AQH_ModService_DenyRequest(m, rq, session, dbuf);
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AQCGI_Request_SetResponseCode(rq, 404);
|
AQCGI_Request_SetResponseCode(rq, 404);
|
||||||
@@ -184,7 +183,7 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
int _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) {
|
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) {
|
||||||
uint32_t userPerms;
|
uint32_t userPerms;
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
#define AQH_MODADM_PERMS_ADMINMODULES 0x002
|
#define AQH_MODADM_PERMS_ADMINMODULES 0x002
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModAdmin_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModAdmin_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
int AQH_ModAdmin_Create(AQH_SERVICE *sv);
|
int AQH_ModAdmin_Create(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#include "./mmodules.h"
|
#include "./mmodules.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
#include "aqcgi/service/module.h"
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
@@ -35,33 +35,33 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _createPermDefList(AQH_MODULE *m);
|
static void _createPermDefList(AQCGI_MODULE *m);
|
||||||
static void _createRoleList(AQH_MODULE *m);
|
static void _createRoleList(AQCGI_MODULE *m);
|
||||||
|
|
||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
|
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
static void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditModGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditModPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqAddRoleGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqAddRolePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditRoleGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditRolePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList);
|
static int _getHighestUsedRoleId(const AQCGI_ROLE_LIST *roleList);
|
||||||
|
|
||||||
static void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqDeleteRole(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf);
|
static void _writeEditModForm(const AQCGI_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf);
|
||||||
static void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
|
static void _writeRoleListToForm(const AQCGI_ROLE_LIST *roleList,
|
||||||
const char *sModName,
|
const char *sModName,
|
||||||
const AQH_PERMDEF_LIST *permDefList,
|
const AQCGI_PERMDEF_LIST *permDefList,
|
||||||
GWEN_BUFFER *dbuf);
|
GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *sModName);
|
static void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *sModName);
|
||||||
static void _writeEnabledPermissions(const AQH_PERMDEF_LIST *permDefList, uint32_t perms, GWEN_BUFFER *dbuf);
|
static void _writeEnabledPermissions(const AQCGI_PERMDEF_LIST *permDefList, uint32_t perms, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModAdmModules_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModAdmModules_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
@@ -98,63 +98,63 @@ void AQH_ModAdmModules_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModAdmModules_Create(AQH_SERVICE *sv)
|
int AQH_ModAdmModules_Create(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
m=AQH_Module_new();
|
m=AQCGI_Module_new();
|
||||||
AQH_Module_SetName(m, "modules");
|
AQCGI_Module_SetName(m, "modules");
|
||||||
AQH_Module_SetDescr(m, "modules administration module");
|
AQCGI_Module_SetDescr(m, "modules administration module");
|
||||||
AQH_Module_SetGuestPerms(m, 0);
|
AQCGI_Module_SetGuestPerms(m, 0);
|
||||||
|
|
||||||
_createPermDefList(m);
|
_createPermDefList(m);
|
||||||
_createRoleList(m);
|
_createRoleList(m);
|
||||||
|
|
||||||
rv=AQH_Service_AddModule(sv, m);
|
rv=AQCGI_Service_AddModule(sv, m);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
}
|
}
|
||||||
AQH_Module_free(m);
|
AQCGI_Module_free(m);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createPermDefList(AQH_MODULE *m)
|
void _createPermDefList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
|
|
||||||
permDefList=AQH_PermDef_List_new();
|
permDefList=AQCGI_PermDef_List_new();
|
||||||
|
|
||||||
AQH_ModService_AddPermDef(permDefList, "ModuleRead", 0x001, "Read modules");
|
AQH_ModService_AddPermDef(permDefList, "ModuleRead", 0x001, "Read modules");
|
||||||
AQH_ModService_AddPermDef(permDefList, "ModuleWrite", 0x002, "Modify modules");
|
AQH_ModService_AddPermDef(permDefList, "ModuleWrite", 0x002, "Modify modules");
|
||||||
AQH_ModService_AddPermDef(permDefList, "ModuleAdd", 0x004, "Add modules");
|
AQH_ModService_AddPermDef(permDefList, "ModuleAdd", 0x004, "Add modules");
|
||||||
AQH_ModService_AddPermDef(permDefList, "ModuleDel", 0x008, "Remove modules");
|
AQH_ModService_AddPermDef(permDefList, "ModuleDel", 0x008, "Remove modules");
|
||||||
|
|
||||||
AQH_Module_SetPermDefList(m, permDefList);
|
AQCGI_Module_SetPermDefList(m, permDefList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createRoleList(AQH_MODULE *m)
|
void _createRoleList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
int id=0;
|
int id=1;
|
||||||
|
|
||||||
roleList=AQH_Role_List_new();
|
roleList=AQCGI_Role_List_new();
|
||||||
AQH_ModService_AddRole(roleList, id++, "admin",
|
AQH_ModService_AddRole(roleList, id++, "admin",
|
||||||
AQH_MODADMMODULES_PERMS_MODULESREAD |
|
AQH_MODADMMODULES_PERMS_MODULESREAD |
|
||||||
AQH_MODADMMODULES_PERMS_MODULESWRITE |
|
AQH_MODADMMODULES_PERMS_MODULESWRITE |
|
||||||
AQH_MODADMMODULES_PERMS_MODULESADD |
|
AQH_MODADMMODULES_PERMS_MODULESADD |
|
||||||
AQH_MODADMMODULES_PERMS_MODULESDEL,
|
AQH_MODADMMODULES_PERMS_MODULESDEL,
|
||||||
"Administrator Role");
|
"Administrator Role");
|
||||||
AQH_Module_SetRoleList(m, roleList);
|
AQCGI_Module_SetRoleList(m, roleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
/* no sub-modules */
|
/* no sub-modules */
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -162,7 +162,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
||||||
return AQCGI_SendResponse(rq);
|
return AQCGI_SendResponse(rq);
|
||||||
@@ -170,15 +170,15 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_STRINGLIST *slModules;
|
GWEN_STRINGLIST *slModules;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
|
|
||||||
perms=AQH_ModService_GetUserPerms(m);
|
perms=AQH_ModService_GetUserPerms(m);
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
slModules=AQH_Service_ListModules(sv);
|
slModules=AQCGI_Service_ListModules(sv);
|
||||||
if (slModules) {
|
if (slModules) {
|
||||||
GWEN_STRINGLISTENTRY *se;
|
GWEN_STRINGLISTENTRY *se;
|
||||||
|
|
||||||
@@ -195,18 +195,18 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
|
|
||||||
sModName=GWEN_StringListEntry_Data(se);
|
sModName=GWEN_StringListEntry_Data(se);
|
||||||
if (sModName && *sModName) {
|
if (sModName && *sModName) {
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
|
|
||||||
currentMod=AQH_Service_LoadModule(sv, sModName);
|
currentMod=AQCGI_Service_LoadModule(sv, sModName);
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
const char *s;
|
const char *s;
|
||||||
const char *sName;
|
const char *sName;
|
||||||
|
|
||||||
sName=AQH_Module_GetName(currentMod);
|
sName=AQCGI_Module_GetName(currentMod);
|
||||||
GBAS(dbuf, "<tr>");
|
GBAS(dbuf, "<tr>");
|
||||||
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) AQH_Module_GetId(currentMod));
|
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) AQCGI_Module_GetId(currentMod));
|
||||||
GBAA(dbuf, "<td>%s</td>", sName?sName:"");
|
GBAA(dbuf, "<td>%s</td>", sName?sName:"");
|
||||||
s=AQH_Module_GetDescr(currentMod);
|
s=AQCGI_Module_GetDescr(currentMod);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
|
|
||||||
GBAS(dbuf, "<td>");
|
GBAS(dbuf, "<td>");
|
||||||
@@ -214,7 +214,7 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
GBAA(dbuf, "<a href=\"editmodule.html?name=%s\"><img src=\"/pics/edit.png\"></a>", sName?sName:"");
|
GBAA(dbuf, "<a href=\"editmodule.html?name=%s\"><img src=\"/pics/edit.png\"></a>", sName?sName:"");
|
||||||
GBAA(dbuf, "</td>\n");
|
GBAA(dbuf, "</td>\n");
|
||||||
GBAA(dbuf, "</tr>\n");
|
GBAA(dbuf, "</tr>\n");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
se=GWEN_StringListEntry_Next(se);
|
se=GWEN_StringListEntry_Next(se);
|
||||||
@@ -230,20 +230,20 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditModGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "name", 0, NULL):NULL;
|
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "name", 0, NULL):NULL;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
_writeEditModForm(currentMod, sModName, dbuf);
|
_writeEditModForm(currentMod, sModName, dbuf);
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
@@ -254,42 +254,42 @@ void _handleRqEditModGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditModPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "module", 0, NULL):NULL;
|
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "module", 0, NULL):NULL;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
const char *sNewModName;
|
const char *sNewModName;
|
||||||
const char *sDescr;
|
const char *sDescr;
|
||||||
int rv;
|
int rv;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
const AQH_PERMDEF_LIST *permDefList;
|
const AQCGI_PERMDEF_LIST *permDefList;
|
||||||
|
|
||||||
permDefList=AQH_Module_GetPermDefList(currentMod);
|
permDefList=AQCGI_Module_GetPermDefList(currentMod);
|
||||||
sNewModName=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
sNewModName=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
||||||
sDescr=GWEN_DB_GetCharValue(dbPost, "descr", 0, NULL);
|
sDescr=GWEN_DB_GetCharValue(dbPost, "descr", 0, NULL);
|
||||||
perms=AQH_ModService_ReadPermsFromForm(dbPost, permDefList, NULL);
|
perms=AQH_ModService_ReadPermsFromForm(dbPost, permDefList, NULL);
|
||||||
if (sNewModName && *sNewModName)
|
if (sNewModName && *sNewModName)
|
||||||
AQH_Module_SetName(currentMod, sNewModName);
|
AQCGI_Module_SetName(currentMod, sNewModName);
|
||||||
AQH_Module_SetDescr(currentMod, sDescr);
|
AQCGI_Module_SetDescr(currentMod, sDescr);
|
||||||
AQH_Module_SetGuestPerms(currentMod, perms);
|
AQCGI_Module_SetGuestPerms(currentMod, perms);
|
||||||
|
|
||||||
rv=AQH_Service_SaveModule(sv, currentMod);
|
rv=AQCGI_Service_SaveModule(sv, currentMod);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<h2>Error</h2><p>Error saving module</p>");
|
GBAS(dbuf, "<h2>Error</h2><p>Error saving module</p>");
|
||||||
DBG_ERROR(NULL, "Could not save module \"%s\"", sModName);
|
DBG_ERROR(NULL, "Could not save module \"%s\"", sModName);
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "Module \"%s\" saved", sModName);
|
DBG_ERROR(NULL, "Module \"%s\" saved", sModName);
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
AQCGI_Request_SetResponseText(rq, "See other");
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
@@ -302,21 +302,21 @@ void _handleRqEditModPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqAddRoleGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
const AQH_PERMDEF_LIST *permDefList;
|
const AQCGI_PERMDEF_LIST *permDefList;
|
||||||
uint32_t guestPerms;
|
uint32_t guestPerms;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
guestPerms=currentMod?AQH_Module_GetGuestPerms(currentMod):0;
|
guestPerms=currentMod?AQCGI_Module_GetGuestPerms(currentMod):0;
|
||||||
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
|
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
|
||||||
|
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
if (permDefList) {
|
if (permDefList) {
|
||||||
@@ -340,7 +340,7 @@ void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
|
|||||||
GBAS(dbuf, "<p>Please add permission definitions first.</p>\n");
|
GBAS(dbuf, "<p>Please add permission definitions first.</p>\n");
|
||||||
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
||||||
}
|
}
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
||||||
@@ -350,18 +350,18 @@ void _handleRqAddRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqAddRolePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
int newId;
|
int newId;
|
||||||
const char *sName;
|
const char *sName;
|
||||||
const char *sDescr;
|
const char *sDescr;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
/* sample data */
|
/* sample data */
|
||||||
@@ -369,9 +369,9 @@ void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
|
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
|
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
|
||||||
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
|
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
|
||||||
/* read role values */
|
/* read role values */
|
||||||
newId=(roleList?_getHighestUsedRoleId(roleList):0)+1;
|
newId=(roleList?_getHighestUsedRoleId(roleList):0)+1;
|
||||||
sName=dbPost?GWEN_DB_GetCharValue(dbPost, "name", 0, NULL):NULL;
|
sName=dbPost?GWEN_DB_GetCharValue(dbPost, "name", 0, NULL):NULL;
|
||||||
@@ -387,33 +387,33 @@ void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
AQH_ROLE *role;
|
AQCGI_ROLE *role;
|
||||||
|
|
||||||
/* set new values */
|
/* set new values */
|
||||||
role=AQH_Role_new();
|
role=AQCGI_Role_new();
|
||||||
AQH_Role_SetId(role, newId);
|
AQCGI_Role_SetId(role, newId);
|
||||||
AQH_Role_SetName(role, sName);
|
AQCGI_Role_SetName(role, sName);
|
||||||
AQH_Role_SetDescr(role, sDescr);
|
AQCGI_Role_SetDescr(role, sDescr);
|
||||||
AQH_Role_SetPerms(role, perms);
|
AQCGI_Role_SetPerms(role, perms);
|
||||||
/* add role */
|
/* add role */
|
||||||
if (roleList==NULL) {
|
if (roleList==NULL) {
|
||||||
roleList=AQH_Role_List_new();
|
roleList=AQCGI_Role_List_new();
|
||||||
AQH_Module_SetRoleList(currentMod, roleList);
|
AQCGI_Module_SetRoleList(currentMod, roleList);
|
||||||
}
|
}
|
||||||
AQH_Role_List_Add(role, roleList);
|
AQCGI_Role_List_Add(role, roleList);
|
||||||
|
|
||||||
/* save module */
|
/* save module */
|
||||||
rv=AQH_Service_SaveModule(sv, currentMod);
|
rv=AQCGI_Service_SaveModule(sv, currentMod);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
||||||
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
|
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
AQCGI_Request_SetResponseText(rq, "See Other");
|
AQCGI_Request_SetResponseText(rq, "See Other");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
||||||
@@ -423,31 +423,31 @@ void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditRoleGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
int id;
|
int id;
|
||||||
const char *sName;
|
const char *sName;
|
||||||
const char *sDescr;
|
const char *sDescr;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
const AQH_PERMDEF_LIST *permDefList;
|
const AQCGI_PERMDEF_LIST *permDefList;
|
||||||
const AQH_ROLE_LIST *roleList;
|
const AQCGI_ROLE_LIST *roleList;
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
||||||
id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0;
|
id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
|
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
|
||||||
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
|
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
|
||||||
role=roleList?AQH_Role_List_GetById(roleList, id):NULL;
|
role=roleList?AQCGI_Role_List_GetById(roleList, id):NULL;
|
||||||
sName=role?AQH_Role_GetName(role):NULL;
|
sName=role?AQCGI_Role_GetName(role):NULL;
|
||||||
sDescr=role?AQH_Role_GetDescr(role):NULL;
|
sDescr=role?AQCGI_Role_GetDescr(role):NULL;
|
||||||
perms=role?AQH_Role_GetPerms(role):0;
|
perms=role?AQCGI_Role_GetPerms(role):0;
|
||||||
|
|
||||||
if (role) {
|
if (role) {
|
||||||
GBAA(dbuf, "<h2>Edit Role for Module %s</h2>\n", sModName?sModName:"");
|
GBAA(dbuf, "<h2>Edit Role for Module %s</h2>\n", sModName?sModName:"");
|
||||||
@@ -477,33 +477,33 @@ void _handleRqEditRoleGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditRolePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
int oldId;
|
int oldId;
|
||||||
const char *sName;
|
const char *sName;
|
||||||
const char *sDescr;
|
const char *sDescr;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
AQH_ROLE *role;
|
AQCGI_ROLE *role;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
/* sample data */
|
/* sample data */
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
|
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
|
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
|
||||||
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
|
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
|
||||||
/* read role data */
|
/* read role data */
|
||||||
oldId=dbPost?GWEN_DB_GetIntValue(dbPost, "oldId", 0, -1):-1;
|
oldId=dbPost?GWEN_DB_GetIntValue(dbPost, "oldId", 0, -1):-1;
|
||||||
sName=dbPost?GWEN_DB_GetCharValue(dbPost, "name", 0, NULL):NULL;
|
sName=dbPost?GWEN_DB_GetCharValue(dbPost, "name", 0, NULL):NULL;
|
||||||
sDescr=dbPost?GWEN_DB_GetCharValue(dbPost, "descr", 0, NULL):NULL;
|
sDescr=dbPost?GWEN_DB_GetCharValue(dbPost, "descr", 0, NULL):NULL;
|
||||||
role=roleList?AQH_Role_List_GetById(roleList, oldId):NULL;
|
role=roleList?AQCGI_Role_List_GetById(roleList, oldId):NULL;
|
||||||
perms=(dbPost && permDefList)?AQH_ModService_ReadPermsFromForm(dbPost, permDefList, NULL):0;
|
perms=(dbPost && permDefList)?AQH_ModService_ReadPermsFromForm(dbPost, permDefList, NULL):0;
|
||||||
/* validate */
|
/* validate */
|
||||||
if (!(sName && *sName)) {
|
if (!(sName && *sName)) {
|
||||||
@@ -521,23 +521,23 @@ void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
/* set new values */
|
/* set new values */
|
||||||
AQH_Role_SetName(role, sName);
|
AQCGI_Role_SetName(role, sName);
|
||||||
AQH_Role_SetDescr(role, sDescr);
|
AQCGI_Role_SetDescr(role, sDescr);
|
||||||
AQH_Role_SetPerms(role, perms);
|
AQCGI_Role_SetPerms(role, perms);
|
||||||
|
|
||||||
/* save module */
|
/* save module */
|
||||||
rv=AQH_Service_SaveModule(sv, currentMod);
|
rv=AQCGI_Service_SaveModule(sv, currentMod);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
||||||
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
|
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
AQCGI_Request_SetResponseText(rq, "See Other");
|
AQCGI_Request_SetResponseText(rq, "See Other");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
||||||
@@ -547,36 +547,36 @@ void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqDeleteRole(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
int id;
|
int id;
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
const AQH_ROLE_LIST *roleList;
|
const AQCGI_ROLE_LIST *roleList;
|
||||||
AQH_ROLE *role;
|
AQCGI_ROLE *role;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
|
||||||
id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0;
|
id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0;
|
||||||
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
|
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
|
||||||
if (currentMod) {
|
if (currentMod) {
|
||||||
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
|
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
|
||||||
role=roleList?AQH_Role_List_GetById(roleList, id):NULL;
|
role=roleList?AQCGI_Role_List_GetById(roleList, id):NULL;
|
||||||
if (role) {
|
if (role) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
AQH_Role_List_Del(role);
|
AQCGI_Role_List_Del(role);
|
||||||
AQH_Role_free(role);
|
AQCGI_Role_free(role);
|
||||||
|
|
||||||
/* save module */
|
/* save module */
|
||||||
rv=AQH_Service_SaveModule(sv, currentMod);
|
rv=AQCGI_Service_SaveModule(sv, currentMod);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
GBAS(dbuf, "<p>Error saving module.</p>\n");
|
||||||
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,7 +588,7 @@ void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
|
|||||||
GBAS(dbuf, "<p>Role not found.</p>\n");
|
GBAS(dbuf, "<p>Role not found.</p>\n");
|
||||||
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
GBAA(dbuf, "<p><a href=\"editmodule.html?name=\"%s\"> back to module</p>\n", sModName?sModName:"");
|
||||||
}
|
}
|
||||||
AQH_Module_free(currentMod);
|
AQCGI_Module_free(currentMod);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
GBAS(dbuf, "<p>Error loading module.</p>\n");
|
||||||
@@ -610,20 +610,20 @@ void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *s
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList)
|
int _getHighestUsedRoleId(const AQCGI_ROLE_LIST *roleList)
|
||||||
{
|
{
|
||||||
int id=0;
|
int id=0;
|
||||||
|
|
||||||
if (roleList) {
|
if (roleList) {
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
|
|
||||||
role=AQH_Role_List_First(roleList);
|
role=AQCGI_Role_List_First(roleList);
|
||||||
while(role) {
|
while(role) {
|
||||||
int rid;
|
int rid;
|
||||||
|
|
||||||
rid=AQH_Role_GetId(role);
|
rid=AQCGI_Role_GetId(role);
|
||||||
id=(rid>id)?rid:id;
|
id=(rid>id)?rid:id;
|
||||||
role=AQH_Role_List_Next(role);
|
role=AQCGI_Role_List_Next(role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
@@ -631,17 +631,17 @@ int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf)
|
void _writeEditModForm(const AQCGI_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
const char *sName;
|
const char *sName;
|
||||||
const char *sDescr;
|
const char *sDescr;
|
||||||
const AQH_PERMDEF_LIST *permDefList;
|
const AQCGI_PERMDEF_LIST *permDefList;
|
||||||
const AQH_ROLE_LIST *roleList;
|
const AQCGI_ROLE_LIST *roleList;
|
||||||
|
|
||||||
permDefList=AQH_Module_GetPermDefList(currentMod);
|
permDefList=AQCGI_Module_GetPermDefList(currentMod);
|
||||||
roleList=AQH_Module_GetRoleList(currentMod);
|
roleList=AQCGI_Module_GetRoleList(currentMod);
|
||||||
sName=AQH_Module_GetName(currentMod);
|
sName=AQCGI_Module_GetName(currentMod);
|
||||||
sDescr=AQH_Module_GetDescr(currentMod);
|
sDescr=AQCGI_Module_GetDescr(currentMod);
|
||||||
/* write module info */
|
/* write module info */
|
||||||
GBAS(dbuf, "<h2>Module Info</h2>\n");
|
GBAS(dbuf, "<h2>Module Info</h2>\n");
|
||||||
GBAA(dbuf,
|
GBAA(dbuf,
|
||||||
@@ -653,7 +653,7 @@ void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_
|
|||||||
|
|
||||||
if (permDefList) {
|
if (permDefList) {
|
||||||
GBAA(dbuf, "<tr><td><label>Guest Permissions:</label></td>\n<td>");
|
GBAA(dbuf, "<tr><td><label>Guest Permissions:</label></td>\n<td>");
|
||||||
AQH_ModService_WritePermsToForm(AQH_Module_GetGuestPerms(currentMod), permDefList, NULL, dbuf);
|
AQH_ModService_WritePermsToForm(AQCGI_Module_GetGuestPerms(currentMod), permDefList, NULL, dbuf);
|
||||||
GBAA(dbuf, "</td></tr>");
|
GBAA(dbuf, "</td></tr>");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -673,36 +673,36 @@ void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
|
void _writeRoleListToForm(const AQCGI_ROLE_LIST *roleList,
|
||||||
const char *sModName,
|
const char *sModName,
|
||||||
const AQH_PERMDEF_LIST *permDefList,
|
const AQCGI_PERMDEF_LIST *permDefList,
|
||||||
GWEN_BUFFER *dbuf)
|
GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
|
|
||||||
GBAS(dbuf,
|
GBAS(dbuf,
|
||||||
"<table class=\"datatable\">\n"
|
"<table class=\"datatable\">\n"
|
||||||
"<thead><tr><th>Id</th><th>Name</th><th>Permissions</th><th>Description</th><th>Actions</th></tr>\n</thead>\n"
|
"<thead><tr><th>Id</th><th>Name</th><th>Permissions</th><th>Description</th><th>Actions</th></tr>\n</thead>\n"
|
||||||
"<tbody>\n");
|
"<tbody>\n");
|
||||||
role=AQH_Role_List_First(roleList);
|
role=AQCGI_Role_List_First(roleList);
|
||||||
while(role) {
|
while(role) {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
GBAS(dbuf, "<tr>");
|
GBAS(dbuf, "<tr>");
|
||||||
/* id */
|
/* id */
|
||||||
id=AQH_Role_GetId(role);
|
id=AQCGI_Role_GetId(role);
|
||||||
GBAA(dbuf, "<td>%d</td>", id);
|
GBAA(dbuf, "<td>%d</td>", id);
|
||||||
/* name */
|
/* name */
|
||||||
s=AQH_Role_GetName(role);
|
s=AQCGI_Role_GetName(role);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
/* permissions */
|
/* permissions */
|
||||||
GBAS(dbuf, "<td>");
|
GBAS(dbuf, "<td>");
|
||||||
if (permDefList)
|
if (permDefList)
|
||||||
_writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf);
|
_writeEnabledPermissions(permDefList, AQCGI_Role_GetPerms(role), dbuf);
|
||||||
GBAS(dbuf, "</td>");
|
GBAS(dbuf, "</td>");
|
||||||
/* description */
|
/* description */
|
||||||
s=AQH_Role_GetDescr(role);
|
s=AQCGI_Role_GetDescr(role);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
/* actions */
|
/* actions */
|
||||||
GBAA(dbuf, "<td>");
|
GBAA(dbuf, "<td>");
|
||||||
@@ -711,7 +711,7 @@ void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
|
|||||||
GBAA(dbuf, "</td>");
|
GBAA(dbuf, "</td>");
|
||||||
GBAS(dbuf, "</tr>\n");
|
GBAS(dbuf, "</tr>\n");
|
||||||
|
|
||||||
role=AQH_Role_List_Next(role);
|
role=AQCGI_Role_List_Next(role);
|
||||||
}
|
}
|
||||||
|
|
||||||
GBAS(dbuf, "</tbody>\n</table>\n");
|
GBAS(dbuf, "</tbody>\n</table>\n");
|
||||||
@@ -722,21 +722,21 @@ void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeEnabledPermissions(const AQH_PERMDEF_LIST *permDefList, uint32_t perms, GWEN_BUFFER *dbuf)
|
void _writeEnabledPermissions(const AQCGI_PERMDEF_LIST *permDefList, uint32_t perms, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (permDefList) {
|
if (permDefList) {
|
||||||
const AQH_PERMDEF *permDef;
|
const AQCGI_PERMDEF *permDef;
|
||||||
|
|
||||||
permDef=AQH_PermDef_List_First(permDefList);
|
permDef=AQCGI_PermDef_List_First(permDefList);
|
||||||
while(permDef) {
|
while(permDef) {
|
||||||
const char *s;
|
const char *s;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
|
|
||||||
s=AQH_PermDef_GetId(permDef);
|
s=AQCGI_PermDef_GetId(permDef);
|
||||||
mask=AQH_PermDef_GetMask(permDef);
|
mask=AQCGI_PermDef_GetMask(permDef);
|
||||||
if (perms & mask)
|
if (perms & mask)
|
||||||
GBAA(dbuf, "%s ", s?s:"");
|
GBAA(dbuf, "%s ", s?s:"");
|
||||||
permDef=AQH_PermDef_List_Next(permDef);
|
permDef=AQCGI_PermDef_List_Next(permDef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModAdmModules_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModAdmModules_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
int AQH_ModAdmModules_Create(AQH_SERVICE *sv);
|
int AQH_ModAdmModules_Create(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mservice_p.h"
|
#include "./mservice_p.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
|
#include <gwenhywfar/text.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -35,7 +36,6 @@
|
|||||||
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
|
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
|
||||||
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
|
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
|
||||||
|
|
||||||
|
|
||||||
#define GBAS GWEN_Buffer_AppendString
|
#define GBAS GWEN_Buffer_AppendString
|
||||||
#define GBAA GWEN_Buffer_AppendArgs
|
#define GBAA GWEN_Buffer_AppendArgs
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GWEN_INHERIT(AQH_MODULE, AQH_MOD_SERVICE)
|
GWEN_INHERIT(AQCGI_MODULE, AQH_MOD_SERVICE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -56,8 +56,8 @@ GWEN_INHERIT(AQH_MODULE, AQH_MOD_SERVICE)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
static void _calcUserModPerms(AQH_MODULE *m, const AQH_USER *user);
|
static void _calcUserModPerms(AQCGI_MODULE *m, const AQCGI_USER *user);
|
||||||
static uint32_t _calcRolePerms(const AQH_MODULE *m, const AQH_MODULE_PERMS *modPerms);
|
static uint32_t _calcRolePerms(const AQCGI_MODULE *m, const AQCGI_MODULE_PERMS *modPerms);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -66,12 +66,12 @@ static uint32_t _calcRolePerms(const AQH_MODULE *m, const AQH_MODULE_PERMS *modP
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModService_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
GWEN_NEW_OBJECT(AQH_MOD_SERVICE, xm);
|
GWEN_NEW_OBJECT(AQH_MOD_SERVICE, xm);
|
||||||
GWEN_INHERIT_SETDATA(AQH_MODULE, AQH_MOD_SERVICE, m, xm, _freeData);
|
GWEN_INHERIT_SETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m, xm, _freeData);
|
||||||
|
|
||||||
xm->service=sv;
|
xm->service=sv;
|
||||||
xm->baseFolder=(baseFolder && *baseFolder)?strdup(baseFolder):NULL;
|
xm->baseFolder=(baseFolder && *baseFolder)?strdup(baseFolder):NULL;
|
||||||
@@ -90,12 +90,12 @@ void _freeData(GWEN_UNUSED void *bp, void *p)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m)
|
AQCGI_SERVICE *AQH_ModService_GetService(const AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
return xm->service;
|
return xm->service;
|
||||||
}
|
}
|
||||||
@@ -105,12 +105,12 @@ AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m)
|
const char *AQH_ModService_GetBaseFolder(const AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
return xm->baseFolder;
|
return xm->baseFolder;
|
||||||
}
|
}
|
||||||
@@ -120,12 +120,12 @@ const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t AQH_ModService_GetUserPerms(const AQH_MODULE *m)
|
uint32_t AQH_ModService_GetUserPerms(const AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
return xm->userPerms;
|
return xm->userPerms;
|
||||||
}
|
}
|
||||||
@@ -135,12 +135,12 @@ uint32_t AQH_ModService_GetUserPerms(const AQH_MODULE *m)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn)
|
void AQH_ModService_SetHandleRequestFn(AQCGI_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
xm->handleRequestFn=fn;
|
xm->handleRequestFn=fn;
|
||||||
}
|
}
|
||||||
@@ -149,12 +149,12 @@ void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUE
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn)
|
void AQH_ModService_SetLoadSubModuleFn(AQCGI_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
xm->loadSubModuleFn=fn;
|
xm->loadSubModuleFn=fn;
|
||||||
}
|
}
|
||||||
@@ -163,12 +163,12 @@ void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODU
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetAddHeaderFn(AQH_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn)
|
void AQH_ModService_SetAddHeaderFn(AQCGI_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
xm->addHeaderFn=fn;
|
xm->addHeaderFn=fn;
|
||||||
}
|
}
|
||||||
@@ -177,12 +177,12 @@ void AQH_ModService_SetAddHeaderFn(AQH_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn)
|
void AQH_ModService_SetAddFooterFn(AQCGI_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
xm->addFooterFn=fn;
|
xm->addFooterFn=fn;
|
||||||
}
|
}
|
||||||
@@ -191,19 +191,19 @@ void AQH_ModService_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf)
|
void AQH_ModService_AddHeader(AQCGI_MODULE *m, const char *lang, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && dbuf) {
|
if (m && dbuf) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
if (xm->addHeaderFn)
|
if (xm->addHeaderFn)
|
||||||
xm->addHeaderFn(m, lang, dbuf);
|
xm->addHeaderFn(m, lang, dbuf);
|
||||||
else {
|
else {
|
||||||
AQH_MODULE *mParent;
|
AQCGI_MODULE *mParent;
|
||||||
|
|
||||||
mParent=AQH_Module_Tree2_GetParent(m);
|
mParent=AQCGI_Module_Tree2_GetParent(m);
|
||||||
if (mParent)
|
if (mParent)
|
||||||
AQH_ModService_AddHeader(mParent, lang, dbuf);
|
AQH_ModService_AddHeader(mParent, lang, dbuf);
|
||||||
AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_HEADERFILE, dbuf);
|
AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_HEADERFILE, dbuf);
|
||||||
@@ -214,21 +214,21 @@ 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)
|
void AQH_ModService_AddFooter(AQCGI_MODULE *m, const char *lang, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && dbuf) {
|
if (m && dbuf) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
if (xm->addFooterFn)
|
if (xm->addFooterFn)
|
||||||
xm->addFooterFn(m, lang, dbuf);
|
xm->addFooterFn(m, lang, dbuf);
|
||||||
else {
|
else {
|
||||||
AQH_MODULE *mParent;
|
AQCGI_MODULE *mParent;
|
||||||
|
|
||||||
AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
|
AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
|
||||||
|
|
||||||
mParent=AQH_Module_Tree2_GetParent(m);
|
mParent=AQCGI_Module_Tree2_GetParent(m);
|
||||||
if (mParent)
|
if (mParent)
|
||||||
AQH_ModService_AddFooter(mParent, lang, dbuf);
|
AQH_ModService_AddFooter(mParent, lang, dbuf);
|
||||||
}
|
}
|
||||||
@@ -238,7 +238,7 @@ void AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf)
|
int AQH_ModService_RespondWithFile(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
@@ -256,12 +256,40 @@ int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int AQH_ModService_RespondWithVarFile(AQCGI_MODULE *m, AQCGI_REQUEST *rq,
|
||||||
|
const char *lang,
|
||||||
|
const char *sFilename,
|
||||||
|
GWEN_DB_NODE *dbVars,
|
||||||
|
GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
GWEN_BUFFER *fbuf;
|
||||||
|
|
||||||
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
rv=AQH_ModService_ReadStaticFile(m, lang, sFilename, fbuf);
|
||||||
|
if (rv<0) {
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 500);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
||||||
|
GWEN_Buffer_free(fbuf);
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GWEN_DB_ReplaceVars(dbVars, GWEN_Buffer_GetStart(fbuf), dbuf);
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 200);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "Ok");
|
||||||
|
GWEN_Buffer_free(fbuf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_HandleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm && xm->handleRequestFn)
|
if (xm && xm->handleRequestFn)
|
||||||
return xm->handleRequestFn(m, rq, session, sLastPathElem);
|
return xm->handleRequestFn(m, rq, session, sLastPathElem);
|
||||||
}
|
}
|
||||||
@@ -270,14 +298,14 @@ int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *AQH_ModService_LoadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm && xm->loadSubModuleFn) {
|
if (xm && xm->loadSubModuleFn) {
|
||||||
AQH_MODULE *mReturn;
|
AQCGI_MODULE *mReturn;
|
||||||
|
|
||||||
mReturn=xm->loadSubModuleFn(m, rq, session, sModuleName);
|
mReturn=xm->loadSubModuleFn(m, rq, session, sModuleName);
|
||||||
if (mReturn)
|
if (mReturn)
|
||||||
@@ -290,12 +318,12 @@ AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_S
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf)
|
int AQH_ModService_ReadStaticFile(AQCGI_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (m && filename && dbuf) {
|
if (m && filename && dbuf) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
int rv;
|
int rv;
|
||||||
@@ -323,9 +351,9 @@ int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *f
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
AQCGI_SESSION *AQH_ModService_ReadSession(AQCGI_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
@@ -333,9 +361,9 @@ AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
|||||||
db=AQCGI_Request_GetDbRequestHeader(rq);
|
db=AQCGI_Request_GetDbRequestHeader(rq);
|
||||||
s=GWEN_DB_GetCharValue(db, "cookies/session", 0, NULL);
|
s=GWEN_DB_GetCharValue(db, "cookies/session", 0, NULL);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
AQH_SESSION *session;
|
AQCGI_SESSION *session;
|
||||||
|
|
||||||
session=AQH_Service_LoadSession(sv, s);
|
session=AQCGI_Service_LoadSession(sv, s);
|
||||||
if (session==NULL) {
|
if (session==NULL) {
|
||||||
DBG_ERROR(NULL, "Session \"%s\" not found", s);
|
DBG_ERROR(NULL, "Session \"%s\" not found", s);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -344,24 +372,24 @@ AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
|||||||
const char *sUserName;
|
const char *sUserName;
|
||||||
GWEN_BUFFER *tbuf;
|
GWEN_BUFFER *tbuf;
|
||||||
|
|
||||||
sUserName=AQH_Session_GetUserAlias(session);
|
sUserName=AQCGI_Session_GetUserAlias(session);
|
||||||
if (sUserName && *sUserName) {
|
if (sUserName && *sUserName) {
|
||||||
AQH_USER *user;
|
AQCGI_USER *user;
|
||||||
|
|
||||||
user=AQH_Service_LoadUser(sv, sUserName);
|
user=AQCGI_Service_LoadUser(sv, sUserName);
|
||||||
if (user==NULL) {
|
if (user==NULL) {
|
||||||
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
|
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DBG_ERROR(NULL, "User is \"%s\"", sUserName);
|
DBG_ERROR(NULL, "User is \"%s\"", sUserName);
|
||||||
}
|
}
|
||||||
AQH_Session_SetUser(session, user);
|
AQCGI_Session_SetUser(session, user);
|
||||||
}
|
}
|
||||||
/* renew session cookie */
|
/* renew session cookie */
|
||||||
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GWEN_Buffer_AppendArgs(tbuf, "Set-Cookie: session=%s; max-age=86400", AQH_Session_GetUid(session));
|
GWEN_Buffer_AppendArgs(tbuf, "Set-Cookie: session=%s; max-age=86400", AQCGI_Session_GetUid(session));
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf));
|
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf));
|
||||||
DBG_ERROR(NULL, "Renew session cookie");
|
DBG_ERROR(NULL, "Renew session cookie");
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
@@ -376,44 +404,44 @@ AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_CalcSessionModPerms(AQH_MODULE *m, const AQH_SESSION *session)
|
void AQH_ModService_CalcSessionModPerms(AQCGI_MODULE *m, const AQCGI_SESSION *session)
|
||||||
{
|
{
|
||||||
const AQH_USER *user;
|
const AQCGI_USER *user;
|
||||||
|
|
||||||
user=session?AQH_Session_GetUser(session):NULL;
|
user=session?AQCGI_Session_GetUser(session):NULL;
|
||||||
_calcUserModPerms(m, user);
|
_calcUserModPerms(m, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _calcUserModPerms(AQH_MODULE *m, const AQH_USER *user)
|
void _calcUserModPerms(AQCGI_MODULE *m, const AQCGI_USER *user)
|
||||||
{
|
{
|
||||||
if (m) {
|
if (m) {
|
||||||
AQH_MOD_SERVICE *xm;
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
xm=GWEN_INHERIT_GETDATA(AQCGI_MODULE, AQH_MOD_SERVICE, m);
|
||||||
if (xm) {
|
if (xm) {
|
||||||
uint32_t perms=0;
|
uint32_t perms=0;
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
if (AQH_User_GetFlags(user) & AQH_USER_FLAGS_ADMIN)
|
if (AQCGI_User_GetFlags(user) & AQCGI_USER_FLAGS_ADMIN)
|
||||||
perms=0xffffffff;
|
perms=0xffffffff;
|
||||||
else {
|
else {
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
const AQH_MODULE_PERMS_LIST *modPermsList;
|
const AQCGI_MODULE_PERMS_LIST *modPermsList;
|
||||||
AQH_MODULE_PERMS *modPerms;
|
AQCGI_MODULE_PERMS *modPerms;
|
||||||
|
|
||||||
sModName=AQH_Module_GetName(m);
|
sModName=AQCGI_Module_GetName(m);
|
||||||
modPermsList=AQH_User_GetModulePermList(user);
|
modPermsList=AQCGI_User_GetModulePermList(user);
|
||||||
modPerms=(sModName && modPermsList)?AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
|
modPerms=(sModName && modPermsList)?AQCGI_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
|
||||||
if (modPerms)
|
if (modPerms)
|
||||||
perms=_calcRolePerms(m, modPerms);
|
perms=_calcRolePerms(m, modPerms);
|
||||||
else
|
else
|
||||||
perms=AQH_Module_GetGuestPerms(m);
|
perms=AQCGI_Module_GetGuestPerms(m);
|
||||||
}
|
}
|
||||||
} /* if (user) */
|
} /* if (user) */
|
||||||
else
|
else
|
||||||
perms=AQH_Module_GetGuestPerms(m);
|
perms=AQCGI_Module_GetGuestPerms(m);
|
||||||
xm->userPerms=perms;
|
xm->userPerms=perms;
|
||||||
}
|
}
|
||||||
} /* if (m) */
|
} /* if (m) */
|
||||||
@@ -421,39 +449,39 @@ void _calcUserModPerms(AQH_MODULE *m, const AQH_USER *user)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t _calcRolePerms(const AQH_MODULE *m, const AQH_MODULE_PERMS *modPerms)
|
uint32_t _calcRolePerms(const AQCGI_MODULE *m, const AQCGI_MODULE_PERMS *modPerms)
|
||||||
{
|
{
|
||||||
uint32_t perms=0;
|
uint32_t perms=0;
|
||||||
const AQH_ROLE_LIST *roleList;
|
const AQCGI_ROLE_LIST *roleList;
|
||||||
|
|
||||||
roleList=AQH_Module_GetRoleList(m);
|
roleList=AQCGI_Module_GetRoleList(m);
|
||||||
if (roleList) {
|
if (roleList) {
|
||||||
int roleArraySize;
|
int roleArraySize;
|
||||||
int i;
|
int i;
|
||||||
uint32_t explAddPerms=0;
|
uint32_t explAddPerms=0;
|
||||||
uint32_t explDelPerms=0;
|
uint32_t explDelPerms=0;
|
||||||
|
|
||||||
roleArraySize=AQH_ModulePerms_GetRoleArrayArraySize();
|
roleArraySize=AQCGI_ModulePerms_GetRoleArrayArraySize();
|
||||||
for (i=0; i<roleArraySize; i++) {
|
for (i=0; i<roleArraySize; i++) {
|
||||||
int roleId;
|
int roleId;
|
||||||
|
|
||||||
roleId=AQH_ModulePerms_GetRoleArrayAt(modPerms, i);
|
roleId=AQCGI_ModulePerms_GetRoleArrayAt(modPerms, i);
|
||||||
if (roleId) {
|
if (roleId) {
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
|
|
||||||
role=AQH_Role_List_GetById(roleList, roleId);
|
role=AQCGI_Role_List_GetById(roleList, roleId);
|
||||||
if (role) {
|
if (role) {
|
||||||
perms|=AQH_Role_GetPerms(role);
|
perms|=AQCGI_Role_GetPerms(role);
|
||||||
explAddPerms|=AQH_Role_GetExplAddPerms(role);
|
explAddPerms|=AQCGI_Role_GetExplAddPerms(role);
|
||||||
explAddPerms|=AQH_Role_GetExplDelPerms(role);
|
explAddPerms|=AQCGI_Role_GetExplDelPerms(role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* for */
|
} /* for */
|
||||||
/* collate permissions */
|
/* collate permissions */
|
||||||
perms|=explAddPerms;
|
perms|=explAddPerms;
|
||||||
perms|=AQH_ModulePerms_GetExplAddPerms(modPerms);
|
perms|=AQCGI_ModulePerms_GetExplAddPerms(modPerms);
|
||||||
perms&=~explDelPerms;
|
perms&=~explDelPerms;
|
||||||
perms&=~AQH_ModulePerms_GetExplDelPerms(modPerms);
|
perms&=~AQCGI_ModulePerms_GetExplDelPerms(modPerms);
|
||||||
}
|
}
|
||||||
return perms;
|
return perms;
|
||||||
}
|
}
|
||||||
@@ -461,36 +489,36 @@ uint32_t _calcRolePerms(const AQH_MODULE *m, const AQH_MODULE_PERMS *modPerms)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_AddPermDef(AQH_PERMDEF_LIST *permDefList, const char *id, uint32_t mask, const char *descr)
|
void AQH_ModService_AddPermDef(AQCGI_PERMDEF_LIST *permDefList, const char *id, uint32_t mask, const char *descr)
|
||||||
{
|
{
|
||||||
AQH_PERMDEF *permDef;
|
AQCGI_PERMDEF *permDef;
|
||||||
|
|
||||||
permDef=AQH_PermDef_new();
|
permDef=AQCGI_PermDef_new();
|
||||||
AQH_PermDef_SetId(permDef, id);
|
AQCGI_PermDef_SetId(permDef, id);
|
||||||
AQH_PermDef_SetMask(permDef, mask);
|
AQCGI_PermDef_SetMask(permDef, mask);
|
||||||
AQH_PermDef_SetDescr(permDef, descr);
|
AQCGI_PermDef_SetDescr(permDef, descr);
|
||||||
AQH_PermDef_List_Add(permDef, permDefList);
|
AQCGI_PermDef_List_Add(permDef, permDefList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_AddRole(AQH_ROLE_LIST *roleList, int id, const char *name, uint32_t perms, const char *descr)
|
void AQH_ModService_AddRole(AQCGI_ROLE_LIST *roleList, int id, const char *name, uint32_t perms, const char *descr)
|
||||||
{
|
{
|
||||||
AQH_ROLE *role;
|
AQCGI_ROLE *role;
|
||||||
|
|
||||||
role=AQH_Role_new();
|
role=AQCGI_Role_new();
|
||||||
AQH_Role_SetId(role, id);
|
AQCGI_Role_SetId(role, id);
|
||||||
AQH_Role_SetName(role, name);
|
AQCGI_Role_SetName(role, name);
|
||||||
AQH_Role_SetPerms(role, perms);
|
AQCGI_Role_SetPerms(role, perms);
|
||||||
AQH_Role_SetDescr(role, descr);
|
AQCGI_Role_SetDescr(role, descr);
|
||||||
AQH_Role_List_Add(role, roleList);
|
AQCGI_Role_List_Add(role, roleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
|
void AQH_ModService_HandleRequestWithTable(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
const char *page,
|
const char *page,
|
||||||
const AQH_MODSERVICE_HANDLER_ENTRY *e)
|
const AQH_MODSERVICE_HANDLER_ENTRY *e)
|
||||||
{
|
{
|
||||||
@@ -517,11 +545,8 @@ void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
|
|||||||
AQCGI_Request_SetResponseText(rq, "Ok");
|
AQCGI_Request_SetResponseText(rq, "Ok");
|
||||||
if ((perms & e[i].perms)==e[i].perms)
|
if ((perms & e[i].perms)==e[i].perms)
|
||||||
(e[i].handlerFn)(m, rq, session, dbuf);
|
(e[i].handlerFn)(m, rq, session, dbuf);
|
||||||
else {
|
else
|
||||||
GWEN_Buffer_AppendString(dbuf, "<h1>Error</h1><p>No permissions for this request.</p>");
|
AQH_ModService_DenyRequest(m, rq, session, dbuf);
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -537,10 +562,10 @@ void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *permDefList, const char *sPrefix, GWEN_BUFFER *dbuf)
|
void AQH_ModService_WritePermsToForm(uint32_t perms, const AQCGI_PERMDEF_LIST *permDefList, const char *sPrefix, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (permDefList) {
|
if (permDefList) {
|
||||||
const AQH_PERMDEF *permDef;
|
const AQCGI_PERMDEF *permDef;
|
||||||
GWEN_BUFFER *tbuf;
|
GWEN_BUFFER *tbuf;
|
||||||
uint32_t pos;
|
uint32_t pos;
|
||||||
|
|
||||||
@@ -549,16 +574,16 @@ void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *per
|
|||||||
GBAA(tbuf, "%s:", sPrefix);
|
GBAA(tbuf, "%s:", sPrefix);
|
||||||
pos=GWEN_Buffer_GetPos(tbuf);
|
pos=GWEN_Buffer_GetPos(tbuf);
|
||||||
|
|
||||||
permDef=AQH_PermDef_List_First(permDefList);
|
permDef=AQCGI_PermDef_List_First(permDefList);
|
||||||
while(permDef) {
|
while(permDef) {
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_PermDef_GetId(permDef);
|
s=AQCGI_PermDef_GetId(permDef);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
|
|
||||||
GBAS(tbuf, s);
|
GBAS(tbuf, s);
|
||||||
mask=AQH_PermDef_GetMask(permDef);
|
mask=AQCGI_PermDef_GetMask(permDef);
|
||||||
if (perms & mask)
|
if (perms & mask)
|
||||||
GBAA(dbuf, "<input type=\"checkbox\" name=\"%s\" checked>", GWEN_Buffer_GetStart(tbuf));
|
GBAA(dbuf, "<input type=\"checkbox\" name=\"%s\" checked>", GWEN_Buffer_GetStart(tbuf));
|
||||||
else
|
else
|
||||||
@@ -566,7 +591,7 @@ void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *per
|
|||||||
GBAA(dbuf, "<label for=\"%s\">%s</label>", GWEN_Buffer_GetStart(tbuf), s?s:"");
|
GBAA(dbuf, "<label for=\"%s\">%s</label>", GWEN_Buffer_GetStart(tbuf), s?s:"");
|
||||||
GWEN_Buffer_Crop(tbuf, 0, pos);
|
GWEN_Buffer_Crop(tbuf, 0, pos);
|
||||||
}
|
}
|
||||||
permDef=AQH_PermDef_List_Next(permDef);
|
permDef=AQCGI_PermDef_List_Next(permDef);
|
||||||
}
|
}
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
}
|
}
|
||||||
@@ -574,12 +599,12 @@ void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *per
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDEF_LIST *permDefList, const char *sPrefix)
|
uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQCGI_PERMDEF_LIST *permDefList, const char *sPrefix)
|
||||||
{
|
{
|
||||||
uint32_t result=0;
|
uint32_t result=0;
|
||||||
|
|
||||||
if (permDefList) {
|
if (permDefList) {
|
||||||
const AQH_PERMDEF *permDef;
|
const AQCGI_PERMDEF *permDef;
|
||||||
GWEN_BUFFER *tbuf;
|
GWEN_BUFFER *tbuf;
|
||||||
uint32_t pos;
|
uint32_t pos;
|
||||||
|
|
||||||
@@ -588,23 +613,23 @@ uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDE
|
|||||||
GBAA(tbuf, "%s:", sPrefix);
|
GBAA(tbuf, "%s:", sPrefix);
|
||||||
pos=GWEN_Buffer_GetPos(tbuf);
|
pos=GWEN_Buffer_GetPos(tbuf);
|
||||||
|
|
||||||
permDef=AQH_PermDef_List_First(permDefList);
|
permDef=AQCGI_PermDef_List_First(permDefList);
|
||||||
while(permDef) {
|
while(permDef) {
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
||||||
id=AQH_PermDef_GetId(permDef);
|
id=AQCGI_PermDef_GetId(permDef);
|
||||||
if (id && *id) {
|
if (id && *id) {
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
GBAS(tbuf, id);
|
GBAS(tbuf, id);
|
||||||
mask=AQH_PermDef_GetMask(permDef);
|
mask=AQCGI_PermDef_GetMask(permDef);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, GWEN_Buffer_GetStart(tbuf), 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, GWEN_Buffer_GetStart(tbuf), 0, NULL);
|
||||||
if (s && *s)
|
if (s && *s)
|
||||||
result|=mask;
|
result|=mask;
|
||||||
GWEN_Buffer_Crop(tbuf, 0, pos);
|
GWEN_Buffer_Crop(tbuf, 0, pos);
|
||||||
}
|
}
|
||||||
permDef=AQH_PermDef_List_Next(permDef);
|
permDef=AQCGI_PermDef_List_Next(permDef);
|
||||||
}
|
}
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
}
|
}
|
||||||
@@ -614,36 +639,36 @@ uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDE
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE_LIST *AQH_ModService_LoadRawModules(AQH_MODULE *m)
|
AQCGI_MODULE_LIST *AQH_ModService_LoadRawModules(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_STRINGLIST *slModuleNames;
|
GWEN_STRINGLIST *slModuleNames;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
slModuleNames=AQH_Service_ListModules(sv);
|
slModuleNames=AQCGI_Service_ListModules(sv);
|
||||||
if (slModuleNames) {
|
if (slModuleNames) {
|
||||||
AQH_MODULE_LIST *modList;
|
AQCGI_MODULE_LIST *modList;
|
||||||
GWEN_STRINGLISTENTRY *se;
|
GWEN_STRINGLISTENTRY *se;
|
||||||
|
|
||||||
modList=AQH_Module_List_new();
|
modList=AQCGI_Module_List_new();
|
||||||
se=GWEN_StringList_FirstEntry(slModuleNames);
|
se=GWEN_StringList_FirstEntry(slModuleNames);
|
||||||
while(se) {
|
while(se) {
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
|
|
||||||
sModName=GWEN_StringListEntry_Data(se);
|
sModName=GWEN_StringListEntry_Data(se);
|
||||||
if (sModName && *sModName) {
|
if (sModName && *sModName) {
|
||||||
AQH_MODULE *currentMod;
|
AQCGI_MODULE *currentMod;
|
||||||
|
|
||||||
currentMod=AQH_Service_LoadModule(sv, sModName);
|
currentMod=AQCGI_Service_LoadModule(sv, sModName);
|
||||||
if (currentMod)
|
if (currentMod)
|
||||||
AQH_Module_List_Add(currentMod, modList);
|
AQCGI_Module_List_Add(currentMod, modList);
|
||||||
}
|
}
|
||||||
se=GWEN_StringListEntry_Next(se);
|
se=GWEN_StringListEntry_Next(se);
|
||||||
}
|
}
|
||||||
GWEN_StringList_free(slModuleNames);
|
GWEN_StringList_free(slModuleNames);
|
||||||
if (AQH_Module_List_GetCount(modList))
|
if (AQCGI_Module_List_GetCount(modList))
|
||||||
return modList;
|
return modList;
|
||||||
AQH_Module_List_free(modList);
|
AQCGI_Module_List_free(modList);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -651,36 +676,36 @@ AQH_MODULE_LIST *AQH_ModService_LoadRawModules(AQH_MODULE *m)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_USER_LIST *AQH_ModService_LoadRawUsers(AQH_MODULE *m)
|
AQCGI_USER_LIST *AQH_ModService_LoadRawUsers(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_STRINGLIST *slUserNames;
|
GWEN_STRINGLIST *slUserNames;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
slUserNames=AQH_Service_ListUsers(sv);
|
slUserNames=AQCGI_Service_ListUsers(sv);
|
||||||
if (slUserNames) {
|
if (slUserNames) {
|
||||||
AQH_USER_LIST *userList;
|
AQCGI_USER_LIST *userList;
|
||||||
GWEN_STRINGLISTENTRY *se;
|
GWEN_STRINGLISTENTRY *se;
|
||||||
|
|
||||||
userList=AQH_User_List_new();
|
userList=AQCGI_User_List_new();
|
||||||
se=GWEN_StringList_FirstEntry(slUserNames);
|
se=GWEN_StringList_FirstEntry(slUserNames);
|
||||||
while(se) {
|
while(se) {
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
|
|
||||||
sModName=GWEN_StringListEntry_Data(se);
|
sModName=GWEN_StringListEntry_Data(se);
|
||||||
if (sModName && *sModName) {
|
if (sModName && *sModName) {
|
||||||
AQH_USER *u;
|
AQCGI_USER *u;
|
||||||
|
|
||||||
u=AQH_Service_LoadUser(sv, sModName);
|
u=AQCGI_Service_LoadUser(sv, sModName);
|
||||||
if (u)
|
if (u)
|
||||||
AQH_User_List_Add(u, userList);
|
AQCGI_User_List_Add(u, userList);
|
||||||
}
|
}
|
||||||
se=GWEN_StringListEntry_Next(se);
|
se=GWEN_StringListEntry_Next(se);
|
||||||
}
|
}
|
||||||
GWEN_StringList_free(slUserNames);
|
GWEN_StringList_free(slUserNames);
|
||||||
if (AQH_User_List_GetCount(userList))
|
if (AQCGI_User_List_GetCount(userList))
|
||||||
return userList;
|
return userList;
|
||||||
AQH_User_List_free(userList);
|
AQCGI_User_List_free(userList);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -818,3 +843,81 @@ int AQH_ModService_RespondWithMimeFile(AQCGI_REQUEST *rq, const char *sFilename,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_AddRequestUrl(const AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
GWEN_DB_NODE *dbRequest;
|
||||||
|
|
||||||
|
dbRequest=AQCGI_Request_GetDbRequestHeader(rq);
|
||||||
|
if (dbRequest) {
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf,
|
||||||
|
"%s%s",
|
||||||
|
GWEN_DB_GetCharValue(dbRequest, "SCRIPT_NAME", 0, ""),
|
||||||
|
GWEN_DB_GetCharValue(dbRequest, "PATH_INFO", 0, ""));
|
||||||
|
s=GWEN_DB_GetCharValue(dbRequest, "QUERY_STRING", 0, NULL);
|
||||||
|
if (s && *s)
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf, "?%s", s);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_Redirect(AQCGI_REQUEST *rq, const char *destLocation)
|
||||||
|
{
|
||||||
|
GWEN_BUFFER *dbuf;
|
||||||
|
|
||||||
|
dbuf=GWEN_Buffer_new(0, 128, 0, 1);
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf, "Location: %s", destLocation);
|
||||||
|
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(dbuf));
|
||||||
|
GWEN_Buffer_free(dbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation)
|
||||||
|
{
|
||||||
|
GWEN_BUFFER *dbuf;
|
||||||
|
GWEN_BUFFER *ubuf;
|
||||||
|
|
||||||
|
dbuf=GWEN_Buffer_new(0, 128, 0, 1);
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf, "Location: %s", destLocation);
|
||||||
|
|
||||||
|
ubuf=GWEN_Buffer_new(0, 128, 0, 1);
|
||||||
|
if (AQH_ModService_AddRequestUrl(rq, ubuf)) {
|
||||||
|
DBG_ERROR(NULL, "Adding header: [%s]", GWEN_Buffer_GetStart(ubuf));
|
||||||
|
GWEN_Buffer_AppendString(dbuf, "?src=");
|
||||||
|
GWEN_Text_EscapeToBuffer(GWEN_Buffer_GetStart(ubuf), dbuf);
|
||||||
|
}
|
||||||
|
GWEN_Buffer_free(ubuf);
|
||||||
|
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
|
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(dbuf));
|
||||||
|
GWEN_Buffer_free(dbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_DenyRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
if (session && AQCGI_Session_GetUser(session)) {
|
||||||
|
/* no permissions */
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 403);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
||||||
|
if (dbuf)
|
||||||
|
GWEN_Buffer_AppendString(dbuf, "<h1>Error</h1><p>No permissions for this request.</p>");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* need login */
|
||||||
|
AQH_ModService_RedirectWithReferer(rq, AQCGI_Service_GetLoginUrl(AQH_ModService_GetService(m)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
#ifndef AQHOME_CGI_MSERVICE_H
|
#ifndef AQHOME_CGI_MSERVICE_H
|
||||||
#define AQHOME_CGI_MSERVICE_H
|
#define AQHOME_CGI_MSERVICE_H
|
||||||
|
|
||||||
#include <aqhome-cgi/service/module.h>
|
#include <aqcgi/service/module.h>
|
||||||
#include <aqhome-cgi/service/service.h>
|
#include <aqcgi/service/service.h>
|
||||||
#include <aqhome-cgi/service/session.h>
|
#include <aqcgi/service/session.h>
|
||||||
|
|
||||||
#include <aqcgi/request.h>
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
@@ -22,10 +22,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_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 AQCGI_MODULE* (*AQH_MODSERVICE_LOADSUBMODULE_FN)(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
typedef void (*AQH_MODSERVICE_ADDHEADER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
typedef void (*AQH_MODSERVICE_ADDHEADER_FN)(AQCGI_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
||||||
typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQCGI_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
typedef struct AQH_MODSERVICE_HANDLER_ENTRY AQH_MODSERVICE_HANDLER_ENTRY;
|
typedef struct AQH_MODSERVICE_HANDLER_ENTRY AQH_MODSERVICE_HANDLER_ENTRY;
|
||||||
@@ -33,52 +33,52 @@ struct AQH_MODSERVICE_HANDLER_ENTRY {
|
|||||||
const char *page;
|
const char *page;
|
||||||
int httpMethod;
|
int httpMethod;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
void (*handlerFn)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
void (*handlerFn)(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModService_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m);
|
AQCGI_SERVICE *AQH_ModService_GetService(const AQCGI_MODULE *m);
|
||||||
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m);
|
const char *AQH_ModService_GetBaseFolder(const AQCGI_MODULE *m);
|
||||||
|
|
||||||
uint32_t AQH_ModService_GetUserPerms(const AQH_MODULE *m);
|
uint32_t AQH_ModService_GetUserPerms(const AQCGI_MODULE *m);
|
||||||
|
|
||||||
void AQH_ModService_AddHeader(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
void AQH_ModService_AddHeader(AQCGI_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
||||||
void AQH_ModService_AddFooter(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
|
void AQH_ModService_AddFooter(AQCGI_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);
|
AQCGI_MODULE *AQH_ModService_LoadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
int AQH_ModService_HandleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
|
|
||||||
AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
AQCGI_SESSION *AQH_ModService_ReadSession(AQCGI_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
void AQH_ModService_CalcSessionModPerms(AQH_MODULE *m, const AQH_SESSION *session);
|
void AQH_ModService_CalcSessionModPerms(AQCGI_MODULE *m, const AQCGI_SESSION *session);
|
||||||
|
|
||||||
void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
|
void AQH_ModService_HandleRequestWithTable(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
const char *page,
|
const char *page,
|
||||||
const AQH_MODSERVICE_HANDLER_ENTRY *e);
|
const AQH_MODSERVICE_HANDLER_ENTRY *e);
|
||||||
|
|
||||||
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf);
|
int AQH_ModService_RespondWithFile(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const char *lang, const char *sFilename, GWEN_BUFFER *dbuf);
|
||||||
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf);
|
int AQH_ModService_ReadStaticFile(AQCGI_MODULE *m, const char *lang, const char *filename, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
void AQH_ModService_AddPermDef(AQH_PERMDEF_LIST *permDefList, const char *id, uint32_t mask, const char *descr);
|
void AQH_ModService_AddPermDef(AQCGI_PERMDEF_LIST *permDefList, const char *id, uint32_t mask, const char *descr);
|
||||||
void AQH_ModService_AddRole(AQH_ROLE_LIST *roleList, int id, const char *name, uint32_t perms, const char *descr);
|
void AQH_ModService_AddRole(AQCGI_ROLE_LIST *roleList, int id, const char *name, uint32_t perms, const char *descr);
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *permDefList, const char *sPrefix, GWEN_BUFFER *dbuf);
|
void AQH_ModService_WritePermsToForm(uint32_t perms, const AQCGI_PERMDEF_LIST *permDefList, const char *sPrefix, GWEN_BUFFER *dbuf);
|
||||||
uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDEF_LIST *permDefList, const char *sPrefix);
|
uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQCGI_PERMDEF_LIST *permDefList, const char *sPrefix);
|
||||||
|
|
||||||
AQH_MODULE_LIST *AQH_ModService_LoadRawModules(AQH_MODULE *m);
|
AQCGI_MODULE_LIST *AQH_ModService_LoadRawModules(AQCGI_MODULE *m);
|
||||||
AQH_USER_LIST *AQH_ModService_LoadRawUsers(AQH_MODULE *m);
|
AQCGI_USER_LIST *AQH_ModService_LoadRawUsers(AQCGI_MODULE *m);
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn);
|
void AQH_ModService_SetHandleRequestFn(AQCGI_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn);
|
||||||
void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn);
|
void AQH_ModService_SetLoadSubModuleFn(AQCGI_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn);
|
||||||
|
|
||||||
void AQH_ModService_SetAddHeaderFn(AQH_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn);
|
void AQH_ModService_SetAddHeaderFn(AQCGI_MODULE *m, AQH_MODSERVICE_ADDHEADER_FN fn);
|
||||||
void AQH_ModService_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn);
|
void AQH_ModService_SetAddFooterFn(AQCGI_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn);
|
||||||
|
|
||||||
void AQH_ModService_EscapeToBuffer(const char *src, GWEN_BUFFER *buf);
|
void AQH_ModService_EscapeToBuffer(const char *src, GWEN_BUFFER *buf);
|
||||||
void AQH_ModService_UnescapeToBuffer(const char *src, GWEN_BUFFER *buf);
|
void AQH_ModService_UnescapeToBuffer(const char *src, GWEN_BUFFER *buf);
|
||||||
@@ -86,6 +86,16 @@ void AQH_ModService_UnescapeToBuffer(const char *src, GWEN_BUFFER *buf);
|
|||||||
int AQH_ModService_FileIsCurrent(const char *sPath, int seconds);
|
int AQH_ModService_FileIsCurrent(const char *sPath, int seconds);
|
||||||
|
|
||||||
int AQH_ModService_RespondWithMimeFile(AQCGI_REQUEST *rq, const char *sFilename, const char *sMimeType, GWEN_BUFFER *dbuf);
|
int AQH_ModService_RespondWithMimeFile(AQCGI_REQUEST *rq, const char *sFilename, const char *sMimeType, GWEN_BUFFER *dbuf);
|
||||||
|
int AQH_ModService_RespondWithVarFile(AQCGI_MODULE *m, AQCGI_REQUEST *rq,
|
||||||
|
const char *lang,
|
||||||
|
const char *sFilename,
|
||||||
|
GWEN_DB_NODE *dbVars,
|
||||||
|
GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
int AQH_ModService_AddRequestUrl(const AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
||||||
|
void AQH_ModService_Redirect(AQCGI_REQUEST *rq, const char *destLocation);
|
||||||
|
void AQH_ModService_RedirectWithReferer(AQCGI_REQUEST *rq, const char *destLocation);
|
||||||
|
void AQH_ModService_DenyRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, const AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
typedef struct AQH_MOD_SERVICE AQH_MOD_SERVICE;
|
typedef struct AQH_MOD_SERVICE AQH_MOD_SERVICE;
|
||||||
struct AQH_MOD_SERVICE {
|
struct AQH_MOD_SERVICE {
|
||||||
AQH_SERVICE *service;
|
AQCGI_SERVICE *service;
|
||||||
char *baseFolder;
|
char *baseFolder;
|
||||||
uint32_t userPerms;
|
uint32_t userPerms;
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#include "./musers.h"
|
#include "./musers.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
@@ -36,38 +36,37 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _createPermDefList(AQH_MODULE *m);
|
static void _createPermDefList(AQCGI_MODULE *m);
|
||||||
static void _createRoleList(AQH_MODULE *m);
|
static void _createRoleList(AQCGI_MODULE *m);
|
||||||
|
|
||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
|
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
static void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqEditUserPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqAddUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqAddUserPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static int _getHighestUserId(const AQH_USER_LIST *userList);
|
static int _getHighestUserId(const AQCGI_USER_LIST *userList);
|
||||||
static int _modulePermsHasRole(const AQH_MODULE_PERMS *modPerms, uint8_t rid);
|
static int _modulePermsHasRole(const AQCGI_MODULE_PERMS *modPerms, uint8_t rid);
|
||||||
|
|
||||||
static void _writeEditUserForm(AQH_MODULE *m,
|
static void _writeEditUserForm(AQCGI_MODULE *m,
|
||||||
const AQH_USER *u,
|
const AQCGI_USER *u,
|
||||||
const char *sAlias,
|
const char *sAlias,
|
||||||
const char *sUrl,
|
const char *sUrl,
|
||||||
const char *sSubmitText,
|
const char *sSubmitText,
|
||||||
GWEN_BUFFER *dbuf);
|
GWEN_BUFFER *dbuf);
|
||||||
static void _writeUserModRolesToForm(const AQH_ROLE_LIST *roles, const AQH_MODULE_PERMS *perms, const char *sModName, GWEN_BUFFER *dbuf);
|
static void _writeUserModRolesToForm(const AQCGI_ROLE_LIST *roles, const AQCGI_MODULE_PERMS *perms, const char *sModName, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _readAllModRolesForUserFromForm(AQH_MODULE *m, GWEN_DB_NODE *dbPost, AQH_USER *u);
|
static void _readAllModRolesForUserFromForm(AQCGI_MODULE *m, GWEN_DB_NODE *dbPost, AQCGI_USER *u);
|
||||||
static void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
|
static void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
|
||||||
const AQH_ROLE_LIST *roleList,
|
const AQCGI_ROLE_LIST *roleList,
|
||||||
const char *sPrefix,
|
const char *sPrefix,
|
||||||
AQH_MODULE_PERMS *modPerms);
|
AQCGI_MODULE_PERMS *modPerms);
|
||||||
|
|
||||||
static void _addLabelAndInputToFormTableH(const char *title, const char *name, const char *value, const char *xxtra, GWEN_BUFFER *dbuf);
|
static void _addLabelAndInputToFormTableH(const char *title, const char *name, const char *value, const char *xxtra, GWEN_BUFFER *dbuf);
|
||||||
static void _addUserStateLabelAndSelectionToFormTableH(const char *sTitle, const char *sName, int st, GWEN_BUFFER *dbuf);
|
static void _addUserStateLabelAndSelectionToFormTableH(const char *sTitle, const char *sName, int st, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _setLocationHeaderForMod(AQCGI_REQUEST *rq, const char *page, const char *sModName);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +91,7 @@ static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModAdmUsers_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModAdmUsers_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
@@ -101,63 +100,63 @@ void AQH_ModAdmUsers_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFold
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModAdmUsers_Create(AQH_SERVICE *sv)
|
int AQH_ModAdmUsers_Create(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
m=AQH_Module_new();
|
m=AQCGI_Module_new();
|
||||||
AQH_Module_SetName(m, "users");
|
AQCGI_Module_SetName(m, "users");
|
||||||
AQH_Module_SetDescr(m, "user administration module");
|
AQCGI_Module_SetDescr(m, "user administration module");
|
||||||
AQH_Module_SetGuestPerms(m, 0);
|
AQCGI_Module_SetGuestPerms(m, 0);
|
||||||
|
|
||||||
_createPermDefList(m);
|
_createPermDefList(m);
|
||||||
_createRoleList(m);
|
_createRoleList(m);
|
||||||
|
|
||||||
rv=AQH_Service_AddModule(sv, m);
|
rv=AQCGI_Service_AddModule(sv, m);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
}
|
}
|
||||||
AQH_Module_free(m);
|
AQCGI_Module_free(m);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createPermDefList(AQH_MODULE *m)
|
void _createPermDefList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
|
|
||||||
permDefList=AQH_PermDef_List_new();
|
permDefList=AQCGI_PermDef_List_new();
|
||||||
|
|
||||||
AQH_ModService_AddPermDef(permDefList, "UserRead", 0x001, "Read users");
|
AQH_ModService_AddPermDef(permDefList, "UserRead", 0x001, "Read users");
|
||||||
AQH_ModService_AddPermDef(permDefList, "UserWrite", 0x002, "Modify users");
|
AQH_ModService_AddPermDef(permDefList, "UserWrite", 0x002, "Modify users");
|
||||||
AQH_ModService_AddPermDef(permDefList, "UserAdd", 0x004, "Add users");
|
AQH_ModService_AddPermDef(permDefList, "UserAdd", 0x004, "Add users");
|
||||||
AQH_ModService_AddPermDef(permDefList, "UserDel", 0x008, "Remove users");
|
AQH_ModService_AddPermDef(permDefList, "UserDel", 0x008, "Remove users");
|
||||||
|
|
||||||
AQH_Module_SetPermDefList(m, permDefList);
|
AQCGI_Module_SetPermDefList(m, permDefList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createRoleList(AQH_MODULE *m)
|
void _createRoleList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
int id=0;
|
int id=1;
|
||||||
|
|
||||||
roleList=AQH_Role_List_new();
|
roleList=AQCGI_Role_List_new();
|
||||||
AQH_ModService_AddRole(roleList, id++, "admin",
|
AQH_ModService_AddRole(roleList, id++, "admin",
|
||||||
AQH_MODADMUSERS_PERMS_USERSREAD |
|
AQH_MODADMUSERS_PERMS_USERSREAD |
|
||||||
AQH_MODADMUSERS_PERMS_USERSWRITE |
|
AQH_MODADMUSERS_PERMS_USERSWRITE |
|
||||||
AQH_MODADMUSERS_PERMS_USERSADD |
|
AQH_MODADMUSERS_PERMS_USERSADD |
|
||||||
AQH_MODADMUSERS_PERMS_USERSDEL,
|
AQH_MODADMUSERS_PERMS_USERSDEL,
|
||||||
"Administrator Role");
|
"Administrator Role");
|
||||||
AQH_Module_SetRoleList(m, roleList);
|
AQCGI_Module_SetRoleList(m, roleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
/* no sub-modules */
|
/* no sub-modules */
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -165,7 +164,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
||||||
return AQCGI_SendResponse(rq);
|
return AQCGI_SendResponse(rq);
|
||||||
@@ -173,9 +172,9 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_USER_LIST *userList;
|
AQCGI_USER_LIST *userList;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
|
|
||||||
perms=AQH_ModService_GetUserPerms(m);
|
perms=AQH_ModService_GetUserPerms(m);
|
||||||
@@ -189,31 +188,31 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
"</thead>\n"
|
"</thead>\n"
|
||||||
"<tbody>\n");
|
"<tbody>\n");
|
||||||
if (userList) {
|
if (userList) {
|
||||||
const AQH_USER *u;
|
const AQCGI_USER *u;
|
||||||
|
|
||||||
AQH_User_List_SortByAlias(userList, 1);
|
AQCGI_User_List_SortByAlias(userList, 1);
|
||||||
u=AQH_User_List_First(userList);
|
u=AQCGI_User_List_First(userList);
|
||||||
while(u) {
|
while(u) {
|
||||||
const char *sUserAlias;
|
const char *sUserAlias;
|
||||||
|
|
||||||
sUserAlias=AQH_User_GetAlias(u);
|
sUserAlias=AQCGI_User_GetAlias(u);
|
||||||
if (sUserAlias && *sUserAlias) {
|
if (sUserAlias && *sUserAlias) {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
const char *s;
|
const char *s;
|
||||||
const char *sAlias;
|
const char *sAlias;
|
||||||
|
|
||||||
id=AQH_User_GetId(u);
|
id=AQCGI_User_GetId(u);
|
||||||
sAlias=AQH_User_GetAlias(u);
|
sAlias=AQCGI_User_GetAlias(u);
|
||||||
GBAS(dbuf, "<tr>");
|
GBAS(dbuf, "<tr>");
|
||||||
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) id);
|
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) id);
|
||||||
GBAA(dbuf, "<td>%s</td>", sAlias?sAlias:"");
|
GBAA(dbuf, "<td>%s</td>", sAlias?sAlias:"");
|
||||||
s=AQH_User_GetName(u);
|
s=AQCGI_User_GetName(u);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
s=AQH_UserState_toString(AQH_User_GetState(u));
|
s=AQCGI_UserState_toString(AQCGI_User_GetState(u));
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
s=AQH_User_GetEmail(u);
|
s=AQCGI_User_GetEmail(u);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
s=AQH_User_GetNotes(u);
|
s=AQCGI_User_GetNotes(u);
|
||||||
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
GBAA(dbuf, "<td>%s</td>", s?s:"");
|
||||||
|
|
||||||
GBAS(dbuf, "<td>");
|
GBAS(dbuf, "<td>");
|
||||||
@@ -226,12 +225,12 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
GBAA(dbuf, "</td>\n");
|
GBAA(dbuf, "</td>\n");
|
||||||
GBAA(dbuf, "</tr>\n");
|
GBAA(dbuf, "</tr>\n");
|
||||||
}
|
}
|
||||||
u=AQH_User_List_Next(u);
|
u=AQCGI_User_List_Next(u);
|
||||||
}
|
}
|
||||||
GBAS(dbuf,
|
GBAS(dbuf,
|
||||||
"</tbody>\n"
|
"</tbody>\n"
|
||||||
"</table>\n");
|
"</table>\n");
|
||||||
AQH_User_List_free(userList);
|
AQCGI_User_List_free(userList);
|
||||||
}
|
}
|
||||||
if (perms & AQH_MODADMUSERS_PERMS_USERSADD)
|
if (perms & AQH_MODADMUSERS_PERMS_USERSADD)
|
||||||
GBAS(dbuf, "<hr><a href=\"adduser.html\">Add User</a>");
|
GBAS(dbuf, "<hr><a href=\"adduser.html\">Add User</a>");
|
||||||
@@ -239,20 +238,20 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sAlias;
|
const char *sAlias;
|
||||||
AQH_USER *user;
|
AQCGI_USER *user;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sAlias=dbQuery?GWEN_DB_GetCharValue(dbQuery, "alias", 0, NULL):NULL;
|
sAlias=dbQuery?GWEN_DB_GetCharValue(dbQuery, "alias", 0, NULL):NULL;
|
||||||
user=(sAlias && *sAlias)?AQH_Service_LoadUser(sv, sAlias):NULL;
|
user=(sAlias && *sAlias)?AQCGI_Service_LoadUser(sv, sAlias):NULL;
|
||||||
if (user) {
|
if (user) {
|
||||||
_writeEditUserForm(m, user, sAlias, "edituser.html", "Save", dbuf);
|
_writeEditUserForm(m, user, sAlias, "edituser.html", "Save", dbuf);
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
@@ -263,44 +262,44 @@ void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqEditUserPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sAlias;
|
const char *sAlias;
|
||||||
AQH_USER *u;
|
AQCGI_USER *u;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL;
|
sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL;
|
||||||
u=(sAlias && *sAlias)?AQH_Service_LoadUser(sv, sAlias):NULL;
|
u=(sAlias && *sAlias)?AQCGI_Service_LoadUser(sv, sAlias):NULL;
|
||||||
if (u) {
|
if (u) {
|
||||||
const char *s;
|
const char *s;
|
||||||
int state;
|
int state;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
||||||
AQH_User_SetName(u, s);
|
AQCGI_User_SetName(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL);
|
||||||
AQH_User_SetEmail(u, s);
|
AQCGI_User_SetEmail(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL);
|
||||||
AQH_User_SetNotes(u, s);
|
AQCGI_User_SetNotes(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL);
|
||||||
state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown;
|
state=(s && *s)?AQCGI_UserState_fromString(s):AQCGI_UserState_Unknown;
|
||||||
if (state!=AQH_UserState_Unknown)
|
if (state!=AQCGI_UserState_Unknown)
|
||||||
AQH_User_SetState(u, state);
|
AQCGI_User_SetState(u, state);
|
||||||
|
|
||||||
_readAllModRolesForUserFromForm(m, dbPost, u);
|
_readAllModRolesForUserFromForm(m, dbPost, u);
|
||||||
|
|
||||||
rv=AQH_Service_SaveUser(sv, u);
|
rv=AQCGI_Service_SaveUser(sv, u);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
|
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
|
||||||
DBG_ERROR(NULL, "Could not save user \"%s\"", sAlias);
|
DBG_ERROR(NULL, "Could not save user \"%s\"", sAlias);
|
||||||
AQH_User_free(u);
|
AQCGI_User_free(u);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
|
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
|
||||||
AQH_User_free(u);
|
AQCGI_User_free(u);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
AQCGI_Request_SetResponseText(rq, "See other");
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
@@ -313,7 +312,7 @@ void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqAddUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
DBG_ERROR(NULL, "AddUser");
|
DBG_ERROR(NULL, "AddUser");
|
||||||
_writeEditUserForm(m, NULL, NULL, "adduser.html", "Add", dbuf);
|
_writeEditUserForm(m, NULL, NULL, "adduser.html", "Add", dbuf);
|
||||||
@@ -321,9 +320,9 @@ void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqAddUserPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sAlias;
|
const char *sAlias;
|
||||||
|
|
||||||
@@ -332,43 +331,41 @@ void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL;
|
sAlias=dbPost?GWEN_DB_GetCharValue(dbPost, "alias", 0, NULL):NULL;
|
||||||
// TODO: check alias validity
|
// TODO: check alias validity
|
||||||
if (sAlias) {
|
if (sAlias) {
|
||||||
AQH_USER *u;
|
AQCGI_USER *u;
|
||||||
const char *s;
|
const char *s;
|
||||||
int state;
|
int state;
|
||||||
int rv;
|
int rv;
|
||||||
uint32_t userId;
|
uint32_t userId;
|
||||||
AQH_USER_LIST *userList;
|
AQCGI_USER_LIST *userList;
|
||||||
|
|
||||||
u=AQH_User_new();
|
u=AQCGI_User_new();
|
||||||
userList=AQH_ModService_LoadRawUsers(m);
|
userList=AQH_ModService_LoadRawUsers(m);
|
||||||
userId=_getHighestUserId(userList)+1;
|
userId=_getHighestUserId(userList)+1;
|
||||||
AQH_User_SetId(u, userId);
|
AQCGI_User_SetId(u, userId);
|
||||||
AQH_User_SetAlias(u, sAlias);
|
AQCGI_User_SetAlias(u, sAlias);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "name", 0, NULL);
|
||||||
AQH_User_SetName(u, s);
|
AQCGI_User_SetName(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "email", 0, NULL);
|
||||||
AQH_User_SetEmail(u, s);
|
AQCGI_User_SetEmail(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "notes", 0, NULL);
|
||||||
AQH_User_SetNotes(u, s);
|
AQCGI_User_SetNotes(u, s);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, "status", 0, NULL);
|
||||||
state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown;
|
state=(s && *s)?AQCGI_UserState_fromString(s):AQCGI_UserState_Unknown;
|
||||||
if (state!=AQH_UserState_Unknown)
|
if (state!=AQCGI_UserState_Unknown)
|
||||||
AQH_User_SetState(u, state);
|
AQCGI_User_SetState(u, state);
|
||||||
|
|
||||||
rv=AQH_Service_AddUser(sv, u);
|
rv=AQCGI_Service_AddUser(sv, u);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
|
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
|
||||||
DBG_ERROR(NULL, "Could not save user \"%s\" (%d)", sAlias, rv);
|
DBG_ERROR(NULL, "Could not save user \"%s\" (%d)", sAlias, rv);
|
||||||
AQH_User_free(u);
|
AQCGI_User_free(u);
|
||||||
AQH_User_List_free(userList);
|
AQCGI_User_List_free(userList);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
|
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
|
||||||
AQH_User_free(u);
|
AQCGI_User_free(u);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQH_ModService_Redirect(rq, "index.html");
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_User_List_free(userList);
|
||||||
AQCGI_Request_SetResponseText(rq, "See other");
|
|
||||||
AQH_User_List_free(userList);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DBG_ERROR(NULL, "Missing alias");
|
DBG_ERROR(NULL, "Missing alias");
|
||||||
@@ -378,20 +375,20 @@ void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _getHighestUserId(const AQH_USER_LIST *userList)
|
int _getHighestUserId(const AQCGI_USER_LIST *userList)
|
||||||
{
|
{
|
||||||
int id=0;
|
int id=0;
|
||||||
|
|
||||||
if (userList) {
|
if (userList) {
|
||||||
const AQH_USER *user;
|
const AQCGI_USER *user;
|
||||||
|
|
||||||
user=AQH_User_List_First(userList);
|
user=AQCGI_User_List_First(userList);
|
||||||
while(user) {
|
while(user) {
|
||||||
int uid;
|
int uid;
|
||||||
|
|
||||||
uid=AQH_User_GetId(user);
|
uid=AQCGI_User_GetId(user);
|
||||||
id=(uid>id)?uid:id;
|
id=(uid>id)?uid:id;
|
||||||
user=AQH_User_List_Next(user);
|
user=AQCGI_User_List_Next(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
@@ -399,15 +396,15 @@ int _getHighestUserId(const AQH_USER_LIST *userList)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _modulePermsHasRole(const AQH_MODULE_PERMS *modPerms, uint8_t rid)
|
int _modulePermsHasRole(const AQCGI_MODULE_PERMS *modPerms, uint8_t rid)
|
||||||
{
|
{
|
||||||
if (modPerms) {
|
if (modPerms) {
|
||||||
int arraySize;
|
int arraySize;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
arraySize=AQH_ModulePerms_GetRoleArrayArraySize();
|
arraySize=AQCGI_ModulePerms_GetRoleArrayArraySize();
|
||||||
for(i=0; i<arraySize; i++) {
|
for(i=0; i<arraySize; i++) {
|
||||||
if (AQH_ModulePerms_GetRoleArrayAt(modPerms, i)==rid)
|
if (AQCGI_ModulePerms_GetRoleArrayAt(modPerms, i)==rid)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -419,14 +416,14 @@ int _modulePermsHasRole(const AQH_MODULE_PERMS *modPerms, uint8_t rid)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeEditUserForm(AQH_MODULE *m,
|
void _writeEditUserForm(AQCGI_MODULE *m,
|
||||||
const AQH_USER *u,
|
const AQCGI_USER *u,
|
||||||
const char *sAlias,
|
const char *sAlias,
|
||||||
const char *sUrl,
|
const char *sUrl,
|
||||||
const char *sSubmitText,
|
const char *sSubmitText,
|
||||||
GWEN_BUFFER *dbuf)
|
GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_MODULE_LIST *moduleList;
|
AQCGI_MODULE_LIST *moduleList;
|
||||||
|
|
||||||
/* write user info */
|
/* write user info */
|
||||||
GBAS(dbuf, "<h2>User Info</h2>\n");
|
GBAS(dbuf, "<h2>User Info</h2>\n");
|
||||||
@@ -435,10 +432,10 @@ void _writeEditUserForm(AQH_MODULE *m,
|
|||||||
"<table class=\"formtable\">\n",
|
"<table class=\"formtable\">\n",
|
||||||
sUrl?sUrl:"");
|
sUrl?sUrl:"");
|
||||||
_addLabelAndInputToFormTableH("Alias", "alias", sAlias, "required", dbuf);
|
_addLabelAndInputToFormTableH("Alias", "alias", sAlias, "required", dbuf);
|
||||||
_addLabelAndInputToFormTableH("Name", "name", u?AQH_User_GetName(u):NULL, NULL, dbuf);
|
_addLabelAndInputToFormTableH("Name", "name", u?AQCGI_User_GetName(u):NULL, NULL, dbuf);
|
||||||
_addLabelAndInputToFormTableH("Email", "email", u?AQH_User_GetEmail(u):NULL, NULL, dbuf);
|
_addLabelAndInputToFormTableH("Email", "email", u?AQCGI_User_GetEmail(u):NULL, NULL, dbuf);
|
||||||
_addLabelAndInputToFormTableH("Notes", "notes", u?AQH_User_GetNotes(u):NULL, NULL, dbuf);
|
_addLabelAndInputToFormTableH("Notes", "notes", u?AQCGI_User_GetNotes(u):NULL, NULL, dbuf);
|
||||||
_addUserStateLabelAndSelectionToFormTableH("Status", "status", u?AQH_User_GetState(u):AQH_UserState_Unknown, dbuf);
|
_addUserStateLabelAndSelectionToFormTableH("Status", "status", u?AQCGI_User_GetState(u):AQCGI_UserState_Unknown, dbuf);
|
||||||
|
|
||||||
GBAS(dbuf, "</table>\n");
|
GBAS(dbuf, "</table>\n");
|
||||||
|
|
||||||
@@ -452,26 +449,26 @@ void _writeEditUserForm(AQH_MODULE *m,
|
|||||||
"<tbody>\n");
|
"<tbody>\n");
|
||||||
moduleList=AQH_ModService_LoadRawModules(m);
|
moduleList=AQH_ModService_LoadRawModules(m);
|
||||||
if (moduleList) {
|
if (moduleList) {
|
||||||
const AQH_MODULE_PERMS_LIST *modPermsList;
|
const AQCGI_MODULE_PERMS_LIST *modPermsList;
|
||||||
const AQH_MODULE *currentMod;
|
const AQCGI_MODULE *currentMod;
|
||||||
|
|
||||||
modPermsList=u?AQH_User_GetModulePermList(u):NULL;
|
modPermsList=u?AQCGI_User_GetModulePermList(u):NULL;
|
||||||
currentMod=AQH_Module_List_First(moduleList);
|
currentMod=AQCGI_Module_List_First(moduleList);
|
||||||
while(currentMod) {
|
while(currentMod) {
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
const AQH_MODULE_PERMS *modPerms;
|
const AQCGI_MODULE_PERMS *modPerms;
|
||||||
|
|
||||||
sModName=AQH_Module_GetName(currentMod);
|
sModName=AQCGI_Module_GetName(currentMod);
|
||||||
GBAA(dbuf, "<tr><td>%s</td><td>", sModName);
|
GBAA(dbuf, "<tr><td>%s</td><td>", sModName);
|
||||||
|
|
||||||
modPerms=modPermsList?AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
|
modPerms=modPermsList?AQCGI_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
|
||||||
_writeUserModRolesToForm(AQH_Module_GetRoleList(currentMod), modPerms, sModName, dbuf);
|
_writeUserModRolesToForm(AQCGI_Module_GetRoleList(currentMod), modPerms, sModName, dbuf);
|
||||||
GBAS(dbuf, "</td></tr>\n");
|
GBAS(dbuf, "</td></tr>\n");
|
||||||
GBAS(dbuf, "<td>");
|
GBAS(dbuf, "<td>");
|
||||||
|
|
||||||
currentMod=AQH_Module_List_Next(currentMod);
|
currentMod=AQCGI_Module_List_Next(currentMod);
|
||||||
} /* while */
|
} /* while */
|
||||||
AQH_Module_List_free(moduleList);
|
AQCGI_Module_List_free(moduleList);
|
||||||
}
|
}
|
||||||
GBAS(dbuf,
|
GBAS(dbuf,
|
||||||
"</tbody>\n"
|
"</tbody>\n"
|
||||||
@@ -485,61 +482,61 @@ void _writeEditUserForm(AQH_MODULE *m,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _readAllModRolesForUserFromForm(AQH_MODULE *m, GWEN_DB_NODE *dbPost, AQH_USER *u)
|
void _readAllModRolesForUserFromForm(AQCGI_MODULE *m, GWEN_DB_NODE *dbPost, AQCGI_USER *u)
|
||||||
{
|
{
|
||||||
AQH_MODULE_LIST *moduleList;
|
AQCGI_MODULE_LIST *moduleList;
|
||||||
|
|
||||||
moduleList=AQH_ModService_LoadRawModules(m);
|
moduleList=AQH_ModService_LoadRawModules(m);
|
||||||
if (moduleList) {
|
if (moduleList) {
|
||||||
AQH_MODULE_PERMS_LIST *permsList;
|
AQCGI_MODULE_PERMS_LIST *permsList;
|
||||||
const AQH_MODULE *module;
|
const AQCGI_MODULE *module;
|
||||||
|
|
||||||
permsList=AQH_User_GetModulePermList(u);
|
permsList=AQCGI_User_GetModulePermList(u);
|
||||||
if (permsList==NULL) {
|
if (permsList==NULL) {
|
||||||
DBG_ERROR(NULL, "Creating module perms list for user");
|
DBG_ERROR(NULL, "Creating module perms list for user");
|
||||||
permsList=AQH_ModulePerms_List_new();
|
permsList=AQCGI_ModulePerms_List_new();
|
||||||
AQH_User_SetModulePermList(u, permsList);
|
AQCGI_User_SetModulePermList(u, permsList);
|
||||||
}
|
}
|
||||||
|
|
||||||
module=AQH_Module_List_First(moduleList);
|
module=AQCGI_Module_List_First(moduleList);
|
||||||
while(module) {
|
while(module) {
|
||||||
const char *sModName;
|
const char *sModName;
|
||||||
const AQH_ROLE_LIST *roleList;
|
const AQCGI_ROLE_LIST *roleList;
|
||||||
|
|
||||||
sModName=AQH_Module_GetName(module);
|
sModName=AQCGI_Module_GetName(module);
|
||||||
roleList=AQH_Module_GetRoleList(module);
|
roleList=AQCGI_Module_GetRoleList(module);
|
||||||
if (sModName && *sModName && roleList) {
|
if (sModName && *sModName && roleList) {
|
||||||
AQH_MODULE_PERMS *modPerms;
|
AQCGI_MODULE_PERMS *modPerms;
|
||||||
|
|
||||||
modPerms=AQH_ModulePerms_List_GetByModuleId(permsList, sModName);
|
modPerms=AQCGI_ModulePerms_List_GetByModuleId(permsList, sModName);
|
||||||
if (modPerms==NULL) {
|
if (modPerms==NULL) {
|
||||||
modPerms=AQH_ModulePerms_new();
|
modPerms=AQCGI_ModulePerms_new();
|
||||||
AQH_ModulePerms_SetModuleId(modPerms, sModName);
|
AQCGI_ModulePerms_SetModuleId(modPerms, sModName);
|
||||||
AQH_ModulePerms_List_Add(modPerms, permsList);
|
AQCGI_ModulePerms_List_Add(modPerms, permsList);
|
||||||
}
|
}
|
||||||
_readModRolesFromForm(dbPost, roleList, sModName, modPerms);
|
_readModRolesFromForm(dbPost, roleList, sModName, modPerms);
|
||||||
}
|
}
|
||||||
module=AQH_Module_List_Next(module);
|
module=AQCGI_Module_List_Next(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
AQH_Module_List_free(moduleList);
|
AQCGI_Module_List_free(moduleList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeUserModRolesToForm(const AQH_ROLE_LIST *roleList, const AQH_MODULE_PERMS *modPerms, const char *sModName, GWEN_BUFFER *dbuf)
|
void _writeUserModRolesToForm(const AQCGI_ROLE_LIST *roleList, const AQCGI_MODULE_PERMS *modPerms, const char *sModName, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (roleList) {
|
if (roleList) {
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
|
|
||||||
role=AQH_Role_List_First(roleList);
|
role=AQCGI_Role_List_First(roleList);
|
||||||
while(role) {
|
while(role) {
|
||||||
const char *sRoleName;
|
const char *sRoleName;
|
||||||
uint8_t roleId;
|
uint8_t roleId;
|
||||||
|
|
||||||
roleId=AQH_Role_GetId(role);
|
roleId=AQCGI_Role_GetId(role);
|
||||||
sRoleName=AQH_Role_GetName(role);
|
sRoleName=AQCGI_Role_GetName(role);
|
||||||
if (sRoleName && *sRoleName) {
|
if (sRoleName && *sRoleName) {
|
||||||
int isChecked;
|
int isChecked;
|
||||||
|
|
||||||
@@ -553,7 +550,7 @@ void _writeUserModRolesToForm(const AQH_ROLE_LIST *roleList, const AQH_MODULE_PE
|
|||||||
GBAA(dbuf, "<label for=\"%s\">%s</label>", sRoleName, sRoleName);
|
GBAA(dbuf, "<label for=\"%s\">%s</label>", sRoleName, sRoleName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
role=AQH_Role_List_Next(role);
|
role=AQCGI_Role_List_Next(role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -561,15 +558,15 @@ void _writeUserModRolesToForm(const AQH_ROLE_LIST *roleList, const AQH_MODULE_PE
|
|||||||
|
|
||||||
|
|
||||||
void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
|
void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
|
||||||
const AQH_ROLE_LIST *roleList,
|
const AQCGI_ROLE_LIST *roleList,
|
||||||
const char *sPrefix,
|
const char *sPrefix,
|
||||||
AQH_MODULE_PERMS *modPerms)
|
AQCGI_MODULE_PERMS *modPerms)
|
||||||
{
|
{
|
||||||
AQH_ModulePerms_PresetRoleArray(modPerms, 0);
|
AQCGI_ModulePerms_PresetRoleArray(modPerms, 0);
|
||||||
if (roleList) {
|
if (roleList) {
|
||||||
GWEN_BUFFER *tbuf;
|
GWEN_BUFFER *tbuf;
|
||||||
uint32_t pos;
|
uint32_t pos;
|
||||||
const AQH_ROLE *role;
|
const AQCGI_ROLE *role;
|
||||||
int nextRolePos=0;
|
int nextRolePos=0;
|
||||||
|
|
||||||
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
@@ -577,24 +574,27 @@ void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
|
|||||||
GBAA(tbuf, "%s:", sPrefix);
|
GBAA(tbuf, "%s:", sPrefix);
|
||||||
pos=GWEN_Buffer_GetPos(tbuf);
|
pos=GWEN_Buffer_GetPos(tbuf);
|
||||||
|
|
||||||
role=AQH_Role_List_First(roleList);
|
role=AQCGI_Role_List_First(roleList);
|
||||||
while(role) {
|
while(role) {
|
||||||
const char *roleName;
|
const char *roleName;
|
||||||
|
|
||||||
roleName=AQH_Role_GetName(role);
|
roleName=AQCGI_Role_GetName(role);
|
||||||
if (roleName && *roleName) {
|
if (roleName && *roleName) {
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
GBAS(tbuf, roleName);
|
GBAS(tbuf, roleName);
|
||||||
s=GWEN_DB_GetCharValue(dbPost, GWEN_Buffer_GetStart(tbuf), 0, NULL);
|
s=GWEN_DB_GetCharValue(dbPost, GWEN_Buffer_GetStart(tbuf), 0, NULL);
|
||||||
|
/*DBG_ERROR(NULL, "Role string %s = [%s]", GWEN_Buffer_GetStart(tbuf), s?s:"<empty>");*/
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
if (nextRolePos<AQH_ModulePerms_GetRoleArrayArraySize())
|
if (nextRolePos<AQCGI_ModulePerms_GetRoleArrayArraySize()) {
|
||||||
AQH_ModulePerms_SetRoleArrayAt(modPerms, nextRolePos++, AQH_Role_GetId(role));
|
/*DBG_ERROR(NULL, "Setting role \"%s\" (%d)", roleName, AQCGI_Role_GetId(role));*/
|
||||||
|
AQCGI_ModulePerms_SetRoleArrayAt(modPerms, nextRolePos++, AQCGI_Role_GetId(role));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
GWEN_Buffer_Crop(tbuf, 0, pos);
|
GWEN_Buffer_Crop(tbuf, 0, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
role=AQH_Role_List_Next(role);
|
role=AQCGI_Role_List_Next(role);
|
||||||
} /* while */
|
} /* while */
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
}
|
}
|
||||||
@@ -612,10 +612,10 @@ void _addUserStateLabelAndSelectionToFormTableH(const char *sTitle, const char *
|
|||||||
|
|
||||||
GBAA(dbuf, "<tr><td><label for=\"%s\">%s:</label></td>", sName?sName:"", sTitle?sTitle:"");
|
GBAA(dbuf, "<tr><td><label for=\"%s\">%s:</label></td>", sName?sName:"", sTitle?sTitle:"");
|
||||||
GBAA(dbuf, "<td><select name=\"%s\">", sName?sName:"");
|
GBAA(dbuf, "<td><select name=\"%s\">", sName?sName:"");
|
||||||
for(i=AQH_UserState_Unknown; i<=AQH_UserState_Active; i++) {
|
for(i=AQCGI_UserState_Unknown; i<=AQCGI_UserState_Active; i++) {
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_UserState_toString(i);
|
s=AQCGI_UserState_toString(i);
|
||||||
GBAA(dbuf, "<option value=\"%s\" %s>%s</option>", s, (i==st)?"selected":"", s);
|
GBAA(dbuf, "<option value=\"%s\" %s>%s</option>", s, (i==st)?"selected":"", s);
|
||||||
}
|
}
|
||||||
GBAS(dbuf, "</select></td></tr>");
|
GBAS(dbuf, "</select></td></tr>");
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModAdmUsers_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModAdmUsers_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
int AQH_ModAdmUsers_Create(AQH_SERVICE *sv);
|
int AQH_ModAdmUsers_Create(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,9 +22,10 @@
|
|||||||
#include "aqhome-cgi/modules/devices/mdevices_device.h"
|
#include "aqhome-cgi/modules/devices/mdevices_device.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_setdevice.h"
|
#include "aqhome-cgi/modules/devices/mdevices_setdevice.h"
|
||||||
#include "aqhome-cgi/modules/devices/mdevices_page.h"
|
#include "aqhome-cgi/modules/devices/mdevices_page.h"
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -51,20 +52,20 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
|
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
|
|
||||||
static void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqIndexGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqValuesTableGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqValuesTableGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqValuesGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqValuesGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqValueGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqValueGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqSetDataPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqDeviceGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqDeviceGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqDevicePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqDevicePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqPagePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
static void _handleRqPageGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
|
static void _handleRqPageGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static AQDG_GRAPH_DATAPAIR_LIST *_createDataPairListFromDataPoints(const uint64_t *dataPoints, uint64_t numValues);
|
static AQDG_GRAPH_DATAPAIR_LIST *_createDataPairListFromDataPoints(const uint64_t *dataPoints, uint64_t numValues);
|
||||||
|
|
||||||
@@ -100,7 +101,7 @@ static AQH_MODSERVICE_HANDLER_ENTRY _requestTable[]={
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModDevices_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
@@ -109,14 +110,14 @@ void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolde
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
AQH_ModService_HandleRequestWithTable(m, rq, session, sLastPathElem, _requestTable);
|
||||||
return AQCGI_SendResponse(rq);
|
return AQCGI_SendResponse(rq);
|
||||||
@@ -124,77 +125,77 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqIndexGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqIndexGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunIndex, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunIndex, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqValuesTableGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqValuesTableGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsTable, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsTable, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqValuesGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqValuesGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsGraph, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValuesAsGraph, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqValueGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqValueGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValue, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunValue, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqSetDataPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunSetData, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunSetData, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunGraphValue, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunGraphValue, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqDeviceGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqDeviceGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunDevice, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunDevice, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqDevicePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqDevicePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunSetDevice, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunSetDevice, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPageGet, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPageGet, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqPagePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPagePost, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPagePost, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleRqPageGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf)
|
void _handleRqPageGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPageGraph, dbuf);
|
AQH_ModDataClient_HandleRequest(m, rq, session, AQH_ModDevices_RunPageGraph, dbuf);
|
||||||
}
|
}
|
||||||
@@ -538,6 +539,25 @@ AQDG_GRAPH_DATAPAIR_LIST *AQH_ModDevices_RequestDataPairList(AQH_DATACLIENT *dc,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModDevices_RedirectToDevice(AQCGI_REQUEST *rq, const char *destLocation, const AQH_DEVICE *device)
|
||||||
|
{
|
||||||
|
const char *sDeviceName;
|
||||||
|
GWEN_BUFFER *pbuf;
|
||||||
|
|
||||||
|
sDeviceName=AQH_Device_GetName(device);
|
||||||
|
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
GWEN_Buffer_AppendString(pbuf, "Location: ");
|
||||||
|
GWEN_Buffer_AppendString(pbuf, (destLocation && *destLocation)?destLocation:"index.html");
|
||||||
|
if (sDeviceName && *sDeviceName) {
|
||||||
|
GWEN_Buffer_AppendString(pbuf, "?device=");
|
||||||
|
GWEN_Text_EscapeToBuffer(sDeviceName, pbuf);
|
||||||
|
}
|
||||||
|
AQH_ModService_Redirect(rq, GWEN_Buffer_GetStart(pbuf));
|
||||||
|
GWEN_Buffer_free(pbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQDG_GRAPH_DATAPAIR_LIST *_createDataPairListFromDataPoints(const uint64_t *dataPoints, uint64_t numValues)
|
AQDG_GRAPH_DATAPAIR_LIST *_createDataPairListFromDataPoints(const uint64_t *dataPoints, uint64_t numValues)
|
||||||
{
|
{
|
||||||
AQDG_GRAPH_DATAPAIR_LIST *dpList;
|
AQDG_GRAPH_DATAPAIR_LIST *dpList;
|
||||||
|
|||||||
@@ -39,8 +39,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModDevices_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
int AQH_ModDevices_Create(AQH_SERVICE *sv);
|
int AQH_ModDevices_Create(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
|
|
||||||
uint32_t AQH_ModDevices_ColorFromHexString(const char *s);
|
uint32_t AQH_ModDevices_ColorFromHexString(const char *s);
|
||||||
@@ -64,6 +64,7 @@ uint32_t AQH_ModDevices_ValueGetLastDataAsUint32(AQH_DATACLIENT *dc, const AQH_V
|
|||||||
AQDG_GRAPH_DATAPAIR_LIST *AQH_ModDevices_RequestDataPairList(AQH_DATACLIENT *dc, const char *systemValueName,
|
AQDG_GRAPH_DATAPAIR_LIST *AQH_ModDevices_RequestDataPairList(AQH_DATACLIENT *dc, const char *systemValueName,
|
||||||
uint64_t tsBegin, uint64_t tsEnd, uint64_t num);
|
uint64_t tsBegin, uint64_t tsEnd, uint64_t num);
|
||||||
|
|
||||||
|
void AQH_ModDevices_RedirectToDevice(AQCGI_REQUEST *rq, const char *destLocation, const AQH_DEVICE *device);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_device.h"
|
#include "./mdevices_device.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -38,9 +39,9 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _runDeviceWithArgs(AQH_MODULE *m,
|
static void _runDeviceWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
GWEN_BUFFER *dbuf);
|
GWEN_BUFFER *dbuf);
|
||||||
@@ -54,7 +55,7 @@ static void _addFieldToForm(const char *sFieldTitle, const char *sFieldName, con
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunDevice(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
@@ -74,9 +75,9 @@ void AQH_ModDevices_RunDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *ses
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _runDeviceWithArgs(AQH_MODULE *m,
|
void _runDeviceWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
GWEN_BUFFER *dbuf)
|
GWEN_BUFFER *dbuf)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunDevice(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_index.h"
|
#include "./mdevices_index.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -45,7 +46,7 @@ static void _addLinkForDevice(const char *page, const char *sDevice, const char
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_DEVICE_LIST *deviceList;
|
AQH_DEVICE_LIST *deviceList;
|
||||||
AQH_DEVICE *device;
|
AQH_DEVICE *device;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_init.h"
|
#include "./mdevices_init.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -40,8 +41,8 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _createPermDefList(AQH_MODULE *m);
|
static void _createPermDefList(AQCGI_MODULE *m);
|
||||||
static void _createRoleList(AQH_MODULE *m);
|
static void _createRoleList(AQCGI_MODULE *m);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -50,34 +51,34 @@ static void _createRoleList(AQH_MODULE *m);
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int AQH_ModDevices_Create(AQH_SERVICE *sv)
|
int AQH_ModDevices_Create(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
m=AQH_Module_new();
|
m=AQCGI_Module_new();
|
||||||
AQH_Module_SetName(m, "devices");
|
AQCGI_Module_SetName(m, "devices");
|
||||||
AQH_Module_SetDescr(m, "device module");
|
AQCGI_Module_SetDescr(m, "device module");
|
||||||
AQH_Module_SetGuestPerms(m, 0);
|
AQCGI_Module_SetGuestPerms(m, 0);
|
||||||
|
|
||||||
_createPermDefList(m);
|
_createPermDefList(m);
|
||||||
_createRoleList(m);
|
_createRoleList(m);
|
||||||
|
|
||||||
rv=AQH_Service_AddModule(sv, m);
|
rv=AQCGI_Service_AddModule(sv, m);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_INFO(NULL, "here (%d)", rv);
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
}
|
}
|
||||||
AQH_Module_free(m);
|
AQCGI_Module_free(m);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createPermDefList(AQH_MODULE *m)
|
void _createPermDefList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_PERMDEF_LIST *permDefList;
|
AQCGI_PERMDEF_LIST *permDefList;
|
||||||
|
|
||||||
permDefList=AQH_PermDef_List_new();
|
permDefList=AQCGI_PermDef_List_new();
|
||||||
|
|
||||||
AQH_ModService_AddPermDef(permDefList, "DeviceRead", 0x001, "Read and list devices");
|
AQH_ModService_AddPermDef(permDefList, "DeviceRead", 0x001, "Read and list devices");
|
||||||
AQH_ModService_AddPermDef(permDefList, "DeviceWrite", 0x002, "Modify devices");
|
AQH_ModService_AddPermDef(permDefList, "DeviceWrite", 0x002, "Modify devices");
|
||||||
@@ -90,17 +91,17 @@ void _createPermDefList(AQH_MODULE *m)
|
|||||||
AQH_ModService_AddPermDef(permDefList, "ValueDel", 0x080, "Remove values");
|
AQH_ModService_AddPermDef(permDefList, "ValueDel", 0x080, "Remove values");
|
||||||
AQH_ModService_AddPermDef(permDefList, "ValueSet", 0x100, "Set values");
|
AQH_ModService_AddPermDef(permDefList, "ValueSet", 0x100, "Set values");
|
||||||
|
|
||||||
AQH_Module_SetPermDefList(m, permDefList);
|
AQCGI_Module_SetPermDefList(m, permDefList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _createRoleList(AQH_MODULE *m)
|
void _createRoleList(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
AQH_ROLE_LIST *roleList;
|
AQCGI_ROLE_LIST *roleList;
|
||||||
int id=0;
|
int id=1;
|
||||||
|
|
||||||
roleList=AQH_Role_List_new();
|
roleList=AQCGI_Role_List_new();
|
||||||
AQH_ModService_AddRole(roleList, id++, "Reader",
|
AQH_ModService_AddRole(roleList, id++, "Reader",
|
||||||
AQH_MODDEVICES_PERMS_DEVICEREAD |
|
AQH_MODDEVICES_PERMS_DEVICEREAD |
|
||||||
AQH_MODDEVICES_PERMS_VALUEREAD,
|
AQH_MODDEVICES_PERMS_VALUEREAD,
|
||||||
@@ -121,7 +122,7 @@ void _createRoleList(AQH_MODULE *m)
|
|||||||
AQH_MODDEVICES_PERMS_VALUEREAD |
|
AQH_MODDEVICES_PERMS_VALUEREAD |
|
||||||
AQH_MODDEVICES_PERMS_VALUESET,
|
AQH_MODDEVICES_PERMS_VALUESET,
|
||||||
"Set values");
|
"Set values");
|
||||||
AQH_Module_SetRoleList(m, roleList);
|
AQCGI_Module_SetRoleList(m, roleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_ModDevices_Create(AQH_SERVICE *sv);
|
int AQH_ModDevices_Create(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_page.h"
|
#include "./mdevices_page.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <aqdiagram/graph/timegraph.h>
|
#include <aqdiagram/graph/timegraph.h>
|
||||||
#include <aqdiagram/graph/w_graph.h>
|
#include <aqdiagram/graph/w_graph.h>
|
||||||
#include <aqdiagram/draw/context_cairo.h>
|
#include <aqdiagram/draw/context_cairo.h>
|
||||||
@@ -54,19 +55,19 @@ enum {
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _writePage(AQH_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, GWEN_BUFFER *dbuf);
|
static void _writePage(AQCGI_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, GWEN_BUFFER *dbuf);
|
||||||
static void _writeItem(AQH_MODULE *m, AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *nItem, GWEN_BUFFER *dbuf);
|
static void _writeItem(AQCGI_MODULE *m, AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *nItem, GWEN_BUFFER *dbuf);
|
||||||
static void _writeActor(AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *n, int layout, GWEN_BUFFER *dbuf);
|
static void _writeActor(AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *n, int layout, GWEN_BUFFER *dbuf);
|
||||||
static void _writeGraph(const char *sPageId, GWEN_XMLNODE *n, int layout, GWEN_BUFFER *dbuf);
|
static void _writeGraph(const char *sPageId, GWEN_XMLNODE *n, int layout, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
static void _handlePageActor(AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sActorId, GWEN_XMLNODE *nActor);
|
static void _handlePageActor(AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sActorId, GWEN_XMLNODE *nActor);
|
||||||
static void _handlePageGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sGraphId, GWEN_XMLNODE *nGraph, GWEN_BUFFER *dbuf);
|
static void _handlePageGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sGraphId, GWEN_XMLNODE *nGraph, GWEN_BUFFER *dbuf);
|
||||||
static void _genPageGraph(AQH_DATACLIENT *dc, const char *sGraphId, const char *sFilename, GWEN_XMLNODE *nGraph);
|
static void _genPageGraph(AQH_DATACLIENT *dc, const char *sGraphId, const char *sFilename, GWEN_XMLNODE *nGraph);
|
||||||
static void _addCurves(AQH_DATACLIENT *dc, AQDG_GRAPH *g, GWEN_XMLNODE *nGraph, uint64_t tsBegin, uint64_t tsEnd);
|
static void _addCurves(AQH_DATACLIENT *dc, AQDG_GRAPH *g, GWEN_XMLNODE *nGraph, uint64_t tsBegin, uint64_t tsEnd);
|
||||||
static AQDG_GRAPH_DATAPAIR_LIST *_readCurveData(AQH_DATACLIENT *dc, GWEN_XMLNODE *nCurve, uint64_t tsBegin, uint64_t tsEnd);
|
static AQDG_GRAPH_DATAPAIR_LIST *_readCurveData(AQH_DATACLIENT *dc, GWEN_XMLNODE *nCurve, uint64_t tsBegin, uint64_t tsEnd);
|
||||||
static uint64_t _parseTime(const char *s);
|
static uint64_t _parseTime(const char *s);
|
||||||
static GWEN_XMLNODE *_getSubItemNode(GWEN_XMLNODE *nPage, const char *sId, const char *sElementName);
|
static GWEN_XMLNODE *_getSubItemNode(GWEN_XMLNODE *nPage, const char *sId, const char *sElementName);
|
||||||
static void _mkPathForGraph(AQH_MODULE *m, const char *sGraphId, GWEN_BUFFER *dbuf);
|
static void _mkPathForGraph(AQCGI_MODULE *m, const char *sGraphId, GWEN_BUFFER *dbuf);
|
||||||
static void _addGraphLink(const char *sPageId, const char *sGraphId, int w, int h, GWEN_BUFFER *dbuf);
|
static void _addGraphLink(const char *sPageId, const char *sGraphId, int w, int h, GWEN_BUFFER *dbuf);
|
||||||
static void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf);
|
static void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf);
|
||||||
static void _writeOnOffToForm(const char *sValueName, int intVal, GWEN_BUFFER *dbuf);
|
static void _writeOnOffToForm(const char *sValueName, int intVal, GWEN_BUFFER *dbuf);
|
||||||
@@ -76,9 +77,9 @@ static int _getColorComponent(GWEN_DB_NODE *dbPost, const char *sValueName, cons
|
|||||||
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
|
|
||||||
static void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf);
|
static void _sendPageList(AQCGI_MODULE *m, GWEN_BUFFER *dbuf);
|
||||||
static GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m);
|
static GWEN_STRINGLIST *_listPageFiles(AQCGI_MODULE *m);
|
||||||
static GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName);
|
static GWEN_XMLNODE *_readPage(AQCGI_MODULE *m, const char *sPageName);
|
||||||
static GWEN_XMLNODE *_readPageFile(const char *sFilename);
|
static GWEN_XMLNODE *_readPageFile(const char *sFilename);
|
||||||
static int _layoutFromString(const char *s);
|
static int _layoutFromString(const char *s);
|
||||||
|
|
||||||
@@ -89,7 +90,7 @@ static int _layoutFromString(const char *s);
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sPageId;
|
const char *sPageId;
|
||||||
@@ -126,7 +127,7 @@ void AQH_ModDevices_RunPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunPageGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunPageGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sPageId;
|
const char *sPageId;
|
||||||
@@ -161,7 +162,7 @@ void AQH_ModDevices_RunPageGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunPagePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sPageId;
|
const char *sPageId;
|
||||||
@@ -246,7 +247,7 @@ void _handlePageActor(AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sActorI
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handlePageGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sGraphId, GWEN_XMLNODE *nGraph, GWEN_BUFFER *dbuf)
|
void _handlePageGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQH_DATACLIENT *dc, const char *sGraphId, GWEN_XMLNODE *nGraph, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
int refreshTime;
|
int refreshTime;
|
||||||
@@ -459,13 +460,13 @@ GWEN_XMLNODE *_getSubItemNode(GWEN_XMLNODE *nPage, const char *sId, const char *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _mkPathForGraph(AQH_MODULE *m, const char *sGraphId, GWEN_BUFFER *buf)
|
void _mkPathForGraph(AQCGI_MODULE *m, const char *sGraphId, GWEN_BUFFER *buf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
s=AQH_Service_GetCacheFolder(sv);
|
s=AQCGI_Service_GetCacheFolder(sv);
|
||||||
GBAA(buf, "%s%s%s", s, GWEN_DIR_SEPARATOR_S, sGraphId);
|
GBAA(buf, "%s%s%s", s, GWEN_DIR_SEPARATOR_S, sGraphId);
|
||||||
AQH_ModService_EscapeToBuffer(s, buf);
|
AQH_ModService_EscapeToBuffer(s, buf);
|
||||||
GBAS(buf, ".png");
|
GBAS(buf, ".png");
|
||||||
@@ -473,7 +474,7 @@ void _mkPathForGraph(AQH_MODULE *m, const char *sGraphId, GWEN_BUFFER *buf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writePage(AQH_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, GWEN_BUFFER *dbuf)
|
void _writePage(AQCGI_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
const char *sPageId;
|
const char *sPageId;
|
||||||
GWEN_XMLNODE *nItem;
|
GWEN_XMLNODE *nItem;
|
||||||
@@ -515,7 +516,7 @@ void _writePage(AQH_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, GWEN_BUF
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeItem(AQH_MODULE *m, AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *nItem, GWEN_BUFFER *dbuf)
|
void _writeItem(AQCGI_MODULE *m, AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *nItem, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_XMLNODE *n;
|
GWEN_XMLNODE *n;
|
||||||
uint32_t perms;
|
uint32_t perms;
|
||||||
@@ -819,7 +820,7 @@ void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *s
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
void _sendPageList(AQCGI_MODULE *m, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_STRINGLIST *sl;
|
GWEN_STRINGLIST *sl;
|
||||||
|
|
||||||
@@ -870,16 +871,16 @@ void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m)
|
GWEN_STRINGLIST *_listPageFiles(AQCGI_MODULE *m)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_STRINGLIST *sl;
|
GWEN_STRINGLIST *sl;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GBAA(fbuf, "%s%spages", AQH_Service_GetRuntimeFolder(sv), GWEN_DIR_SEPARATOR_S);
|
GBAA(fbuf, "%s%spages", AQCGI_Service_GetRuntimeFolder(sv), GWEN_DIR_SEPARATOR_S);
|
||||||
sl=GWEN_StringList_new();
|
sl=GWEN_StringList_new();
|
||||||
rv=GWEN_Directory_GetMatchingFilesRecursively(GWEN_Buffer_GetStart(fbuf), sl, "*.xml");
|
rv=GWEN_Directory_GetMatchingFilesRecursively(GWEN_Buffer_GetStart(fbuf), sl, "*.xml");
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
@@ -900,15 +901,15 @@ GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName)
|
GWEN_XMLNODE *_readPage(AQCGI_MODULE *m, const char *sPageName)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_XMLNODE *fileNode;
|
GWEN_XMLNODE *fileNode;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GBAA(fbuf, "%s%spages%s", AQH_Service_GetRuntimeFolder(sv), GWEN_DIR_SEPARATOR_S, GWEN_DIR_SEPARATOR_S);
|
GBAA(fbuf, "%s%spages%s", AQCGI_Service_GetRuntimeFolder(sv), GWEN_DIR_SEPARATOR_S, GWEN_DIR_SEPARATOR_S);
|
||||||
AQH_ModService_EscapeToBuffer(sPageName, fbuf);
|
AQH_ModService_EscapeToBuffer(sPageName, fbuf);
|
||||||
GBAS(fbuf, ".xml");
|
GBAS(fbuf, ".xml");
|
||||||
|
|
||||||
|
|||||||
@@ -21,9 +21,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
void AQH_ModDevices_RunPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunPagePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
void AQH_ModDevices_RunPageGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunPageGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_setdata.h"
|
#include "./mdevices_setdata.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -36,6 +37,7 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void _setIntData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
static void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
static void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
static void _setOnOffData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
|
||||||
@@ -47,9 +49,9 @@ static void _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunSetData(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
const char *sValueName;
|
const char *sValueName;
|
||||||
@@ -75,8 +77,7 @@ void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
|
|||||||
case AQH_ValueModality_RGBW: _setRgbwData(dc, value, sValue); break;
|
case AQH_ValueModality_RGBW: _setRgbwData(dc, value, sValue); break;
|
||||||
case AQH_ValueModality_OnOff: _setOnOffData(dc, value, sValue); break;
|
case AQH_ValueModality_OnOff: _setOnOffData(dc, value, sValue); break;
|
||||||
case AQH_ValueModality_OnOffAuto: _setOnOffAutoData(dc, value, sValue); break;
|
case AQH_ValueModality_OnOffAuto: _setOnOffAutoData(dc, value, sValue); break;
|
||||||
default:
|
default: _setIntData(dc, value, sValue); break;
|
||||||
break;
|
|
||||||
} /* switch */
|
} /* switch */
|
||||||
} /* if (sValueName) */
|
} /* if (sValueName) */
|
||||||
}
|
}
|
||||||
@@ -104,6 +105,29 @@ void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *se
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _setIntData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue)
|
||||||
|
{
|
||||||
|
if (sValue) {
|
||||||
|
const char *sValueSystemName;
|
||||||
|
int intVal;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
sValueSystemName=AQH_Value_GetNameForSystem(value);
|
||||||
|
if (1==sscanf(sValue, "%d", &intVal)) {
|
||||||
|
DBG_ERROR(NULL, "Send value [%d] to %s", intVal, sValueSystemName);
|
||||||
|
rv=AQH_DataClient_SetData(dc, value, (double) intVal);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_ERROR(NULL, "Error sending data: %d", rv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(NULL, "Not an integer value: [%s]", sValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue)
|
void _setRgbwData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue)
|
||||||
{
|
{
|
||||||
if (sValue) {
|
if (sValue) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunSetData(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunSetData(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_setdevice.h"
|
#include "./mdevices_setdevice.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -45,9 +46,9 @@ static void _handleDeviceForm(AQH_DATACLIENT *dc, AQH_DEVICE *device, GWEN_DB_NO
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunSetDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunSetDevice(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
AQH_DEVICE *device;
|
AQH_DEVICE *device;
|
||||||
@@ -76,17 +77,7 @@ void AQH_ModDevices_RunSetDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *
|
|||||||
DBG_ERROR(NULL, "device not found");
|
DBG_ERROR(NULL, "device not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sDeviceName && *sDeviceName) {
|
AQH_ModDevices_RedirectToDevice(rq, "device.html", device);
|
||||||
GWEN_BUFFER *pbuf;
|
|
||||||
|
|
||||||
pbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
||||||
GBAS(pbuf, "Location: device.html?device=");
|
|
||||||
GWEN_Text_EscapeToBuffer(sDeviceName, pbuf);
|
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(pbuf));
|
|
||||||
GWEN_Buffer_free(pbuf);
|
|
||||||
}
|
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
|
||||||
AQCGI_Request_SetResponseText(rq, "See other");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunSetDevice(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunSetDevice(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_value.h"
|
#include "./mdevices_value.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -36,13 +37,14 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _runValueWithArgs(AQH_MODULE *m,
|
static void _runValueWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
const char *sValueName,
|
const char *sValueName,
|
||||||
GWEN_BUFFER *dbuf);
|
GWEN_BUFFER *dbuf);
|
||||||
|
static void _writeIntToForm(const char *sValueName, int v, GWEN_BUFFER *dbuf);
|
||||||
static void _mkValueForm(AQH_DATACLIENT *dc, const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
|
static void _mkValueForm(AQH_DATACLIENT *dc, const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
|
||||||
static void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf);
|
static void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf);
|
||||||
static void _writeOnOffToForm(const char *sValueName, int intVal, GWEN_BUFFER *dbuf);
|
static void _writeOnOffToForm(const char *sValueName, int intVal, GWEN_BUFFER *dbuf);
|
||||||
@@ -55,7 +57,7 @@ static void _writeOnOffAutoToForm(const char *sValueName, int intVal, GWEN_BUFFE
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunValue(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
@@ -100,9 +102,9 @@ void AQH_ModDevices_RunValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sess
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _runValueWithArgs(AQH_MODULE *m,
|
void _runValueWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
const char *sValueName,
|
const char *sValueName,
|
||||||
@@ -198,7 +200,7 @@ void _mkValueForm(AQH_DATACLIENT *dc, const char *sDeviceName, const AQH_VALUE *
|
|||||||
case AQH_ValueModality_RGBW: _writeRgbwToForm(sValueName, u.f, dbuf); break;
|
case AQH_ValueModality_RGBW: _writeRgbwToForm(sValueName, u.f, dbuf); break;
|
||||||
case AQH_ValueModality_OnOff: _writeOnOffToForm(sValueName, intVal, dbuf); break;
|
case AQH_ValueModality_OnOff: _writeOnOffToForm(sValueName, intVal, dbuf); break;
|
||||||
case AQH_ValueModality_OnOffAuto: _writeOnOffAutoToForm(sValueName, intVal, dbuf); break;
|
case AQH_ValueModality_OnOffAuto: _writeOnOffAutoToForm(sValueName, intVal, dbuf); break;
|
||||||
default: GBAA(dbuf, "%.2f", u.f); break;
|
default: _writeIntToForm(sValueName, intVal, dbuf); break;
|
||||||
} /* switch */
|
} /* switch */
|
||||||
|
|
||||||
GBAS(dbuf,"<input type=\"submit\" name=\"action\" value=\"Send\"/>");
|
GBAS(dbuf,"<input type=\"submit\" name=\"action\" value=\"Send\"/>");
|
||||||
@@ -207,6 +209,13 @@ void _mkValueForm(AQH_DATACLIENT *dc, const char *sDeviceName, const AQH_VALUE *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _writeIntToForm(const char *sValueName, int v, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
GBAA(dbuf, "<input type=\"number\" name=\"%s\" value=\"%d\"/>", sValueName, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf)
|
void _writeRgbwToForm(const char *sValueName, uint32_t color, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunValue(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,9 +14,10 @@
|
|||||||
#include "./mdevices_valuesgraph.h"
|
#include "./mdevices_valuesgraph.h"
|
||||||
#include "./mdevices_index.h"
|
#include "./mdevices_index.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -41,6 +42,7 @@ static void _writeValueToDetailedTable(const char *sDeviceName, const AQH_VALUE
|
|||||||
static void _writeValueListToTable(const char *sDeviceName, const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf);
|
static void _writeValueListToTable(const char *sDeviceName, const AQH_VALUE_LIST *valueList, GWEN_BUFFER *dbuf);
|
||||||
static void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
|
static void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value, GWEN_BUFFER *dbuf);
|
||||||
static void _addGraphLink(const char *sDeviceName, const char *sValueName, const char *sPeriod, GWEN_BUFFER *dbuf, int withLink);
|
static void _addGraphLink(const char *sDeviceName, const char *sValueName, const char *sPeriod, GWEN_BUFFER *dbuf, int withLink);
|
||||||
|
static void _writeDeviceInfo(const AQH_DEVICE *device, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +51,7 @@ static void _addGraphLink(const char *sDeviceName, const char *sValueName, const
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunValuesAsGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
@@ -59,6 +61,10 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
|
|||||||
if (!(sDeviceName && *sDeviceName))
|
if (!(sDeviceName && *sDeviceName))
|
||||||
AQH_ModDevices_RunIndex(m, rq, session, dc, dbuf);
|
AQH_ModDevices_RunIndex(m, rq, session, dc, dbuf);
|
||||||
else {
|
else {
|
||||||
|
AQH_DEVICE *device;
|
||||||
|
|
||||||
|
device=AQH_DataClient_GetDeviceByName(dc, sDeviceName);
|
||||||
|
if (device) {
|
||||||
const char *sValueName;
|
const char *sValueName;
|
||||||
|
|
||||||
sValueName=GWEN_DB_GetCharValue(dbQuery, "value", 0, NULL);
|
sValueName=GWEN_DB_GetCharValue(dbQuery, "value", 0, NULL);
|
||||||
@@ -66,6 +72,7 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
|
|||||||
AQH_VALUE *value;
|
AQH_VALUE *value;
|
||||||
|
|
||||||
GBAA(dbuf,"<h1>Value %s/%s</h1>\n", sDeviceName, sValueName);
|
GBAA(dbuf,"<h1>Value %s/%s</h1>\n", sDeviceName, sValueName);
|
||||||
|
_writeDeviceInfo(device, dbuf);
|
||||||
value=AQH_ModDevices_GetValueForDevice(dc, sDeviceName, sValueName);
|
value=AQH_ModDevices_GetValueForDevice(dc, sDeviceName, sValueName);
|
||||||
if (value) {
|
if (value) {
|
||||||
_writeValueToDetailedTable(sDeviceName, value, dbuf);
|
_writeValueToDetailedTable(sDeviceName, value, dbuf);
|
||||||
@@ -80,6 +87,7 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
|
|||||||
if (valueList && AQH_Value_List_GetCount(valueList)) {
|
if (valueList && AQH_Value_List_GetCount(valueList)) {
|
||||||
|
|
||||||
GBAA(dbuf,"<h1>Values for Device %s</h1>\n", sDeviceName);
|
GBAA(dbuf,"<h1>Values for Device %s</h1>\n", sDeviceName);
|
||||||
|
_writeDeviceInfo(device, dbuf);
|
||||||
_writeValueListToTable(sDeviceName, valueList, dbuf);
|
_writeValueListToTable(sDeviceName, valueList, dbuf);
|
||||||
GBAS(dbuf, "\n");
|
GBAS(dbuf, "\n");
|
||||||
}
|
}
|
||||||
@@ -89,7 +97,31 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
|
|||||||
AQH_Value_List_free(valueList);
|
AQH_Value_List_free(valueList);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Refresh: 305");
|
AQCGI_Request_AddResponseHeaderData(rq, "Refresh: 305");
|
||||||
}
|
}
|
||||||
|
AQH_Device_free(device);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _writeDeviceInfo(const AQH_DEVICE *device, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
const char *s;
|
||||||
|
int cnt=0;
|
||||||
|
|
||||||
|
GBAS(dbuf, "<p>");
|
||||||
|
s=AQH_Device_GetNameForGui(device);
|
||||||
|
if (s)
|
||||||
|
GBAA(dbuf, "%s%s", (cnt++)?", ":"", s?s:"");
|
||||||
|
s=AQH_Device_GetRoomName(device);
|
||||||
|
if (s)
|
||||||
|
GBAA(dbuf, "%s%s", (cnt++)?", ":"", s?s:"");
|
||||||
|
s=AQH_Device_GetLocation(device);
|
||||||
|
if (s)
|
||||||
|
GBAA(dbuf, "%s%s", (cnt++)?", ":"", s?s:"");
|
||||||
|
s=AQH_Device_GetDescription(device);
|
||||||
|
if (s)
|
||||||
|
GBAA(dbuf, "%s%s", (cnt++)?", ":"", s?s:"");
|
||||||
|
GBAS(dbuf, "</p>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunValuesAsGraph(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,9 +14,10 @@
|
|||||||
#include "./mdevices_valuestable.h"
|
#include "./mdevices_valuestable.h"
|
||||||
#include "./mdevices_index.h"
|
#include "./mdevices_index.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
@@ -47,7 +48,7 @@ static void _writeValueToTable(const char *sDeviceName, const AQH_VALUE *value,
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunValuesAsTable(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunValuesAsTable(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunValuesAsTable(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunValuesAsTable(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
#include "./mdevices_vgraph.h"
|
#include "./mdevices_vgraph.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/mdataclient.h"
|
#include "aqhome-cgi/modules/mdataclient.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <aqdiagram/graph/timegraph.h>
|
#include <aqdiagram/graph/timegraph.h>
|
||||||
#include <aqdiagram/graph/w_graph.h>
|
#include <aqdiagram/graph/w_graph.h>
|
||||||
#include <aqdiagram/draw/context_cairo.h>
|
#include <aqdiagram/draw/context_cairo.h>
|
||||||
@@ -54,7 +55,7 @@ struct MY_GRAPH_PARAMS {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static MY_GRAPH_PARAMS _graphParams[]={
|
static MY_GRAPH_PARAMS _graphParamsAny[]={
|
||||||
{"4h", "last 4 hours", "Lm5", 4*60*60, 2*60},
|
{"4h", "last 4 hours", "Lm5", 4*60*60, 2*60},
|
||||||
{"1d", "last 24 hours", "Lm30", 24*60*60, 5*60},
|
{"1d", "last 24 hours", "Lm30", 24*60*60, 5*60},
|
||||||
{"1w", "last 7 days", "Lm240", 7*24*60*60, 15*60},
|
{"1w", "last 7 days", "Lm240", 7*24*60*60, 15*60},
|
||||||
@@ -66,12 +67,24 @@ static MY_GRAPH_PARAMS _graphParams[]={
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static MY_GRAPH_PARAMS _graphParamsBool[]={
|
||||||
|
{"4h", "last 4 hours", "Sa5", 4*60*60, 2*60},
|
||||||
|
{"1d", "last 24 hours", "Sa30", 24*60*60, 5*60},
|
||||||
|
{"1w", "last 7 days", "Sa240", 7*24*60*60, 15*60},
|
||||||
|
{"1m", "last 30 days", "Sa480", 30*24*60*60, 60*60},
|
||||||
|
{"6m", "last 6 months", "Sa720", 182*24*60*60, 60*60},
|
||||||
|
{"12m","last 12 months", "Sa1440", 365*24*60*60, 60*60},
|
||||||
|
{NULL, NULL, NULL, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
* forward declarations
|
* forward declarations
|
||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void _runGraphValueWithArgs(AQH_MODULE *m,
|
static void _runGraphValueWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
@@ -83,8 +96,8 @@ static void _createGraph(AQH_DATACLIENT *dc,
|
|||||||
const char *graphTitle, int precision, const char *curveLabel,
|
const char *graphTitle, int precision, const char *curveLabel,
|
||||||
const char *sImgFile, int imgWidth, int imgHeight, uint64_t numDataPoints);
|
const char *sImgFile, int imgWidth, int imgHeight, uint64_t numDataPoints);
|
||||||
static AQDG_GRAPH *_mkGraphObjectWithTitle(const char *graphTitle, const MY_GRAPH_PARAMS *graphParams, int precision);
|
static AQDG_GRAPH *_mkGraphObjectWithTitle(const char *graphTitle, const MY_GRAPH_PARAMS *graphParams, int precision);
|
||||||
static void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_PARAMS *graphParams, GWEN_BUFFER *dbuf);
|
static void _mkPathForValueAndPeriod(AQCGI_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_PARAMS *graphParams, GWEN_BUFFER *dbuf);
|
||||||
static const MY_GRAPH_PARAMS *_getParamsByName(const char *s);
|
static const MY_GRAPH_PARAMS *_getParamsByName(const char *s, int modality);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -93,7 +106,7 @@ static const MY_GRAPH_PARAMS *_getParamsByName(const char *s);
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDevices_RunGraphValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
void AQH_ModDevices_RunGraphValue(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbQuery;
|
GWEN_DB_NODE *dbQuery;
|
||||||
const char *sDeviceName;
|
const char *sDeviceName;
|
||||||
@@ -123,7 +136,7 @@ void AQH_ModDevices_RunGraphValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _runGraphValueWithArgs(AQH_MODULE *m,
|
void _runGraphValueWithArgs(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_DATACLIENT *dc,
|
AQH_DATACLIENT *dc,
|
||||||
const char *sDeviceName,
|
const char *sDeviceName,
|
||||||
@@ -138,9 +151,6 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
|
|||||||
DBG_DEBUG(NULL, "GraphValue with args");
|
DBG_DEBUG(NULL, "GraphValue with args");
|
||||||
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
sPeriod=GWEN_DB_GetCharValue(dbQuery, "period", 0, NULL);
|
sPeriod=GWEN_DB_GetCharValue(dbQuery, "period", 0, NULL);
|
||||||
graphParams=_getParamsByName(sPeriod);
|
|
||||||
if (graphParams==NULL)
|
|
||||||
graphParams=&_graphParams[0];
|
|
||||||
DBG_DEBUG(NULL, "Device=%s, value=%s, period=%s",
|
DBG_DEBUG(NULL, "Device=%s, value=%s, period=%s",
|
||||||
sDeviceName?sDeviceName:"<empty>", sValueName?sValueName:"<empty>",
|
sDeviceName?sDeviceName:"<empty>", sValueName?sValueName:"<empty>",
|
||||||
sPeriod?sPeriod:"<empty>");
|
sPeriod?sPeriod:"<empty>");
|
||||||
@@ -149,6 +159,7 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
|
|||||||
if (value) {
|
if (value) {
|
||||||
GWEN_BUFFER *fbuf;
|
GWEN_BUFFER *fbuf;
|
||||||
|
|
||||||
|
graphParams=_getParamsByName(sPeriod, AQH_Value_GetModality(value));
|
||||||
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
_mkPathForValueAndPeriod(m, value, graphParams, fbuf);
|
_mkPathForValueAndPeriod(m, value, graphParams, fbuf);
|
||||||
if (!AQH_ModService_FileIsCurrent(GWEN_Buffer_GetStart(fbuf), graphParams->acceptedAgeInSeconds)) {
|
if (!AQH_ModService_FileIsCurrent(GWEN_Buffer_GetStart(fbuf), graphParams->acceptedAgeInSeconds)) {
|
||||||
@@ -241,15 +252,15 @@ AQDG_GRAPH *_mkGraphObjectWithTitle(const char *graphTitle, const MY_GRAPH_PARAM
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_PARAMS *graphParams, GWEN_BUFFER *dbuf)
|
void _mkPathForValueAndPeriod(AQCGI_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_PARAMS *graphParams, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
|
|
||||||
/* cache folder */
|
/* cache folder */
|
||||||
s=AQH_Service_GetCacheFolder(sv);
|
s=AQCGI_Service_GetCacheFolder(sv);
|
||||||
GBAA(dbuf, "%s%s", s, GWEN_DIR_SEPARATOR_S);
|
GBAA(dbuf, "%s%s", s, GWEN_DIR_SEPARATOR_S);
|
||||||
|
|
||||||
/* var name */
|
/* var name */
|
||||||
@@ -261,18 +272,26 @@ void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
const MY_GRAPH_PARAMS *_getParamsByName(const char *s)
|
const MY_GRAPH_PARAMS *_getParamsByName(const char *s, int modality)
|
||||||
{
|
{
|
||||||
|
const MY_GRAPH_PARAMS *startP;
|
||||||
const MY_GRAPH_PARAMS *p;
|
const MY_GRAPH_PARAMS *p;
|
||||||
|
|
||||||
p=_graphParams;
|
switch(modality) {
|
||||||
|
case AQH_ValueModality_Door:
|
||||||
|
case AQH_ValueModality_Motion:
|
||||||
|
case AQH_ValueModality_OnOff: startP=_graphParamsBool; break;
|
||||||
|
default: startP=_graphParamsAny; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
p=startP;
|
||||||
while(p->name) {
|
while(p->name) {
|
||||||
if (strcasecmp(p->name, s)==0)
|
if (strcasecmp(p->name, s)==0)
|
||||||
return p;
|
return p;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return startP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDevices_RunGraphValue(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
void AQH_ModDevices_RunGraphValue(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,11 +13,11 @@
|
|||||||
|
|
||||||
#include "./mdataclient.h"
|
#include "./mdataclient.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
|
|
||||||
#include "aqhome/msg/ipc/m_ipc.h"
|
#include "aqhome/msg/ipc/m_ipc.h"
|
||||||
#include "aqhome/msg/ipc/data/m_ipcd.h"
|
#include "aqhome/msg/ipc/data/m_ipcd.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void AQH_ModDataClient_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder)
|
void AQH_ModDataClient_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
|
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
@@ -51,9 +51,9 @@ void AQH_ModDataClient_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDataClient_HandleRequest(AQH_MODULE *m,
|
void AQH_ModDataClient_HandleRequest(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_MODDATACLIENT_RUN_FN runFn,
|
AQH_MODDATACLIENT_RUN_FN runFn,
|
||||||
GWEN_BUFFER *dbuf)
|
GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,13 +20,13 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*AQH_MODDATACLIENT_RUN_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
typedef void (*AQH_MODDATACLIENT_RUN_FN)(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
void AQH_ModDataClient_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
|
void AQH_ModDataClient_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
void AQH_ModDataClient_HandleRequest(AQH_MODULE *m,
|
void AQH_ModDataClient_HandleRequest(AQCGI_MODULE *m,
|
||||||
AQCGI_REQUEST *rq,
|
AQCGI_REQUEST *rq,
|
||||||
AQH_SESSION *session,
|
AQCGI_SESSION *session,
|
||||||
AQH_MODDATACLIENT_RUN_FN runFn,
|
AQH_MODDATACLIENT_RUN_FN runFn,
|
||||||
GWEN_BUFFER *dbuf);
|
GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,14 @@
|
|||||||
|
|
||||||
#include "./mroot_p.h"
|
#include "./mroot_p.h"
|
||||||
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/modules/devices/mdevices.h"
|
#include "aqhome-cgi/modules/devices/mdevices.h"
|
||||||
#include "aqhome-cgi/modules/common/madmin.h"
|
#include "aqhome-cgi/modules/common/madmin.h"
|
||||||
|
|
||||||
|
#include <aqcgi/service/module.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
#include <gwenhywfar/timestamp.h>
|
#include <gwenhywfar/timestamp.h>
|
||||||
|
#include <gwenhywfar/text.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -27,6 +29,10 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define AQH_SERVICE_SESSION_MAXAGE 86400
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
* global vars
|
* global vars
|
||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
@@ -37,12 +43,13 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
|
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
|
||||||
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
|
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
|
||||||
static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
static int _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
||||||
static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
static int _handleRqLogin(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
||||||
static int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
static int _handleRqLoginGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
||||||
static AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
|
static int _handleRqLoginPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
static AQCGI_USER *_getAndCheckUser(AQCGI_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -50,11 +57,11 @@ static AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder)
|
AQCGI_MODULE *AQH_ModRoot_new(AQCGI_SERVICE *sv, const char *baseFolder)
|
||||||
{
|
{
|
||||||
AQH_MODULE *m;
|
AQCGI_MODULE *m;
|
||||||
|
|
||||||
m=AQH_Module_new();
|
m=AQCGI_Module_new();
|
||||||
AQH_ModService_Extend(m, sv, baseFolder);
|
AQH_ModService_Extend(m, sv, baseFolder);
|
||||||
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule);
|
AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule);
|
||||||
@@ -64,15 +71,15 @@ AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName)
|
AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, GWEN_UNUSED AQCGI_REQUEST *rq, GWEN_UNUSED AQCGI_SESSION *session, const char *sModuleName)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
|
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
if (strcasecmp(sModuleName, "devices")==0) {
|
if (strcasecmp(sModuleName, "devices")==0) {
|
||||||
AQH_MODULE *mSub;
|
AQCGI_MODULE *mSub;
|
||||||
|
|
||||||
mSub=AQH_Service_LoadModule(sv, sModuleName);
|
mSub=AQCGI_Service_LoadModule(sv, sModuleName);
|
||||||
if (mSub) {
|
if (mSub) {
|
||||||
const char *s;
|
const char *s;
|
||||||
GWEN_BUFFER *nbuf;
|
GWEN_BUFFER *nbuf;
|
||||||
@@ -82,15 +89,15 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
GWEN_Buffer_AppendArgs(nbuf, "%s/devices", s?s:".");
|
GWEN_Buffer_AppendArgs(nbuf, "%s/devices", s?s:".");
|
||||||
|
|
||||||
AQH_ModDevices_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
AQH_ModDevices_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
||||||
AQH_Module_Tree2_AddChild(m, mSub);
|
AQCGI_Module_Tree2_AddChild(m, mSub);
|
||||||
GWEN_Buffer_free(nbuf);
|
GWEN_Buffer_free(nbuf);
|
||||||
return mSub;
|
return mSub;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcasecmp(sModuleName, "admin")==0) {
|
else if (strcasecmp(sModuleName, "admin")==0) {
|
||||||
AQH_MODULE *mSub;
|
AQCGI_MODULE *mSub;
|
||||||
|
|
||||||
mSub=AQH_Service_LoadModule(sv, sModuleName);
|
mSub=AQCGI_Service_LoadModule(sv, sModuleName);
|
||||||
if (mSub) {
|
if (mSub) {
|
||||||
const char *s;
|
const char *s;
|
||||||
GWEN_BUFFER *nbuf;
|
GWEN_BUFFER *nbuf;
|
||||||
@@ -100,7 +107,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
GWEN_Buffer_AppendArgs(nbuf, "%s/admin", s?s:".");
|
GWEN_Buffer_AppendArgs(nbuf, "%s/admin", s?s:".");
|
||||||
|
|
||||||
AQH_ModAdmin_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
AQH_ModAdmin_Extend(mSub, AQH_ModService_GetService(m), GWEN_Buffer_GetStart(nbuf));
|
||||||
AQH_Module_Tree2_AddChild(m, mSub);
|
AQCGI_Module_Tree2_AddChild(m, mSub);
|
||||||
GWEN_Buffer_free(nbuf);
|
GWEN_Buffer_free(nbuf);
|
||||||
return mSub;
|
return mSub;
|
||||||
}
|
}
|
||||||
@@ -110,7 +117,7 @@ AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem)
|
int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_UNUSED AQCGI_SESSION *session, const char *sLastPathElem)
|
||||||
{
|
{
|
||||||
GWEN_BUFFER *dbuf;
|
GWEN_BUFFER *dbuf;
|
||||||
|
|
||||||
@@ -143,7 +150,7 @@ int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
int _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
|
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
|
||||||
return AQH_ModService_RespondWithFile(m, rq, "en", "index.html", dbuf);
|
return AQH_ModService_RespondWithFile(m, rq, "en", "index.html", dbuf);
|
||||||
@@ -157,12 +164,12 @@ int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
int _handleRqLogin(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
|
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET)
|
||||||
AQH_ModService_RespondWithFile(m, rq, "en", "login.html", dbuf);
|
_handleRqLoginGet(m, rq, dbuf);
|
||||||
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
|
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
|
||||||
_handleRqLoginPost(m, rq, dbuf);
|
_handleRqLoginPost(m, rq);
|
||||||
else {
|
else {
|
||||||
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
|
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
|
||||||
AQCGI_Request_SetResponseCode(rq, 405);
|
AQCGI_Request_SetResponseCode(rq, 405);
|
||||||
@@ -174,85 +181,127 @@ int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
int _handleRqLoginGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
GWEN_DB_NODE *dbQuery;
|
||||||
AQH_USER *user;
|
const char *sSrc;
|
||||||
AQH_SESSION *session;
|
GWEN_DB_NODE *dbVars;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
dbVars=GWEN_DB_Group_new("vars");
|
||||||
|
dbQuery=AQCGI_Request_GetDbQuery(rq);
|
||||||
|
sSrc=dbQuery?GWEN_DB_GetCharValue(dbQuery, "src", 0, NULL):NULL;
|
||||||
|
if (sSrc && *sSrc)
|
||||||
|
GWEN_DB_SetCharValue(dbVars, 0, "destination", sSrc);
|
||||||
|
|
||||||
|
rv=AQH_ModService_RespondWithVarFile(m, rq, "en", "login.html", dbVars, dbuf);
|
||||||
|
GWEN_DB_Group_free(dbVars);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleRqLoginPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
|
{
|
||||||
|
AQCGI_SERVICE *sv;
|
||||||
|
AQCGI_USER *user;
|
||||||
|
AQCGI_SESSION *session;
|
||||||
GWEN_BUFFER *tbuf;
|
GWEN_BUFFER *tbuf;
|
||||||
GWEN_TIMESTAMP *ts;
|
GWEN_TIMESTAMP *ts;
|
||||||
|
GWEN_DB_NODE *dbPost;
|
||||||
|
const char *s;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
DBG_ERROR(NULL, "Handling request");
|
DBG_ERROR(NULL, "Handling request");
|
||||||
sv=AQH_ModService_GetService(m);
|
sv=AQH_ModService_GetService(m);
|
||||||
user=_getAndCheckUser(m, rq, dbuf);
|
user=_getAndCheckUser(m, rq);
|
||||||
if (user==NULL) {
|
if (user==NULL) {
|
||||||
DBG_INFO(NULL, "here");
|
DBG_INFO(NULL, "here");
|
||||||
AQCGI_Request_SetResponseCode(rq, 500);
|
|
||||||
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
|
||||||
return GWEN_ERROR_GENERIC;
|
return GWEN_ERROR_GENERIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
ts=GWEN_Timestamp_NowInLocalTime();
|
ts=GWEN_Timestamp_NowInLocalTime();
|
||||||
AQH_User_SetTimestampLastLogin(user, ts);
|
AQCGI_User_SetTimestampLastLogin(user, ts);
|
||||||
DBG_ERROR(NULL, "Saving user");
|
rv=AQCGI_Service_SaveUser(sv, user);
|
||||||
rv=AQH_Service_SaveUser(sv, user);
|
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error saving user \"%s\"", AQH_User_GetAlias(user));
|
DBG_ERROR(NULL, "Error saving user \"%s\"", AQCGI_User_GetAlias(user));
|
||||||
AQCGI_Request_SetResponseCode(rq, 500);
|
AQCGI_Request_SetResponseCode(rq, 500);
|
||||||
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate session */
|
/* generate session */
|
||||||
DBG_ERROR(NULL, "Generating session");
|
|
||||||
tbuf=GWEN_Buffer_new(0, 64, 0, 1);
|
tbuf=GWEN_Buffer_new(0, 64, 0, 1);
|
||||||
AQCGI_GenerateSessionId(tbuf);
|
AQCGI_GenerateSessionId(tbuf);
|
||||||
session=AQH_Session_new();
|
session=AQCGI_Session_new();
|
||||||
AQH_Session_SetTimestampCreation(session, ts);
|
AQCGI_Session_SetTimestampCreation(session, ts);
|
||||||
AQH_Session_SetTimestampLastAccess(session, ts);
|
AQCGI_Session_SetTimestampLastAccess(session, ts);
|
||||||
AQH_Session_SetUid(session, GWEN_Buffer_GetStart(tbuf));
|
AQCGI_Session_SetUid(session, GWEN_Buffer_GetStart(tbuf));
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
AQH_Session_SetUserAlias(session, AQH_User_GetAlias(user));
|
AQCGI_Session_SetUserAlias(session, AQCGI_User_GetAlias(user));
|
||||||
rv=AQH_Service_AddSession(sv, session);
|
rv=AQCGI_Service_AddSession(sv, session);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "Error adding session for user \"%s\" (%d)", AQH_User_GetAlias(user), rv);
|
DBG_ERROR(NULL, "Error adding session for user \"%s\" (%d)", AQCGI_User_GetAlias(user), rv);
|
||||||
AQCGI_Request_SetResponseCode(rq, 500);
|
AQCGI_Request_SetResponseCode(rq, 500);
|
||||||
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
AQCGI_Request_SetResponseText(rq, "Internal Error");
|
||||||
AQH_Session_free(session);
|
AQCGI_Session_free(session);
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
return GWEN_ERROR_INTERNAL;
|
return GWEN_ERROR_INTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add Set-Cookie header */
|
/* add Set-Cookie header */
|
||||||
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GWEN_Buffer_AppendArgs(tbuf, "Set-Cookie: session=%s; max-age=86400", AQH_Session_GetUid(session));
|
GWEN_Buffer_AppendArgs(tbuf, "Set-Cookie: session=%s; max-age=%d", AQCGI_Session_GetUid(session), AQH_SERVICE_SESSION_MAXAGE);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf));
|
AQCGI_Request_AddResponseHeaderData(rq, GWEN_Buffer_GetStart(tbuf));
|
||||||
GWEN_Buffer_free(tbuf);
|
GWEN_Buffer_free(tbuf);
|
||||||
|
|
||||||
/* finish */
|
/* finish */
|
||||||
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
|
s=dbPost?GWEN_DB_GetCharValue(dbPost, "dest", 0, NULL):NULL;
|
||||||
|
if (s && *s) {
|
||||||
|
GWEN_BUFFER *ubuf;
|
||||||
|
|
||||||
|
ubuf=GWEN_Buffer_new(0, 128, 0, 1);
|
||||||
|
if (GWEN_Text_UnescapeToBufferTolerant(s, ubuf)>=0) {
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
p=GWEN_Buffer_GetStart(ubuf);
|
||||||
|
if (*p=='/')
|
||||||
|
AQH_ModService_Redirect(rq, p);
|
||||||
|
else {
|
||||||
|
DBG_ERROR(NULL, "Destination does not start with \"/\", not using it [%s]", p);
|
||||||
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
AQCGI_Request_SetResponseCode(rq, 303);
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
AQCGI_Request_SetResponseText(rq, "See other");
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
AQH_Session_free(session);
|
}
|
||||||
AQH_User_free(user);
|
}
|
||||||
|
GWEN_Buffer_free(ubuf);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
|
||||||
|
AQCGI_Request_SetResponseCode(rq, 303);
|
||||||
|
AQCGI_Request_SetResponseText(rq, "See other");
|
||||||
|
}
|
||||||
|
|
||||||
|
AQCGI_Session_free(session);
|
||||||
|
AQCGI_User_free(user);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
AQCGI_USER *_getAndCheckUser(AQCGI_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *dbPost;
|
GWEN_DB_NODE *dbPost;
|
||||||
|
|
||||||
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
if (dbPost) {
|
if (dbPost) {
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
const char *sUserName;
|
const char *sUserName;
|
||||||
const char *sPasswd;
|
const char *sPasswd;
|
||||||
AQH_USER *user;
|
AQCGI_USER *user;
|
||||||
const char *hashedPaswd;
|
const char *hashedPaswd;
|
||||||
GWEN_BUFFER *buf;
|
GWEN_BUFFER *buf;
|
||||||
|
|
||||||
@@ -267,7 +316,7 @@ AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DBG_ERROR(NULL, "Loading user \"%s\" (%p)", sUserName, sv);
|
DBG_ERROR(NULL, "Loading user \"%s\" (%p)", sUserName, sv);
|
||||||
user=AQH_Service_LoadUser(sv, sUserName);
|
user=AQCGI_Service_LoadUser(sv, sUserName);
|
||||||
if (user==NULL) {
|
if (user==NULL) {
|
||||||
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
|
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
AQCGI_Request_SetResponseCode(rq, 403);
|
||||||
@@ -276,20 +325,20 @@ AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
|||||||
}
|
}
|
||||||
DBG_ERROR(NULL, "Loaded user \"%s\"", sUserName);
|
DBG_ERROR(NULL, "Loaded user \"%s\"", sUserName);
|
||||||
|
|
||||||
if (AQH_User_GetState(user)!=AQH_UserState_Active) {
|
if (AQCGI_User_GetState(user)!=AQCGI_UserState_Active) {
|
||||||
DBG_ERROR(NULL, "User \"%s\" not active", sUserName);
|
DBG_ERROR(NULL, "User \"%s\" not active", sUserName);
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
AQCGI_Request_SetResponseCode(rq, 403);
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hashedPaswd=AQH_User_GetHashedPassword(user);
|
hashedPaswd=AQCGI_User_GetHashedPassword(user);
|
||||||
if (!(hashedPaswd && *hashedPaswd)) {
|
if (!(hashedPaswd && *hashedPaswd)) {
|
||||||
DBG_ERROR(NULL, "User \"%s\" has no hashed password", sUserName);
|
DBG_ERROR(NULL, "User \"%s\" has no hashed password", sUserName);
|
||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
AQCGI_Request_SetResponseCode(rq, 403);
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
@@ -301,7 +350,7 @@ AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf)
|
|||||||
AQCGI_Request_SetResponseCode(rq, 403);
|
AQCGI_Request_SetResponseCode(rq, 403);
|
||||||
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
AQCGI_Request_SetResponseText(rq, "Forbidden");
|
||||||
GWEN_Buffer_free(buf);
|
GWEN_Buffer_free(buf);
|
||||||
AQH_User_free(user);
|
AQCGI_User_free(user);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
GWEN_Buffer_free(buf);
|
GWEN_Buffer_free(buf);
|
||||||
|
|||||||
@@ -16,10 +16,8 @@
|
|||||||
#include <gwenhywfar/buffer.h>
|
#include <gwenhywfar/buffer.h>
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder);
|
AQCGI_MODULE *AQH_ModRoot_new(AQCGI_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
AQH_MODULE *AQH_ModRoot_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
|
||||||
int AQH_ModRoot_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<h3>Enter your login credentials</h3>
|
<h3>Enter your login credentials</h3>
|
||||||
|
|
||||||
<form action="login" method="post">
|
<form action="login" method="post">
|
||||||
|
<input type="hidden" name="dest" value="$(destination)">
|
||||||
<label for="userid">Username:</label>
|
<label for="userid">Username:</label>
|
||||||
<input type="text" id="userid" name="userid" placeholder="Enter your Username" required>
|
<input type="text" id="userid" name="userid" placeholder="Enter your Username" required>
|
||||||
<label for="password">Password:</label>
|
<label for="password">Password:</label>
|
||||||
@@ -20,6 +21,4 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<gwbuild>
|
|
||||||
|
|
||||||
<target type="ConvenienceLibrary" name="aqhcgi_service" >
|
|
||||||
|
|
||||||
<includes type="c" >
|
|
||||||
$(gwenhywfar_cflags)
|
|
||||||
-I$(topsrcdir)
|
|
||||||
-I$(topbuilddir)
|
|
||||||
-I$(topsrcdir)/apps
|
|
||||||
-I$(topbuilddir)/apps
|
|
||||||
-I$(builddir)
|
|
||||||
-I$(srcdir)
|
|
||||||
</includes>
|
|
||||||
|
|
||||||
<includes type="tm2" >
|
|
||||||
--include=$(builddir)
|
|
||||||
--include=$(srcdir)
|
|
||||||
</includes>
|
|
||||||
|
|
||||||
|
|
||||||
<define name="not_BUILDING_AQHOME" />
|
|
||||||
|
|
||||||
<setVar name="local/cflags">$(visibility_cflags)</setVar>
|
|
||||||
|
|
||||||
|
|
||||||
<setVar name="tm2flags-INACTIVE" >
|
|
||||||
--api=AQHOME_API
|
|
||||||
</setVar>
|
|
||||||
|
|
||||||
<setVar name="local/typefiles" >
|
|
||||||
module.t2d
|
|
||||||
moduleperms.t2d
|
|
||||||
role.t2d
|
|
||||||
user.t2d
|
|
||||||
session.t2d
|
|
||||||
permdef.t2d
|
|
||||||
</setVar>
|
|
||||||
|
|
||||||
<setVar name="local/built_sources" >
|
|
||||||
</setVar>
|
|
||||||
|
|
||||||
<setVar name="local/built_headers_pub">
|
|
||||||
</setVar>
|
|
||||||
|
|
||||||
|
|
||||||
<setVar name="local/built_headers_priv" >
|
|
||||||
</setVar>
|
|
||||||
|
|
||||||
|
|
||||||
<headers dist="false" install="$(pkgincludedir)/service" >
|
|
||||||
$(local/built_headers_pub)
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
|
|
||||||
<headers dist="true" install="$(pkgincludedir)/service" >
|
|
||||||
service.h
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
|
|
||||||
<headers dist="true" >
|
|
||||||
service_p.h
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
|
|
||||||
<sources>
|
|
||||||
$(local/typefiles)
|
|
||||||
|
|
||||||
service.c
|
|
||||||
</sources>
|
|
||||||
|
|
||||||
|
|
||||||
<extradist>
|
|
||||||
</extradist>
|
|
||||||
|
|
||||||
|
|
||||||
<useTargets>
|
|
||||||
</useTargets>
|
|
||||||
|
|
||||||
<subdirs>
|
|
||||||
</subdirs>
|
|
||||||
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</gwbuild>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
- service:
|
|
||||||
- userList
|
|
||||||
- rootModule
|
|
||||||
- sessionList
|
|
||||||
|
|
||||||
- user:
|
|
||||||
- modulePerms
|
|
||||||
|
|
||||||
- module:
|
|
||||||
- roleList
|
|
||||||
- permDefList
|
|
||||||
|
|
||||||
- session
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_MODULE" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_MODULE</identifier>
|
|
||||||
<prefix>AQH_Module</prefix>
|
|
||||||
<baseFileName>module</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_inherit
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
with_list2
|
|
||||||
with_tree2
|
|
||||||
nodup
|
|
||||||
nocopy
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/error.h</header>
|
|
||||||
<header type="sys" loc="post">aqhome-cgi/service/role.h</header>
|
|
||||||
<header type="sys" loc="post">aqhome-cgi/service/permdef.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
<defines>
|
|
||||||
<define id="AQH_MODULE_FLAGS" prefix="AQH_MODULE_FLAGS_">
|
|
||||||
<item name="ACTIVE" value="0x00000001" />
|
|
||||||
</define>
|
|
||||||
|
|
||||||
</defines>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="id" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="flags" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_flags</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="name" type="char_ptr" maxlen="16">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="descr" type="char_ptr" maxlen="256">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="guestPerms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="roleList" type="AQH_ROLE_LIST" elementName="role" >
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
<getflags>none</getflags>
|
|
||||||
<setflags>none</setflags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="permDefList" type="AQH_PERMDEF_LIST" elementName="permdef" >
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
<getflags>none</getflags>
|
|
||||||
<setflags>none</setflags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_MODULE_PERMS" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_MODULE_PERMS</identifier>
|
|
||||||
<prefix>AQH_ModulePerms</prefix>
|
|
||||||
<baseFileName>moduleperms</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_inherit
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
with_list2
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/error.h</header>
|
|
||||||
<header type="sys" loc="post">aqhome-cgi/service/role.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="moduleId" type="char_ptr" maxlen="256">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="explAddPerms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="explDelPerms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="roleArray" type="uint8_t_array" maxlen="16">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_PERMDEF" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_PERMDEF</identifier>
|
|
||||||
<prefix>AQH_PermDef</prefix>
|
|
||||||
<baseFileName>permdef</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
nodup
|
|
||||||
nocopy
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="id" type="char_ptr" maxlen="32">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="name" type="char_ptr" maxlen="32">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="mask" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="descr" type="char_ptr" maxlen="256">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_ROLE" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_ROLE</identifier>
|
|
||||||
<prefix>AQH_Role</prefix>
|
|
||||||
<baseFileName>role</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
with_list2
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/error.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="id" type="uint8_t" maxlen="1">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_getbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="name" type="char_ptr" maxlen="16">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="descr" type="char_ptr" maxlen="256">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="perms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="explAddPerms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="explDelPerms" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -1,414 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* 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 <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define DISABLE_DEBUGLOG
|
|
||||||
|
|
||||||
|
|
||||||
#include "aqhome-cgi/service/service_p.h"
|
|
||||||
|
|
||||||
#include <gwenhywfar/stringlist.h>
|
|
||||||
#include <gwenhywfar/text.h>
|
|
||||||
#include <gwenhywfar/debug.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_INHERIT_FUNCTIONS(AQH_SERVICE);
|
|
||||||
GWEN_LIST_FUNCTIONS(AQH_SERVICE, AQH_Service);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SERVICE *AQH_Service_new(const char *baseFolder, const char *baseUrl)
|
|
||||||
{
|
|
||||||
AQH_SERVICE *sv;
|
|
||||||
|
|
||||||
GWEN_NEW_OBJECT(AQH_SERVICE, sv);
|
|
||||||
GWEN_INHERIT_INIT(AQH_SERVICE, sv);
|
|
||||||
GWEN_LIST_INIT(AQH_SERVICE, sv);
|
|
||||||
|
|
||||||
sv->baseUrl=baseUrl?strdup(baseUrl):NULL;
|
|
||||||
sv->baseFolder=baseFolder?strdup(baseFolder):NULL;
|
|
||||||
|
|
||||||
if (sv->baseFolder) {
|
|
||||||
GWEN_BUFFER *dbuf;
|
|
||||||
uint32_t pos;
|
|
||||||
|
|
||||||
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
|
||||||
GWEN_Buffer_AppendArgs(dbuf, "%s%s", sv->baseFolder, GWEN_DIR_SEPARATOR_S);
|
|
||||||
pos=GWEN_Buffer_GetPos(dbuf);
|
|
||||||
|
|
||||||
/* data folder */
|
|
||||||
GWEN_Buffer_AppendString(dbuf, "data");
|
|
||||||
sv->runtimeFolder=strdup(GWEN_Buffer_GetStart(dbuf));
|
|
||||||
DBG_ERROR(NULL, "Runtime folder: %s", GWEN_Buffer_GetStart(dbuf));
|
|
||||||
GWEN_Buffer_Crop(dbuf, 0, pos);
|
|
||||||
|
|
||||||
/* cache folder */
|
|
||||||
GWEN_Buffer_AppendString(dbuf, "cache");
|
|
||||||
sv->cacheFolder=strdup(GWEN_Buffer_GetStart(dbuf));
|
|
||||||
DBG_ERROR(NULL, "Cache folder: %s", GWEN_Buffer_GetStart(dbuf));
|
|
||||||
GWEN_Buffer_Crop(dbuf, 0, pos);
|
|
||||||
|
|
||||||
GWEN_Buffer_free(dbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_free(AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
if (sv) {
|
|
||||||
GWEN_LIST_FINI(AQH_SERVICE, sv);
|
|
||||||
GWEN_INHERIT_FINI(AQH_SERVICE, sv);
|
|
||||||
|
|
||||||
free(sv->baseUrl);
|
|
||||||
free(sv->baseFolder);
|
|
||||||
free(sv->runtimeFolder);
|
|
||||||
free(sv->cacheFolder);
|
|
||||||
GWEN_FREE_OBJECT(sv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char *AQH_Service_GetBaseUrl(const AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return sv?sv->baseUrl:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char *AQH_Service_GetBaseFolder(const AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return sv?sv->baseFolder:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char *AQH_Service_GetRuntimeFolder(const AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return sv?sv->runtimeFolder:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char *AQH_Service_GetCacheFolder(const AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return sv?sv->cacheFolder:NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
AQH_MODULE *AQH_Service_GetModuleByPath(const AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
if (sv && s && *s) {
|
|
||||||
GWEN_STRINGLIST *sl;
|
|
||||||
|
|
||||||
sl=GWEN_StringList_fromString2(s, "/", 0,
|
|
||||||
GWEN_TEXT_FLAGS_DEL_QUOTES |
|
|
||||||
GWEN_TEXT_FLAGS_DEL_LEADING_BLANKS |
|
|
||||||
GWEN_TEXT_FLAGS_DEL_MULTIPLE_BLANKS |
|
|
||||||
GWEN_TEXT_FLAGS_DEL_TRAILING_BLANKS);
|
|
||||||
if (sl) {
|
|
||||||
GWEN_STRINGLISTENTRY *se;
|
|
||||||
AQH_MODULE *m;
|
|
||||||
|
|
||||||
m=sv->rootModule;
|
|
||||||
se=GWEN_StringList_FirstEntry(sl);
|
|
||||||
while(se && m) {
|
|
||||||
const char *sWantedName;
|
|
||||||
|
|
||||||
sWantedName=GWEN_StringListEntry_Data(se);
|
|
||||||
if (sWantedName && *sWantedName) {
|
|
||||||
AQH_MODULE *mTemp;
|
|
||||||
|
|
||||||
mTemp=AQH_Module_Tree2_GetFirstChild(m);
|
|
||||||
while(mTemp) {
|
|
||||||
const char *sModName;
|
|
||||||
|
|
||||||
sModName=AQH_Module_GetName(mTemp);
|
|
||||||
if (sModName && *sModName && 0==strcasecmp(sModName, sWantedName))
|
|
||||||
break;
|
|
||||||
mTemp=AQH_Module_Tree2_GetNext(mTemp);
|
|
||||||
}
|
|
||||||
if (mTemp==NULL) {
|
|
||||||
DBG_ERROR(NULL, "Module \%s\" not found", sWantedName);
|
|
||||||
GWEN_StringList_free(sl);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
m=mTemp;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DBG_ERROR(NULL, "Empty path element in \"%s\"", s);
|
|
||||||
GWEN_StringList_free(sl);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
se=GWEN_StringListEntry_Next(se);
|
|
||||||
} /* while(se && m) */
|
|
||||||
GWEN_StringList_free(sl);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DBG_ERROR(NULL, "Bad path \"%s\"", s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_HandleRequest(AQH_SERVICE *sv, AQCGI_REQUEST *req)
|
|
||||||
{
|
|
||||||
return (sv && sv->handleRequestFn)?(sv->handleRequestFn(sv, req)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_USER *AQH_Service_LoadUser(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->loadUserFn)?(sv->loadUserFn(sv, s)):NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_SaveUser(AQH_SERVICE *sv, AQH_USER *user)
|
|
||||||
{
|
|
||||||
return (sv && sv->saveUserFn)?(sv->saveUserFn(sv, user)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_AddUser(AQH_SERVICE *sv, AQH_USER *user)
|
|
||||||
{
|
|
||||||
return (sv && sv->addUserFn)?(sv->addUserFn(sv, user)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_DelUser(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->delUserFn)?(sv->delUserFn(sv, s)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *AQH_Service_ListUsers(AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return (sv && sv->listUsersFn)?(sv->listUsersFn(sv)):NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *AQH_Service_LoadModule(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->loadModuleFn)?(sv->loadModuleFn(sv, s)):NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_SaveModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
|
||||||
{
|
|
||||||
return (sv && sv->saveModuleFn)?(sv->saveModuleFn(sv, module)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_AddModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
|
||||||
{
|
|
||||||
return (sv && sv->addModuleFn)?(sv->addModuleFn(sv, module)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_DelModule(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->delModuleFn)?(sv->delModuleFn(sv, s)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *AQH_Service_ListModules(AQH_SERVICE *sv)
|
|
||||||
{
|
|
||||||
return (sv && sv->listModulesFn)?(sv->listModulesFn(sv)):NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SESSION* AQH_Service_LoadSession(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->loadSessionFn)?(sv->loadSessionFn(sv, s)):NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_SaveSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
|
||||||
{
|
|
||||||
return (sv && sv->saveSessionFn)?(sv->saveSessionFn(sv, session)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_AddSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
|
||||||
{
|
|
||||||
return (sv && sv->addSessionFn)?(sv->addSessionFn(sv, session)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_Service_DelSession(AQH_SERVICE *sv, const char *s)
|
|
||||||
{
|
|
||||||
return (sv && sv->delSessionFn)?(sv->delSessionFn(sv, s)):GWEN_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetHandleRequestFn(AQH_SERVICE *sv, AQH_SERVICE_HANDLEREQUEST_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->handleRequestFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadUserFn(AQH_SERVICE *sv, AQH_SERVICE_LOADUSER_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->loadUserFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetSaveUserFn(AQH_SERVICE *sv, AQH_SERVICE_SAVEUSER_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->saveUserFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetAddUserFn(AQH_SERVICE *sv, AQH_SERVICE_ADDUSER_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->addUserFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetDelUserFn(AQH_SERVICE *sv, AQH_SERVICE_DELUSER_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->delUserFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetListUsersFn(AQH_SERVICE *sv, AQH_SERVICE_LISTUSERS_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->listUsersFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadModuleFn(AQH_SERVICE *sv, AQH_SERVICE_LOADMODULE_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->loadModuleFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetSaveModuleFn(AQH_SERVICE *sv, AQH_SERVICE_SAVEMODULE_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->saveModuleFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetAddModuleFn(AQH_SERVICE *sv, AQH_SERVICE_ADDMODULE_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->addModuleFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetDelModuleFn(AQH_SERVICE *sv, AQH_SERVICE_DELMODULE_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->delModuleFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetListModulesFn(AQH_SERVICE *sv, AQH_SERVICE_LISTMODULES_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->listModulesFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadSessionFn(AQH_SERVICE *sv, AQH_SERVICE_LOADSESSION_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->loadSessionFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetSaveSessionFn(AQH_SERVICE *sv, AQH_SERVICE_SAVESESSION_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->saveSessionFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetAddSessionFn(AQH_SERVICE *sv, AQH_SERVICE_ADDSESSION_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->addSessionFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetDelSessionFn(AQH_SERVICE *sv, AQH_SERVICE_DELSESSION_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->delSessionFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetListSessionsFn(AQH_SERVICE *sv, AQH_SERVICE_LISTSESSIONS_FN f)
|
|
||||||
{
|
|
||||||
if (sv)
|
|
||||||
sv->listSessionsFn=f;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* 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_SERVICE_H
|
|
||||||
#define AQHOME_SERVICE_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <aqhome/api.h>
|
|
||||||
|
|
||||||
#include <gwenhywfar/inherit.h>
|
|
||||||
#include <gwenhywfar/list.h>
|
|
||||||
#include <gwenhywfar/stringlist.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct AQH_SERVICE AQH_SERVICE;
|
|
||||||
GWEN_INHERIT_FUNCTION_DEFS(AQH_SERVICE);
|
|
||||||
GWEN_LIST_FUNCTION_DEFS(AQH_SERVICE, AQH_Service);
|
|
||||||
|
|
||||||
|
|
||||||
#include "aqhome-cgi/service/user.h"
|
|
||||||
#include "aqhome-cgi/service/module.h"
|
|
||||||
#include "aqhome-cgi/service/session.h"
|
|
||||||
|
|
||||||
#include <aqcgi/cgi.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*AQH_SERVICE_HANDLEREQUEST_FN)(AQH_SERVICE *sv, AQCGI_REQUEST *req);
|
|
||||||
|
|
||||||
typedef AQH_USER* (*AQH_SERVICE_LOADUSER_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef int (*AQH_SERVICE_SAVEUSER_FN)(AQH_SERVICE *sv, AQH_USER *user);
|
|
||||||
typedef int (*AQH_SERVICE_ADDUSER_FN)(AQH_SERVICE *sv, AQH_USER *user);
|
|
||||||
typedef int (*AQH_SERVICE_DELUSER_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef GWEN_STRINGLIST* (*AQH_SERVICE_LISTUSERS_FN)(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
typedef AQH_MODULE* (*AQH_SERVICE_LOADMODULE_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef int (*AQH_SERVICE_SAVEMODULE_FN)(AQH_SERVICE *sv, AQH_MODULE *module);
|
|
||||||
typedef int (*AQH_SERVICE_ADDMODULE_FN)(AQH_SERVICE *sv, AQH_MODULE *module);
|
|
||||||
typedef int (*AQH_SERVICE_DELMODULE_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef GWEN_STRINGLIST* (*AQH_SERVICE_LISTMODULES_FN)(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
|
|
||||||
typedef AQH_SESSION* (*AQH_SERVICE_LOADSESSION_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef int (*AQH_SERVICE_SAVESESSION_FN)(AQH_SERVICE *sv, AQH_SESSION *session);
|
|
||||||
typedef int (*AQH_SERVICE_ADDSESSION_FN)(AQH_SERVICE *sv, AQH_SESSION *session);
|
|
||||||
typedef int (*AQH_SERVICE_DELSESSION_FN)(AQH_SERVICE *sv, const char *s);
|
|
||||||
typedef GWEN_STRINGLIST* (*AQH_SERVICE_LISTSESSIONS_FN)(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SERVICE *AQH_Service_new(const char *baseFolder, const char *baseUrl);
|
|
||||||
void AQH_Service_free(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
const char *AQH_Service_GetBaseUrl(const AQH_SERVICE *sv);
|
|
||||||
const char *AQH_Service_GetBaseFolder(const AQH_SERVICE *sv);
|
|
||||||
const char *AQH_Service_GetRuntimeFolder(const AQH_SERVICE *sv);
|
|
||||||
const char *AQH_Service_GetCacheFolder(const AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
int AQH_Service_HandleRequest(AQH_SERVICE *sv, AQCGI_REQUEST *req);
|
|
||||||
|
|
||||||
AQH_USER *AQH_Service_LoadUser(AQH_SERVICE *sv, const char *s);
|
|
||||||
int AQH_Service_SaveUser(AQH_SERVICE *sv, AQH_USER *user);
|
|
||||||
int AQH_Service_AddUser(AQH_SERVICE *sv, AQH_USER *user);
|
|
||||||
int AQH_Service_DelUser(AQH_SERVICE *sv, const char *s);
|
|
||||||
GWEN_STRINGLIST *AQH_Service_ListUsers(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
AQH_MODULE *AQH_Service_LoadModule(AQH_SERVICE *sv, const char *s);
|
|
||||||
int AQH_Service_SaveModule(AQH_SERVICE *sv, AQH_MODULE *module);
|
|
||||||
int AQH_Service_AddModule(AQH_SERVICE *sv, AQH_MODULE *module);
|
|
||||||
int AQH_Service_DelModule(AQH_SERVICE *sv, const char *s);
|
|
||||||
GWEN_STRINGLIST *AQH_Service_ListModules(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
AQH_SESSION* AQH_Service_LoadSession(AQH_SERVICE *sv, const char *s);
|
|
||||||
int AQH_Service_SaveSession(AQH_SERVICE *sv, AQH_SESSION *session);
|
|
||||||
int AQH_Service_AddSession(AQH_SERVICE *sv, AQH_SESSION *session);
|
|
||||||
int AQH_Service_DelSession(AQH_SERVICE *sv, const char *s);
|
|
||||||
GWEN_STRINGLIST *AQH_Service_ListSessions(AQH_SERVICE *sv);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_Service_SetHandleRequestFn(AQH_SERVICE *sv, AQH_SERVICE_HANDLEREQUEST_FN f);
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadUserFn(AQH_SERVICE *sv, AQH_SERVICE_LOADUSER_FN f);
|
|
||||||
void AQH_Service_SetSaveUserFn(AQH_SERVICE *sv, AQH_SERVICE_SAVEUSER_FN f);
|
|
||||||
void AQH_Service_SetAddUserFn(AQH_SERVICE *sv, AQH_SERVICE_ADDUSER_FN f);
|
|
||||||
void AQH_Service_SetDelUserFn(AQH_SERVICE *sv, AQH_SERVICE_DELUSER_FN f);
|
|
||||||
void AQH_Service_SetListUsersFn(AQH_SERVICE *sv, AQH_SERVICE_LISTUSERS_FN f);
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadModuleFn(AQH_SERVICE *sv, AQH_SERVICE_LOADMODULE_FN f);
|
|
||||||
void AQH_Service_SetSaveModuleFn(AQH_SERVICE *sv, AQH_SERVICE_SAVEMODULE_FN f);
|
|
||||||
void AQH_Service_SetAddModuleFn(AQH_SERVICE *sv, AQH_SERVICE_ADDMODULE_FN f);
|
|
||||||
void AQH_Service_SetDelModuleFn(AQH_SERVICE *sv, AQH_SERVICE_DELMODULE_FN f);
|
|
||||||
void AQH_Service_SetListModulesFn(AQH_SERVICE *sv, AQH_SERVICE_LISTMODULES_FN f);
|
|
||||||
|
|
||||||
void AQH_Service_SetLoadSessionFn(AQH_SERVICE *sv, AQH_SERVICE_LOADSESSION_FN f);
|
|
||||||
void AQH_Service_SetSaveSessionFn(AQH_SERVICE *sv, AQH_SERVICE_SAVESESSION_FN f);
|
|
||||||
void AQH_Service_SetAddSessionFn(AQH_SERVICE *sv, AQH_SERVICE_ADDSESSION_FN f);
|
|
||||||
void AQH_Service_SetDelSessionFn(AQH_SERVICE *sv, AQH_SERVICE_DELSESSION_FN f);
|
|
||||||
void AQH_Service_SetListSessionsFn(AQH_SERVICE *sv, AQH_SERVICE_LISTSESSIONS_FN f);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* This file is part of the project AqHome.
|
|
||||||
* AqHome (c) by 2023 Martin Preuss, all rights reserved.
|
|
||||||
*
|
|
||||||
* The license for this file can be found in the file COPYING which you
|
|
||||||
* should have received along with this file.
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef AQHOME_SERVICE_P_H
|
|
||||||
#define AQHOME_SERVICE_P_H
|
|
||||||
|
|
||||||
|
|
||||||
#include "aqhome-cgi/service/service.h"
|
|
||||||
|
|
||||||
|
|
||||||
struct AQH_SERVICE {
|
|
||||||
GWEN_INHERIT_ELEMENT(AQH_SERVICE);
|
|
||||||
GWEN_LIST_ELEMENT(AQH_SERVICE);
|
|
||||||
|
|
||||||
char *baseUrl;
|
|
||||||
char *baseFolder;
|
|
||||||
char *runtimeFolder;
|
|
||||||
char *cacheFolder;
|
|
||||||
|
|
||||||
AQH_SERVICE_HANDLEREQUEST_FN handleRequestFn;
|
|
||||||
|
|
||||||
AQH_SERVICE_LOADUSER_FN loadUserFn;
|
|
||||||
AQH_SERVICE_SAVEUSER_FN saveUserFn;
|
|
||||||
AQH_SERVICE_ADDUSER_FN addUserFn;
|
|
||||||
AQH_SERVICE_DELUSER_FN delUserFn;
|
|
||||||
AQH_SERVICE_LISTUSERS_FN listUsersFn;
|
|
||||||
|
|
||||||
AQH_SERVICE_LOADMODULE_FN loadModuleFn;
|
|
||||||
AQH_SERVICE_SAVEMODULE_FN saveModuleFn;
|
|
||||||
AQH_SERVICE_ADDMODULE_FN addModuleFn;
|
|
||||||
AQH_SERVICE_DELMODULE_FN delModuleFn;
|
|
||||||
AQH_SERVICE_LISTMODULES_FN listModulesFn;
|
|
||||||
|
|
||||||
AQH_SERVICE_LOADSESSION_FN loadSessionFn;
|
|
||||||
AQH_SERVICE_SAVESESSION_FN saveSessionFn;
|
|
||||||
AQH_SERVICE_ADDSESSION_FN addSessionFn;
|
|
||||||
AQH_SERVICE_DELSESSION_FN delSessionFn;
|
|
||||||
AQH_SERVICE_LISTSESSIONS_FN listSessionsFn;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_SESSION" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_SESSION</identifier>
|
|
||||||
<prefix>AQH_Session</prefix>
|
|
||||||
<baseFileName>session</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
with_list2
|
|
||||||
nodup
|
|
||||||
nocopy
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/error.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/timestamp.h</header>
|
|
||||||
<header type="sys" loc="post">aqhome-cgi/service/user.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<defines>
|
|
||||||
<define id="AQH_SESSION_RTFLAGS" prefix="AQH_SESSION_RTFLAGS_">
|
|
||||||
<item name="MODIFIED" value="0x00000001" />
|
|
||||||
</define>
|
|
||||||
</defines>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="uid" type="char_ptr" maxlen="64">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="flags" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_flags</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="userAlias" type="char_ptr" maxlen="64">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="state" type="int" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags></flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="tempToken" type="char_ptr" maxlen="64">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="timestampCreation" type="gwen_timestamp" maxlen="8">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="timestampLastAccess" type="gwen_timestamp" maxlen="8">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
|
|
||||||
<member name="user" type="AQH_USER">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<setflags>assign</setflags>
|
|
||||||
<getflags>none</getflags>
|
|
||||||
<flags>volatile nodup nocopy</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<member name="runtimeFlags" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_flags volatile</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
<?xml?>
|
|
||||||
|
|
||||||
<tm2>
|
|
||||||
<type id="AQH_USER" type="pointer">
|
|
||||||
<descr>
|
|
||||||
</descr>
|
|
||||||
<lang id="c">
|
|
||||||
<identifier>AQH_USER</identifier>
|
|
||||||
<prefix>AQH_User</prefix>
|
|
||||||
<baseFileName>user</baseFileName>
|
|
||||||
|
|
||||||
<flags>
|
|
||||||
with_xml
|
|
||||||
with_db
|
|
||||||
with_list1
|
|
||||||
with_list2
|
|
||||||
with_refcount
|
|
||||||
nodup
|
|
||||||
nocopy
|
|
||||||
</flags>
|
|
||||||
|
|
||||||
<headers>
|
|
||||||
<header type="sys" loc="pre">aqhome/api.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/error.h</header>
|
|
||||||
<header type="sys" loc="pre">gwenhywfar/timestamp.h</header>
|
|
||||||
<header type="sys" loc="post">aqhome-cgi/service/moduleperms.h</header>
|
|
||||||
</headers>
|
|
||||||
|
|
||||||
<inlines>
|
|
||||||
</inlines>
|
|
||||||
|
|
||||||
</lang>
|
|
||||||
|
|
||||||
<defines>
|
|
||||||
<define id="AQH_USER_FLAGS" prefix="AQH_USER_FLAGS_">
|
|
||||||
<item name="ADMIN" value="0x00000001" />
|
|
||||||
</define>
|
|
||||||
|
|
||||||
<define id="AQH_USER_RTFLAGS" prefix="AQH_USER_RTFLAGS_">
|
|
||||||
<item name="MODIFIED" value="0x00000001" />
|
|
||||||
<item name="PERMSCALC" value="0x00000002" />
|
|
||||||
</define>
|
|
||||||
|
|
||||||
</defines>
|
|
||||||
|
|
||||||
<enums>
|
|
||||||
|
|
||||||
<enum id="AQH_USER_STATE" prefix="AQH_UserState_">
|
|
||||||
<item name="suspended">
|
|
||||||
<descr>User suspended</descr>
|
|
||||||
</item>
|
|
||||||
|
|
||||||
<item name="waitForConfirmation">
|
|
||||||
<descr>Waiting for email confirmation</descr>
|
|
||||||
</item>
|
|
||||||
|
|
||||||
<item name="waitForApproval">
|
|
||||||
<descr>Waiting for approval by admin</descr>
|
|
||||||
</item>
|
|
||||||
|
|
||||||
<item name="active">
|
|
||||||
<descr>User active</descr>
|
|
||||||
</item>
|
|
||||||
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
</enums>
|
|
||||||
|
|
||||||
|
|
||||||
<members>
|
|
||||||
|
|
||||||
<member name="id" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="flags" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>with_flags</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="state" type="int" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="name" type="char_ptr" maxlen="16">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="alias" type="char_ptr" maxlen="16">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="hashedPassword" type="char_ptr" maxlen="128">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="email" type="char_ptr" maxlen="128">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own with_getbymember sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="notes" type="char_ptr" maxlen="256">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="timestampCreation" type="gwen_timestamp" maxlen="8">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="timestampLastLogin" type="gwen_timestamp" maxlen="8">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>own sortbymember</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
<member name="modulePermList" type="AQH_MODULE_PERMS_LIST">
|
|
||||||
<default>NULL</default>
|
|
||||||
<preset>NULL</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<getflags>none</getflags>
|
|
||||||
<setflags>none</setflags>
|
|
||||||
<flags>own</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
|
|
||||||
<member name="runtimeFlags" type="uint32_t" maxlen="4">
|
|
||||||
<default>0</default>
|
|
||||||
<preset>0</preset>
|
|
||||||
<access>public</access>
|
|
||||||
<flags>volatile with_flags</flags>
|
|
||||||
</member>
|
|
||||||
|
|
||||||
</members>
|
|
||||||
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</tm2>
|
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GWEN_INHERIT(AQH_SERVICE, AQH_SERVICE_FILE)
|
GWEN_INHERIT(AQCGI_SERVICE, AQH_SERVICE_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -46,29 +46,29 @@ GWEN_INHERIT(AQH_SERVICE, AQH_SERVICE_FILE)
|
|||||||
|
|
||||||
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
|
|
||||||
static AQH_USER *_loadUser(AQH_SERVICE *sv, const char *s);
|
static AQCGI_USER *_loadUser(AQCGI_SERVICE *sv, const char *s);
|
||||||
static int _saveUser(AQH_SERVICE *sv, AQH_USER *user);
|
static int _saveUser(AQCGI_SERVICE *sv, AQCGI_USER *user);
|
||||||
static int _addUser(AQH_SERVICE *sv, AQH_USER *user);
|
static int _addUser(AQCGI_SERVICE *sv, AQCGI_USER *user);
|
||||||
static int _delUser(AQH_SERVICE *sv, const char *s);
|
static int _delUser(AQCGI_SERVICE *sv, const char *s);
|
||||||
static GWEN_STRINGLIST *_listUsers(AQH_SERVICE *sv);
|
static GWEN_STRINGLIST *_listUsers(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
static AQH_MODULE *_loadModule(AQH_SERVICE *sv, const char *s);
|
static AQCGI_MODULE *_loadModule(AQCGI_SERVICE *sv, const char *s);
|
||||||
static int _saveModule(AQH_SERVICE *sv, AQH_MODULE *module);
|
static int _saveModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module);
|
||||||
static int _addModule(AQH_SERVICE *sv, AQH_MODULE *module);
|
static int _addModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module);
|
||||||
static int _delModule(AQH_SERVICE *sv, const char *s);
|
static int _delModule(AQCGI_SERVICE *sv, const char *s);
|
||||||
static GWEN_STRINGLIST *_listModules(AQH_SERVICE *sv);
|
static GWEN_STRINGLIST *_listModules(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
static AQH_SESSION* _loadSession(AQH_SERVICE *sv, const char *s);
|
static AQCGI_SESSION* _loadSession(AQCGI_SERVICE *sv, const char *s);
|
||||||
static int _saveSession(AQH_SERVICE *sv, AQH_SESSION *session);
|
static int _saveSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session);
|
||||||
static int _addSession(AQH_SERVICE *sv, AQH_SESSION *session);
|
static int _addSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session);
|
||||||
static int _delSession(AQH_SERVICE *sv, const char *s);
|
static int _delSession(AQCGI_SERVICE *sv, const char *s);
|
||||||
static GWEN_STRINGLIST *_listSessions(AQH_SERVICE *sv);
|
static GWEN_STRINGLIST *_listSessions(AQCGI_SERVICE *sv);
|
||||||
|
|
||||||
static GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName);
|
static GWEN_DB_NODE *_loadGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName);
|
||||||
static int _saveGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
static int _saveGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
||||||
static int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
static int _addGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
||||||
static int _deleteGroup(AQH_SERVICE *sv, const char *groupName, const char *subGroupName);
|
static int _deleteGroup(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName);
|
||||||
static GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName);
|
static GWEN_STRINGLIST *_listGroup(AQCGI_SERVICE *sv, const char *groupName);
|
||||||
|
|
||||||
//static void _logGroup(const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
//static void _logGroup(const char *groupName, const char *subGroupName, GWEN_DB_NODE *db);
|
||||||
|
|
||||||
@@ -79,42 +79,42 @@ static GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName);
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
AQH_SERVICE *AQH_ServiceFiles_new(const char *baseFolder, const char *baseUrl)
|
AQCGI_SERVICE *AQH_ServiceFiles_new(const char *baseFolder, const char *baseUrl)
|
||||||
{
|
{
|
||||||
AQH_SERVICE *sv;
|
AQCGI_SERVICE *sv;
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
GWEN_BUFFER *dbuf;
|
GWEN_BUFFER *dbuf;
|
||||||
|
|
||||||
sv=AQH_Service_new(baseFolder, baseUrl);
|
sv=AQCGI_Service_new(baseFolder, baseUrl);
|
||||||
GWEN_NEW_OBJECT(AQH_SERVICE_FILE, xs);
|
GWEN_NEW_OBJECT(AQH_SERVICE_FILE, xs);
|
||||||
GWEN_INHERIT_SETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv, xs, _freeData);
|
GWEN_INHERIT_SETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv, xs, _freeData);
|
||||||
|
|
||||||
AQH_Service_SetLoadUserFn(sv, _loadUser);
|
AQCGI_Service_SetLoadUserFn(sv, _loadUser);
|
||||||
AQH_Service_SetSaveUserFn(sv, _saveUser);
|
AQCGI_Service_SetSaveUserFn(sv, _saveUser);
|
||||||
AQH_Service_SetAddUserFn(sv, _addUser);
|
AQCGI_Service_SetAddUserFn(sv, _addUser);
|
||||||
AQH_Service_SetDelUserFn(sv, _delUser);
|
AQCGI_Service_SetDelUserFn(sv, _delUser);
|
||||||
AQH_Service_SetListUsersFn(sv, _listUsers);
|
AQCGI_Service_SetListUsersFn(sv, _listUsers);
|
||||||
|
|
||||||
AQH_Service_SetLoadModuleFn(sv, _loadModule);
|
AQCGI_Service_SetLoadModuleFn(sv, _loadModule);
|
||||||
AQH_Service_SetSaveModuleFn(sv, _saveModule);
|
AQCGI_Service_SetSaveModuleFn(sv, _saveModule);
|
||||||
AQH_Service_SetAddModuleFn(sv, _addModule);
|
AQCGI_Service_SetAddModuleFn(sv, _addModule);
|
||||||
AQH_Service_SetDelModuleFn(sv, _delModule);
|
AQCGI_Service_SetDelModuleFn(sv, _delModule);
|
||||||
AQH_Service_SetListModulesFn(sv, _listModules);
|
AQCGI_Service_SetListModulesFn(sv, _listModules);
|
||||||
|
|
||||||
AQH_Service_SetLoadSessionFn(sv, _loadSession);
|
AQCGI_Service_SetLoadSessionFn(sv, _loadSession);
|
||||||
AQH_Service_SetSaveSessionFn(sv, _saveSession);
|
AQCGI_Service_SetSaveSessionFn(sv, _saveSession);
|
||||||
AQH_Service_SetAddSessionFn(sv, _addSession);
|
AQCGI_Service_SetAddSessionFn(sv, _addSession);
|
||||||
AQH_Service_SetDelSessionFn(sv, _delSession);
|
AQCGI_Service_SetDelSessionFn(sv, _delSession);
|
||||||
AQH_Service_SetListSessionsFn(sv, _listSessions);
|
AQCGI_Service_SetListSessionsFn(sv, _listSessions);
|
||||||
|
|
||||||
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
dbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
GWEN_Buffer_AppendArgs(dbuf, "dir://%s", AQH_Service_GetRuntimeFolder(sv));
|
GWEN_Buffer_AppendArgs(dbuf, "dir://%s", AQCGI_Service_GetRuntimeFolder(sv));
|
||||||
DBG_ERROR(NULL, "Creating config mgr \"%s\"", GWEN_Buffer_GetStart(dbuf));
|
DBG_ERROR(NULL, "Creating config mgr \"%s\"", GWEN_Buffer_GetStart(dbuf));
|
||||||
xs->configMgr=GWEN_ConfigMgr_Factory(GWEN_Buffer_GetStart(dbuf));
|
xs->configMgr=GWEN_ConfigMgr_Factory(GWEN_Buffer_GetStart(dbuf));
|
||||||
if (xs->configMgr==NULL) {
|
if (xs->configMgr==NULL) {
|
||||||
DBG_ERROR(NULL, "Error creating config mgr \"%s\"", GWEN_Buffer_GetStart(dbuf));
|
DBG_ERROR(NULL, "Error creating config mgr \"%s\"", GWEN_Buffer_GetStart(dbuf));
|
||||||
GWEN_Buffer_free(dbuf);
|
GWEN_Buffer_free(dbuf);
|
||||||
AQH_Service_free(sv);
|
AQCGI_Service_free(sv);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
GWEN_Buffer_free(dbuf);
|
GWEN_Buffer_free(dbuf);
|
||||||
@@ -135,15 +135,15 @@ void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_USER *_loadUser(AQH_SERVICE *sv, const char *s)
|
AQCGI_USER *_loadUser(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
|
|
||||||
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s);
|
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s);
|
||||||
if (db) {
|
if (db) {
|
||||||
AQH_USER *user;
|
AQCGI_USER *user;
|
||||||
|
|
||||||
user=AQH_User_fromDb(db);
|
user=AQCGI_User_fromDb(db);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
@@ -153,25 +153,23 @@ AQH_USER *_loadUser(AQH_SERVICE *sv, const char *s)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _saveUser(AQH_SERVICE *sv, AQH_USER *user)
|
int _saveUser(AQCGI_SERVICE *sv, AQCGI_USER *user)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_User_GetAlias(user);
|
s=AQCGI_User_GetAlias(user);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_User_toDb(user, db);
|
rv=AQCGI_User_toDb(user, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
//_logGroup(AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
|
||||||
|
|
||||||
rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
@@ -186,17 +184,17 @@ int _saveUser(AQH_SERVICE *sv, AQH_USER *user)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _addUser(AQH_SERVICE *sv, AQH_USER *user)
|
int _addUser(AQCGI_SERVICE *sv, AQCGI_USER *user)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_User_GetAlias(user);
|
s=AQCGI_User_GetAlias(user);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_User_toDb(user, db);
|
rv=AQCGI_User_toDb(user, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
@@ -219,29 +217,29 @@ int _addUser(AQH_SERVICE *sv, AQH_USER *user)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _delUser(AQH_SERVICE *sv, const char *s)
|
int _delUser(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_USERS, s);
|
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_USERS, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *_listUsers(AQH_SERVICE *sv)
|
GWEN_STRINGLIST *_listUsers(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_USERS);
|
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_USERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_MODULE *_loadModule(AQH_SERVICE *sv, const char *s)
|
AQCGI_MODULE *_loadModule(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
|
|
||||||
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_MODULES, s);
|
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_MODULES, s);
|
||||||
if (db) {
|
if (db) {
|
||||||
AQH_MODULE *module;
|
AQCGI_MODULE *module;
|
||||||
|
|
||||||
module=AQH_Module_fromDb(db);
|
module=AQCGI_Module_fromDb(db);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
@@ -251,17 +249,17 @@ AQH_MODULE *_loadModule(AQH_SERVICE *sv, const char *s)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _saveModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
int _saveModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_Module_GetName(module);
|
s=AQCGI_Module_GetName(module);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_Module_toDb(module, db);
|
rv=AQCGI_Module_toDb(module, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
@@ -281,17 +279,17 @@ int _saveModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _addModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
int _addModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_Module_GetName(module);
|
s=AQCGI_Module_GetName(module);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_Module_toDb(module, db);
|
rv=AQCGI_Module_toDb(module, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
@@ -311,14 +309,14 @@ int _addModule(AQH_SERVICE *sv, AQH_MODULE *module)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _delModule(AQH_SERVICE *sv, const char *s)
|
int _delModule(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_MODULES, s);
|
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_MODULES, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *_listModules(AQH_SERVICE *sv)
|
GWEN_STRINGLIST *_listModules(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_MODULES);
|
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_MODULES);
|
||||||
}
|
}
|
||||||
@@ -326,15 +324,15 @@ GWEN_STRINGLIST *_listModules(AQH_SERVICE *sv)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_SESSION* _loadSession(AQH_SERVICE *sv, const char *s)
|
AQCGI_SESSION* _loadSession(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
|
|
||||||
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_SESSIONS, s);
|
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_SESSIONS, s);
|
||||||
if (db) {
|
if (db) {
|
||||||
AQH_SESSION *session;
|
AQCGI_SESSION *session;
|
||||||
|
|
||||||
session=AQH_Session_fromDb(db);
|
session=AQCGI_Session_fromDb(db);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
@@ -344,17 +342,17 @@ AQH_SESSION* _loadSession(AQH_SERVICE *sv, const char *s)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _saveSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
int _saveSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_Session_GetUid(session);
|
s=AQCGI_Session_GetUid(session);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_Session_toDb(session, db);
|
rv=AQCGI_Session_toDb(session, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
@@ -374,17 +372,17 @@ int _saveSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _addSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
int _addSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
s=AQH_Session_GetUid(session);
|
s=AQCGI_Session_GetUid(session);
|
||||||
if (s && *s) {
|
if (s && *s) {
|
||||||
GWEN_DB_NODE *db;
|
GWEN_DB_NODE *db;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
db=GWEN_DB_Group_new(s);
|
db=GWEN_DB_Group_new(s);
|
||||||
rv=AQH_Session_toDb(session, db);
|
rv=AQCGI_Session_toDb(session, db);
|
||||||
if (rv<0) {
|
if (rv<0) {
|
||||||
DBG_ERROR(NULL, "here (%d)", rv);
|
DBG_ERROR(NULL, "here (%d)", rv);
|
||||||
GWEN_DB_Group_free(db);
|
GWEN_DB_Group_free(db);
|
||||||
@@ -404,27 +402,27 @@ int _addSession(AQH_SERVICE *sv, AQH_SESSION *session)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _delSession(AQH_SERVICE *sv, const char *s)
|
int _delSession(AQCGI_SERVICE *sv, const char *s)
|
||||||
{
|
{
|
||||||
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_SESSIONS, s);
|
return _deleteGroup(sv, AQH_SERVICE_FILE_GROUP_SESSIONS, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *_listSessions(AQH_SERVICE *sv)
|
GWEN_STRINGLIST *_listSessions(AQCGI_SERVICE *sv)
|
||||||
{
|
{
|
||||||
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_SESSIONS);
|
return _listGroup(sv, AQH_SERVICE_FILE_GROUP_SESSIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName)
|
GWEN_DB_NODE *_loadGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName)
|
||||||
{
|
{
|
||||||
DBG_ERROR(NULL, "Lock and load group %s/%s", groupName, subGroupName);
|
DBG_ERROR(NULL, "Lock and load group %s/%s", groupName, subGroupName);
|
||||||
if (sv && groupName && subGroupName) {
|
if (sv && groupName && subGroupName) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
GWEN_DB_NODE *db=NULL;
|
GWEN_DB_NODE *db=NULL;
|
||||||
int rv;
|
int rv;
|
||||||
@@ -460,12 +458,12 @@ GWEN_DB_NODE *_loadGroupLocked(AQH_SERVICE *sv, const char *groupName, const cha
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _saveGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db)
|
int _saveGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db)
|
||||||
{
|
{
|
||||||
if (sv && groupName && subGroupName && db) {
|
if (sv && groupName && subGroupName && db) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
@@ -498,12 +496,12 @@ int _saveGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGrou
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db)
|
int _addGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName, GWEN_DB_NODE *db)
|
||||||
{
|
{
|
||||||
if (sv && groupName && subGroupName && db) {
|
if (sv && groupName && subGroupName && db) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
@@ -539,12 +537,12 @@ int _addGroupLocked(AQH_SERVICE *sv, const char *groupName, const char *subGroup
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _deleteGroup(AQH_SERVICE *sv, const char *groupName, const char *subGroupName)
|
int _deleteGroup(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName)
|
||||||
{
|
{
|
||||||
if (sv && groupName && subGroupName) {
|
if (sv && groupName && subGroupName) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
@@ -561,12 +559,12 @@ int _deleteGroup(AQH_SERVICE *sv, const char *groupName, const char *subGroupNam
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName)
|
GWEN_STRINGLIST *_listGroup(AQCGI_SERVICE *sv, const char *groupName)
|
||||||
{
|
{
|
||||||
if (sv && groupName) {
|
if (sv && groupName) {
|
||||||
AQH_SERVICE_FILE *xs;
|
AQH_SERVICE_FILE *xs;
|
||||||
|
|
||||||
xs=GWEN_INHERIT_GETDATA(AQH_SERVICE, AQH_SERVICE_FILE, sv);
|
xs=GWEN_INHERIT_GETDATA(AQCGI_SERVICE, AQH_SERVICE_FILE, sv);
|
||||||
if (xs) {
|
if (xs) {
|
||||||
GWEN_STRINGLIST *sl;
|
GWEN_STRINGLIST *sl;
|
||||||
int rv;
|
int rv;
|
||||||
|
|||||||
@@ -10,10 +10,10 @@
|
|||||||
#define AQHOME_SERVICE_FILE_H
|
#define AQHOME_SERVICE_FILE_H
|
||||||
|
|
||||||
|
|
||||||
#include "aqhome-cgi/service/service.h"
|
#include "aqcgi/service/service.h"
|
||||||
|
|
||||||
|
|
||||||
AQH_SERVICE *AQH_ServiceFiles_new(const char *baseFolder, const char *baseUrl);
|
AQCGI_SERVICE *AQH_ServiceFiles_new(const char *baseFolder, const char *baseUrl);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "aqhome/msg/node/m_node.h"
|
#include "aqhome/msg/node/m_node.h"
|
||||||
#include "aqhome/msg/node/m_sendstats.h"
|
#include "aqhome/msg/node/m_sendstats.h"
|
||||||
#include "aqhome/msg/node/m_recvstats.h"
|
#include "aqhome/msg/node/m_recvstats.h"
|
||||||
|
#include "aqhome/msg/node/m_memstats.h"
|
||||||
#include "aqhome/msg/node/m_value.h"
|
#include "aqhome/msg/node/m_value.h"
|
||||||
#include "aqhome/msg/node/m_addr.h"
|
#include "aqhome/msg/node/m_addr.h"
|
||||||
#include "aqhome/msg/node/m_device.h"
|
#include "aqhome/msg/node/m_device.h"
|
||||||
@@ -44,6 +45,7 @@ static void _handleMsgValue(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
|||||||
static void _handleAddressMsg(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
static void _handleAddressMsg(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
static void _handleMsgComSendStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
static void _handleMsgComSendStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
static void _handleMsgComRecvStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
static void _handleMsgComRecvStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
|
static void _handleMsgMemStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
static void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
static void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
static void _handleMsgFlashReady(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
static void _handleMsgFlashReady(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg);
|
||||||
|
|
||||||
@@ -76,6 +78,7 @@ void AQH_NodeServer_NodeMsgToDb(AQH_OBJECT *o, const AQH_MESSAGE *msg)
|
|||||||
switch(msgType) {
|
switch(msgType) {
|
||||||
case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(xo, msg); break;
|
case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(xo, msg); break;
|
||||||
case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(xo, msg); break;
|
case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(xo, msg); break;
|
||||||
|
case AQH_MSG_TYPE_MEMSTATS: _handleMsgMemStat(xo, msg); break;
|
||||||
case AQH_MSG_TYPE_VALUE_REPORT: _handleMsgValue(xo, msg); break;
|
case AQH_MSG_TYPE_VALUE_REPORT: _handleMsgValue(xo, msg); break;
|
||||||
case AQH_MSG_TYPE_NEED_ADDRESS: _handleAddressMsg(xo, msg); break;
|
case AQH_MSG_TYPE_NEED_ADDRESS: _handleAddressMsg(xo, msg); break;
|
||||||
case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleAddressMsg(xo, msg); break;
|
case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleAddressMsg(xo, msg); break;
|
||||||
@@ -195,6 +198,30 @@ void _handleMsgComRecvStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _handleMsgMemStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
||||||
|
{
|
||||||
|
AQH_NODE_INFO *ni;
|
||||||
|
uint32_t uid;
|
||||||
|
|
||||||
|
uid=AQH_MemStatsMessage_GetUid(msg);
|
||||||
|
ni=_getOrCreateNodeAndUpdateUidAddr(xo, msg, uid);
|
||||||
|
if (ni==NULL) {
|
||||||
|
DBG_INFO(AQH_LOGDOMAIN, "Error handling message");
|
||||||
|
}
|
||||||
|
AQH_NodeInfo_SetStatsStackUsed(ni, AQH_MemStatsMessage_GetStackUsage(msg));
|
||||||
|
AQH_NodeInfo_SetStatsBuffersUsed(ni, AQH_MemStatsMessage_GetBuffersUsed(msg));
|
||||||
|
AQH_NodeInfo_SetStatsMaxBuffersUsed(ni, AQH_MemStatsMessage_GetMaxBuffersUsed(msg));
|
||||||
|
AQH_NodeInfo_SetStatsRecvNoBuffer(ni, AQH_MemStatsMessage_GetRecvNoBufferErrors(msg));
|
||||||
|
AQH_NodeInfo_SetStatsHeapUsed(ni, AQH_MemStatsMessage_GetHeapUsed(msg));
|
||||||
|
AQH_NodeInfo_SetStatsHeapFree(ni, AQH_MemStatsMessage_GetHeapFree(msg));
|
||||||
|
AQH_NodeInfo_SetStatsXramSize(ni, AQH_MemStatsMessage_GetXramSize(msg));
|
||||||
|
|
||||||
|
AQH_NodeDb_SetModified(xo->nodeDb);
|
||||||
|
_updateTimestampLastChange(ni);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
||||||
{
|
{
|
||||||
AQH_NODE_INFO *ni;
|
AQH_NODE_INFO *ni;
|
||||||
|
|||||||
@@ -250,18 +250,9 @@ AQHNODE_DEVICE *_readXmlDevice(GWEN_XMLNODE *deviceNode)
|
|||||||
AQHNODE_VALUE_LIST *valueList;
|
AQHNODE_VALUE_LIST *valueList;
|
||||||
|
|
||||||
valueList=_readXmlValueList(valuesNode);
|
valueList=_readXmlValueList(valuesNode);
|
||||||
if (valueList==NULL) {
|
if (valueList)
|
||||||
DBG_INFO(NULL, "here");
|
|
||||||
AQHNODE_Device_free(device);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
AQHNODE_Device_SetValueList(device, valueList);
|
AQHNODE_Device_SetValueList(device, valueList);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
DBG_INFO(NULL, "No <values> element");
|
|
||||||
AQHNODE_Device_free(device);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
#define CONNCLEAN_INTERVAL_IN_SECS 2
|
#define CONNCLEAN_INTERVAL_IN_SECS 2
|
||||||
#define CONNCHECK_INTERVAL_IN_SECS 10
|
#define CONNCHECK_INTERVAL_IN_SECS 10
|
||||||
|
#define HEARTBEAT_INTERVAL_IN_SECS 120 /* every 2mins */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -133,11 +134,13 @@ void _runService(AQH_OBJECT *aqh, AQH_EVENT_LOOP *eventLoop)
|
|||||||
int timeout;
|
int timeout;
|
||||||
time_t timeLastConnectionCleanup;
|
time_t timeLastConnectionCleanup;
|
||||||
time_t timeLastConnCheck;
|
time_t timeLastConnCheck;
|
||||||
|
time_t timeLastHeartbeat;
|
||||||
|
|
||||||
timeout=AQH_NodeServer_GetTimeout(aqh);
|
timeout=AQH_NodeServer_GetTimeout(aqh);
|
||||||
timeStart=time(NULL);
|
timeStart=time(NULL);
|
||||||
timeLastConnectionCleanup=time(NULL);
|
timeLastConnectionCleanup=timeStart;
|
||||||
timeLastConnCheck=time(NULL);
|
timeLastConnCheck=timeStart;
|
||||||
|
timeLastHeartbeat=timeStart;
|
||||||
|
|
||||||
while(!stopService) {
|
while(!stopService) {
|
||||||
time_t now;
|
time_t now;
|
||||||
@@ -162,6 +165,13 @@ void _runService(AQH_OBJECT *aqh, AQH_EVENT_LOOP *eventLoop)
|
|||||||
timeLastConnCheck=now;
|
timeLastConnCheck=now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_diffInSeconds(now, timeLastHeartbeat)>HEARTBEAT_INTERVAL_IN_SECS) {
|
||||||
|
DBG_INFO(NULL, "Sending heartbeat message");
|
||||||
|
AQH_NodeServer_SendHeartbeat(aqh);
|
||||||
|
timeLastHeartbeat=now;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (timeout && (_diffInSeconds(now, timeStart)>timeout)) {
|
if (timeout && (_diffInSeconds(now, timeStart)>timeout)) {
|
||||||
DBG_INFO(NULL, "Timeout");
|
DBG_INFO(NULL, "Timeout");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <aqhome/msg/node/m_recvstats.h>
|
#include <aqhome/msg/node/m_recvstats.h>
|
||||||
#include <aqhome/msg/node/m_sendstats.h>
|
#include <aqhome/msg/node/m_sendstats.h>
|
||||||
#include <aqhome/msg/node/m_memstats.h>
|
#include <aqhome/msg/node/m_memstats.h>
|
||||||
|
#include <aqhome/msg/node/m_heartbeat.h>
|
||||||
#include <aqhome/data/value.h>
|
#include <aqhome/data/value.h>
|
||||||
|
|
||||||
#include <gwenhywfar/args.h>
|
#include <gwenhywfar/args.h>
|
||||||
@@ -457,7 +458,7 @@ void _readConfig(AQH_OBJECT *o, AQH_NODE_SERVER *xo, GWEN_DB_NODE *dbArgs)
|
|||||||
AQH_NodeServer_SetDbFile(o, GWEN_DB_GetCharValue(dbArgs, "dbfile", 0, NULL));
|
AQH_NodeServer_SetDbFile(o, GWEN_DB_GetCharValue(dbArgs, "dbfile", 0, NULL));
|
||||||
AQH_NodeServer_SetLogFile(o, GWEN_DB_GetCharValue(dbArgs, "logfile", 0, NULL));
|
AQH_NodeServer_SetLogFile(o, GWEN_DB_GetCharValue(dbArgs, "logfile", 0, NULL));
|
||||||
|
|
||||||
AQH_NodeServer_SetDevicePath(o, GWEN_DB_GetCharValue(dbArgs, "device", 0, AQHOMED_DEFAULT_DEVICE));
|
AQH_NodeServer_SetDevicePath(o, readCharConfigWithAlt(dbArgs, "device", "ConfigFile/device", AQHOMED_DEFAULT_DEVICE));
|
||||||
AQH_NodeServer_SetTpcAddress(o, readCharConfigWithAlt(dbArgs, "tcpAddress", "ConfigFile/nodesAddress", NULL));
|
AQH_NodeServer_SetTpcAddress(o, readCharConfigWithAlt(dbArgs, "tcpAddress", "ConfigFile/nodesAddress", NULL));
|
||||||
AQH_NodeServer_SetTcpPort(o, readIntConfigWithAlt(dbArgs, "tcpPort", "ConfigFile/nodesPort", AQHOMED_DEFAULT_IPC_PORT, -1));
|
AQH_NodeServer_SetTcpPort(o, readIntConfigWithAlt(dbArgs, "tcpPort", "ConfigFile/nodesPort", AQHOMED_DEFAULT_IPC_PORT, -1));
|
||||||
|
|
||||||
@@ -811,6 +812,25 @@ void AQH_NodeServer_HandleTtyMsgs(AQH_OBJECT *o)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_NodeServer_SendHeartbeat(AQH_OBJECT *o)
|
||||||
|
{
|
||||||
|
AQH_NODE_SERVER *xo;
|
||||||
|
|
||||||
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_NODE_SERVER, o);
|
||||||
|
if (xo && xo->ttyEndpoint) {
|
||||||
|
AQH_MESSAGE *nodeMsg;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
|
t=time(0);
|
||||||
|
nodeMsg=AQH_HeartbeatMessage_new(0xf0, 0x00, AQH_MSG_TYPE_HEARTBEAT, (uint32_t) t);
|
||||||
|
AQH_Endpoint_AddMsgOut(xo->ttyEndpoint, nodeMsg);
|
||||||
|
AQH_NodeServer_WriteTtyMsgToLogFile(o, nodeMsg, "sending");
|
||||||
|
DBG_ERROR(NULL, "Forwarding node message %d to node", AQH_NodeMessage_GetMsgType(nodeMsg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _handleMsgFromTty(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
void _handleMsgFromTty(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg)
|
||||||
{
|
{
|
||||||
uint8_t code;
|
uint8_t code;
|
||||||
@@ -963,8 +983,13 @@ void _forwardDataFromMemStatsMsgToBroker(AQH_NODE_SERVER *xo, const AQH_MESSAGE
|
|||||||
|
|
||||||
uid=AQH_MemStatsMessage_GetUid(msg);
|
uid=AQH_MemStatsMessage_GetUid(msg);
|
||||||
|
|
||||||
_publishInt( xo, uid, "mem/buffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg));
|
_publishInt(xo, uid, "mem/buffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg));
|
||||||
_publishInt( xo, uid, "mem/maxBuffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetMaxBuffersUsed(msg));
|
_publishInt(xo, uid, "mem/maxBuffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetMaxBuffersUsed(msg));
|
||||||
|
_publishInt(xo, uid, "mem/stackused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetStackUsage(msg));
|
||||||
|
_publishInt(xo, uid, "mem/buffersused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg));
|
||||||
|
_publishInt(xo, uid, "mem/heapused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetHeapUsed(msg));
|
||||||
|
_publishInt(xo, uid, "mem/heapfree", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetHeapFree(msg));
|
||||||
|
_publishInt(xo, uid, "mem/xramsize", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetXramSize(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ void AQH_NodeServer_HandleClientMsgs(AQH_OBJECT *o);
|
|||||||
void AQH_NodeServer_HandleBrokerMsgs(AQH_OBJECT *o);
|
void AQH_NodeServer_HandleBrokerMsgs(AQH_OBJECT *o);
|
||||||
void AQH_NodeServer_CheckBrokerConnection(AQH_OBJECT *o);
|
void AQH_NodeServer_CheckBrokerConnection(AQH_OBJECT *o);
|
||||||
void AQH_NodeServer_CheckTtyConnection(AQH_OBJECT *o);
|
void AQH_NodeServer_CheckTtyConnection(AQH_OBJECT *o);
|
||||||
|
void AQH_NodeServer_SendHeartbeat(AQH_OBJECT *o);
|
||||||
|
|
||||||
|
|
||||||
/* getters and setters */
|
/* getters and setters */
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "aqhome/msg/msg_sysstats.h"
|
#include "aqhome/msg/msg_sysstats.h"
|
||||||
#include "aqhome/msg/msg_ping.h"
|
#include "aqhome/msg/msg_ping.h"
|
||||||
#include "aqhome/msg/msg_pong.h"
|
#include "aqhome/msg/msg_pong.h"
|
||||||
|
#include "aqhome/msg/m_heartbeat.h"
|
||||||
#include "aqhome/msg/msg_needaddr.h"
|
#include "aqhome/msg/msg_needaddr.h"
|
||||||
#include "aqhome/msg/msg_claimaddr.h"
|
#include "aqhome/msg/msg_claimaddr.h"
|
||||||
#include "aqhome/msg/msg_haveaddr.h"
|
#include "aqhome/msg/msg_haveaddr.h"
|
||||||
@@ -80,6 +81,7 @@ void AqHomed_LogTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg)
|
|||||||
switch(msgType) {
|
switch(msgType) {
|
||||||
case AQH_MSG_TYPE_PING: AQH_PingMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
case AQH_MSG_TYPE_PING: AQH_PingMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
case AQH_MSG_TYPE_PONG: AQH_PongMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
case AQH_MSG_TYPE_PONG: AQH_PongMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
|
case AQH_MSG_TYPE_HEARTBEAT: AQH_HeartbeatMessage_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
case AQH_MSG_TYPE_COMSENDSTATS: AQH_SendStatsMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
case AQH_MSG_TYPE_COMSENDSTATS: AQH_SendStatsMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
case AQH_MSG_TYPE_COMRECVSTATS: AQH_RecvStatsMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
case AQH_MSG_TYPE_COMRECVSTATS: AQH_RecvStatsMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
case AQH_MSG_TYPE_TWIBUSMEMBER: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
case AQH_MSG_TYPE_TWIBUSMEMBER: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break;
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ AQH_MESSAGE *_createRequestMessage(GWEN_UNUSED AQH_OBJECT *o, uint32_t msgId)
|
|||||||
const char *valueName;
|
const char *valueName;
|
||||||
const char *valueUnits;
|
const char *valueUnits;
|
||||||
const char *valueDataAsString;
|
const char *valueDataAsString;
|
||||||
double valueData;
|
double valueData=0.0;
|
||||||
AQH_VALUE *v;
|
AQH_VALUE *v;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
@@ -205,6 +205,7 @@ int _read16BitValues(const GWEN_STRINGLIST *sl, double *pDouble)
|
|||||||
}
|
}
|
||||||
result<<=16;
|
result<<=16;
|
||||||
result+=(((uint32_t) v) & 0xffff);
|
result+=(((uint32_t) v) & 0xffff);
|
||||||
|
/*DBG_ERROR(NULL, "Adding %f (total: %lu, src=\"%s\")", v, (long unsigned int) result, s?s:"<empty>");*/
|
||||||
}
|
}
|
||||||
se=GWEN_StringListEntry_Next(se);
|
se=GWEN_StringListEntry_Next(se);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,13 +176,15 @@ void _printNode(const AQH_NODE_INFO *ni, int printAll)
|
|||||||
GWEN_Timestamp_GetHour(ts),
|
GWEN_Timestamp_GetHour(ts),
|
||||||
GWEN_Timestamp_GetMinute(ts),
|
GWEN_Timestamp_GetMinute(ts),
|
||||||
GWEN_Timestamp_GetSecond(ts));
|
GWEN_Timestamp_GetSecond(ts));
|
||||||
fprintf(stdout, "pkg out: %d, pkg in: %d, collisions: %d, busy: %d, crc: %d, io: %d\n",
|
fprintf(stdout, "pkg out: %d, pkg in: %d, busy: %d, crc: %d, io: %d, heap used: %d, heap free: %d, xram: %d\n",
|
||||||
AQH_NodeInfo_GetStatsPacketsOut(ni),
|
AQH_NodeInfo_GetStatsPacketsOut(ni),
|
||||||
AQH_NodeInfo_GetStatsPacketsIn(ni),
|
AQH_NodeInfo_GetStatsPacketsIn(ni),
|
||||||
AQH_NodeInfo_GetStatsCollisions(ni),
|
|
||||||
AQH_NodeInfo_GetStatsBusy(ni),
|
AQH_NodeInfo_GetStatsBusy(ni),
|
||||||
AQH_NodeInfo_GetStatsCrcErrors(ni),
|
AQH_NodeInfo_GetStatsCrcErrors(ni),
|
||||||
AQH_NodeInfo_GetStatsIoErrors(ni));
|
AQH_NodeInfo_GetStatsIoErrors(ni),
|
||||||
|
AQH_NodeInfo_GetStatsHeapUsed(ni),
|
||||||
|
AQH_NodeInfo_GetStatsHeapFree(ni),
|
||||||
|
AQH_NodeInfo_GetStatsXramSize(ni));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -277,6 +277,8 @@ int AQH_ValueModality_fromString(const char *s)
|
|||||||
return AQH_ValueModality_OnOff;
|
return AQH_ValueModality_OnOff;
|
||||||
else if (strcasecmp(s, "onOffAuto")==0)
|
else if (strcasecmp(s, "onOffAuto")==0)
|
||||||
return AQH_ValueModality_OnOffAuto;
|
return AQH_ValueModality_OnOffAuto;
|
||||||
|
else if (strcasecmp(s, "rpm")==0)
|
||||||
|
return AQH_ValueModality_RPM;
|
||||||
}
|
}
|
||||||
return AQH_ValueModality_Unknown;
|
return AQH_ValueModality_Unknown;
|
||||||
}
|
}
|
||||||
@@ -298,6 +300,7 @@ const char *AQH_ValueModality_toString(int i)
|
|||||||
case AQH_ValueModality_Light: return "light";
|
case AQH_ValueModality_Light: return "light";
|
||||||
case AQH_ValueModality_OnOff: return "onOff";
|
case AQH_ValueModality_OnOff: return "onOff";
|
||||||
case AQH_ValueModality_OnOffAuto: return "onOffAuto";
|
case AQH_ValueModality_OnOffAuto: return "onOffAuto";
|
||||||
|
case AQH_ValueModality_RPM: return "rpm";
|
||||||
case AQH_ValueModality_Unknown:
|
case AQH_ValueModality_Unknown:
|
||||||
default: return "unknown";
|
default: return "unknown";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ enum {
|
|||||||
AQH_ValueModality_Stats,
|
AQH_ValueModality_Stats,
|
||||||
AQH_ValueModality_Light,
|
AQH_ValueModality_Light,
|
||||||
AQH_ValueModality_OnOff,
|
AQH_ValueModality_OnOff,
|
||||||
AQH_ValueModality_OnOffAuto
|
AQH_ValueModality_OnOffAuto,
|
||||||
|
AQH_ValueModality_RPM
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -248,6 +248,31 @@ AQH_DEVICE_LIST *AQH_DataClient_GetDevices(AQH_DATACLIENT *dc, const char *devic
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_DEVICE *AQH_DataClient_GetDeviceByName(AQH_DATACLIENT *dc, const char *deviceName)
|
||||||
|
{
|
||||||
|
if (deviceName && *deviceName) {
|
||||||
|
AQH_DEVICE_LIST *deviceList;
|
||||||
|
|
||||||
|
deviceList=AQH_DataClient_GetDevices(dc, deviceName);
|
||||||
|
if (deviceList) {
|
||||||
|
AQH_DEVICE *device;
|
||||||
|
|
||||||
|
device=AQH_Device_List_First(deviceList);
|
||||||
|
if (device) {
|
||||||
|
AQH_Device_List_Del(device);
|
||||||
|
AQH_Device_List_free(deviceList);
|
||||||
|
return device;
|
||||||
|
}
|
||||||
|
AQH_Device_List_free(deviceList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality)
|
AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality)
|
||||||
{
|
{
|
||||||
if (dc) {
|
if (dc) {
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ AQHOME_API int AQH_DataClient_Disconnect(AQH_DATACLIENT *dc);
|
|||||||
|
|
||||||
|
|
||||||
AQHOME_API AQH_DEVICE_LIST *AQH_DataClient_GetDevices(AQH_DATACLIENT *dc, const char *deviceName);
|
AQHOME_API AQH_DEVICE_LIST *AQH_DataClient_GetDevices(AQH_DATACLIENT *dc, const char *deviceName);
|
||||||
|
AQHOME_API AQH_DEVICE *AQH_DataClient_GetDeviceByName(AQH_DATACLIENT *dc, const char *deviceName);
|
||||||
AQHOME_API AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality);
|
AQHOME_API AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality);
|
||||||
|
|
||||||
AQHOME_API uint64_t AQH_DataClient_GetFirstData(AQH_DATACLIENT *dc, const char *valueName, uint64_t *dataPtr, uint64_t maxNum);
|
AQHOME_API uint64_t AQH_DataClient_GetFirstData(AQH_DATACLIENT *dc, const char *valueName, uint64_t *dataPtr, uint64_t maxNum);
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GWEN_INHERIT(AQH_OBJECT, AQH_FDOBJECT)
|
GWEN_INHERIT(AQH_OBJECT, AQH_FDOBJECT)
|
||||||
@@ -34,6 +36,7 @@ GWEN_INHERIT(AQH_OBJECT, AQH_FDOBJECT)
|
|||||||
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
static void _cbEnable(AQH_OBJECT *o);
|
static void _cbEnable(AQH_OBJECT *o);
|
||||||
static void _cbDisable(AQH_OBJECT *o);
|
static void _cbDisable(AQH_OBJECT *o);
|
||||||
|
static int _cbFlush(AQH_OBJECT *o);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -53,6 +56,7 @@ AQH_OBJECT *AQH_FdObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int mode)
|
|||||||
GWEN_INHERIT_SETDATA(AQH_OBJECT, AQH_FDOBJECT, o, xo, _freeData);
|
GWEN_INHERIT_SETDATA(AQH_OBJECT, AQH_FDOBJECT, o, xo, _freeData);
|
||||||
xo->fd=fd;
|
xo->fd=fd;
|
||||||
xo->fdMode=mode;
|
xo->fdMode=mode;
|
||||||
|
xo->flushFn=_cbFlush;
|
||||||
|
|
||||||
AQH_Object_SetEnableFn(o, _cbEnable);
|
AQH_Object_SetEnableFn(o, _cbEnable);
|
||||||
AQH_Object_SetDisableFn(o, _cbDisable);
|
AQH_Object_SetDisableFn(o, _cbDisable);
|
||||||
@@ -110,6 +114,23 @@ AQH_FDOBJECT_ENDMSG_FN AQH_FdObject_SetEndMsgFn(AQH_OBJECT *o, AQH_FDOBJECT_ENDM
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_FDOBJECT_FLUSH_FN AQH_FdObject_SetFlushFn(AQH_OBJECT *o, AQH_FDOBJECT_FLUSH_FN f)
|
||||||
|
{
|
||||||
|
AQH_FDOBJECT *xo;
|
||||||
|
|
||||||
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
||||||
|
if (xo) {
|
||||||
|
AQH_FDOBJECT_FLUSH_FN oldFn;
|
||||||
|
|
||||||
|
oldFn=xo->flushFn;
|
||||||
|
xo->flushFn=f;
|
||||||
|
return oldFn;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int AQH_FdObject_GetFdMode(const AQH_OBJECT *o)
|
int AQH_FdObject_GetFdMode(const AQH_OBJECT *o)
|
||||||
{
|
{
|
||||||
if (o) {
|
if (o) {
|
||||||
@@ -183,6 +204,7 @@ int AQH_FdObject_Read(AQH_OBJECT *o, uint8_t *ptrBuffer, uint32_t lenBuffer)
|
|||||||
DBG_INFO(AQH_LOGDOMAIN, "Error on read(%d): %s (%d)", xo->fd, strerror(errno), errno);
|
DBG_INFO(AQH_LOGDOMAIN, "Error on read(%d): %s (%d)", xo->fd, strerror(errno), errno);
|
||||||
close(xo->fd);
|
close(xo->fd);
|
||||||
xo->fd=-1;
|
xo->fd=-1;
|
||||||
|
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
|
||||||
return GWEN_ERROR_IO;
|
return GWEN_ERROR_IO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,40 +227,22 @@ int AQH_FdObject_FlushInput(AQH_OBJECT *o)
|
|||||||
AQH_FDOBJECT *xo;
|
AQH_FDOBJECT *xo;
|
||||||
|
|
||||||
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
||||||
if (xo) {
|
if (xo && xo->flushFn) {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv=xo->flushFn(o);
|
||||||
|
if (rv<0) {
|
||||||
if (xo->fd!=-1) {
|
if (xo->fd!=-1) {
|
||||||
ssize_t rv;
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on flush, closing.");
|
||||||
ssize_t bytesRead=0;
|
|
||||||
uint8_t tbuf[16];
|
|
||||||
|
|
||||||
do {
|
|
||||||
rv=read(xo->fd, tbuf, sizeof(tbuf));
|
|
||||||
if (rv>0)
|
|
||||||
bytesRead+=rv;
|
|
||||||
} while(rv>=0);
|
|
||||||
|
|
||||||
if (rv==0) {
|
|
||||||
DBG_INFO(AQH_LOGDOMAIN, "EOF met");
|
|
||||||
return GWEN_ERROR_EOF;
|
|
||||||
}
|
|
||||||
else if (rv<0) {
|
|
||||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
|
|
||||||
close(xo->fd);
|
close(xo->fd);
|
||||||
xo->fd=-1;
|
xo->fd=-1;
|
||||||
return GWEN_ERROR_IO;
|
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (bytesRead>0)?1:0;
|
return rv;
|
||||||
}
|
|
||||||
else {
|
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Previous error, not reading.");
|
|
||||||
return GWEN_ERROR_IO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
|
|
||||||
return GWEN_ERROR_INVALID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -263,6 +267,7 @@ int AQH_FdObject_Write(AQH_OBJECT *o, const uint8_t *ptrBuffer, uint32_t lenBuff
|
|||||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on write: %s (%d)", strerror(errno), errno);
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on write: %s (%d)", strerror(errno), errno);
|
||||||
close(xo->fd);
|
close(xo->fd);
|
||||||
xo->fd=-1;
|
xo->fd=-1;
|
||||||
|
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
|
||||||
return GWEN_ERROR_IO;
|
return GWEN_ERROR_IO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,6 +315,42 @@ void AQH_FdObject_EndMsg(AQH_OBJECT *o)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_FdObject_WaitForActivity(AQH_OBJECT *o, int timeoutInMillisecs)
|
||||||
|
{
|
||||||
|
if (o) {
|
||||||
|
AQH_FDOBJECT *xo;
|
||||||
|
|
||||||
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
||||||
|
if (xo) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd=xo->fd;
|
||||||
|
if (fd>=0) {
|
||||||
|
int rv;
|
||||||
|
fd_set rset;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
tv.tv_sec=timeoutInMillisecs/1000;
|
||||||
|
tv.tv_usec=(timeoutInMillisecs%1000)*1000;
|
||||||
|
|
||||||
|
FD_SET(fd, &rset);
|
||||||
|
if (xo->fdMode==AQH_FDOBJECT_FDMODE_READ)
|
||||||
|
rv=select(fd+1, &rset, NULL, NULL, &tv);
|
||||||
|
else
|
||||||
|
rv=select(fd+1, NULL, &rset, NULL, &tv);
|
||||||
|
if (rv<0 && errno!=EINTR) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on SELECT: %d (%s)", errno, strerror(errno));
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _cbEnable(AQH_OBJECT *o)
|
void _cbEnable(AQH_OBJECT *o)
|
||||||
{
|
{
|
||||||
if (o && !(AQH_Object_GetFlags(o) & AQH_OBJECT_FLAGS_ENABLED)) {
|
if (o && !(AQH_Object_GetFlags(o) & AQH_OBJECT_FLAGS_ENABLED)) {
|
||||||
@@ -340,6 +381,62 @@ void _cbDisable(AQH_OBJECT *o)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _cbFlush(AQH_OBJECT *o)
|
||||||
|
{
|
||||||
|
if (o) {
|
||||||
|
AQH_FDOBJECT *xo;
|
||||||
|
|
||||||
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
||||||
|
if (xo) {
|
||||||
|
if (xo->fd!=-1) {
|
||||||
|
ssize_t rv;
|
||||||
|
ssize_t bytesRead=0;
|
||||||
|
uint8_t tbuf[16];
|
||||||
|
|
||||||
|
do {
|
||||||
|
rv=read(xo->fd, tbuf, sizeof(tbuf));
|
||||||
|
if (rv>0)
|
||||||
|
bytesRead+=rv;
|
||||||
|
} while(rv>=0);
|
||||||
|
|
||||||
|
if (rv==0) {
|
||||||
|
DBG_INFO(AQH_LOGDOMAIN, "EOF met");
|
||||||
|
return GWEN_ERROR_EOF;
|
||||||
|
}
|
||||||
|
else if (rv<0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (bytesRead>0)?1:0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Previous error, not reading.");
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GWEN_ERROR_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_FdObject_Abort(AQH_OBJECT *o)
|
||||||
|
{
|
||||||
|
if (o) {
|
||||||
|
AQH_FDOBJECT *xo;
|
||||||
|
|
||||||
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_FDOBJECT, o);
|
||||||
|
if (xo) {
|
||||||
|
close(xo->fd);
|
||||||
|
xo->fd=-1;
|
||||||
|
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_ABORTED, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,12 +20,15 @@ enum {
|
|||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AQH_FDOBJECT_SIGNAL_ISREADY=AQH_OBJECT_SIGNAL_LAST
|
AQH_FDOBJECT_SIGNAL_ISREADY=AQH_OBJECT_SIGNAL_LAST,
|
||||||
|
AQH_FDOBJECT_SIGNAL_CLOSED,
|
||||||
|
AQH_FDOBJECT_SIGNAL_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef int (*AQH_FDOBJECT_STARTMSG_FN)(AQH_OBJECT *o);
|
typedef int (*AQH_FDOBJECT_STARTMSG_FN)(AQH_OBJECT *o);
|
||||||
typedef void (*AQH_FDOBJECT_ENDMSG_FN)(AQH_OBJECT *o);
|
typedef void (*AQH_FDOBJECT_ENDMSG_FN)(AQH_OBJECT *o);
|
||||||
|
typedef int (*AQH_FDOBJECT_FLUSH_FN)(AQH_OBJECT *o);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,6 +51,10 @@ AQHOME_API void AQH_FdObject_EndMsg(AQH_OBJECT *o);
|
|||||||
|
|
||||||
AQHOME_API AQH_FDOBJECT_STARTMSG_FN AQH_FdObject_SetStartMsgFn(AQH_OBJECT *o, AQH_FDOBJECT_STARTMSG_FN f);
|
AQHOME_API AQH_FDOBJECT_STARTMSG_FN AQH_FdObject_SetStartMsgFn(AQH_OBJECT *o, AQH_FDOBJECT_STARTMSG_FN f);
|
||||||
AQHOME_API AQH_FDOBJECT_ENDMSG_FN AQH_FdObject_SetEndMsgFn(AQH_OBJECT *o, AQH_FDOBJECT_ENDMSG_FN f);
|
AQHOME_API AQH_FDOBJECT_ENDMSG_FN AQH_FdObject_SetEndMsgFn(AQH_OBJECT *o, AQH_FDOBJECT_ENDMSG_FN f);
|
||||||
|
AQHOME_API AQH_FDOBJECT_FLUSH_FN AQH_FdObject_SetFlushFn(AQH_OBJECT *o, AQH_FDOBJECT_FLUSH_FN f);
|
||||||
|
|
||||||
|
AQHOME_API int AQH_FdObject_WaitForActivity(AQH_OBJECT *o, int timeoutInMillisecs);
|
||||||
|
AQHOME_API void AQH_FdObject_Abort(AQH_OBJECT *o);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ struct AQH_FDOBJECT {
|
|||||||
|
|
||||||
AQH_FDOBJECT_STARTMSG_FN startMsgFn;
|
AQH_FDOBJECT_STARTMSG_FN startMsgFn;
|
||||||
AQH_FDOBJECT_ENDMSG_FN endMsgFn;
|
AQH_FDOBJECT_ENDMSG_FN endMsgFn;
|
||||||
|
AQH_FDOBJECT_FLUSH_FN flushFn;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ AQH_OBJECT *AQH_Endpoint_new(AQH_EVENT_LOOP *eventLoop, AQH_OBJECT *msgReader, A
|
|||||||
if (msgWriter) {
|
if (msgWriter) {
|
||||||
xo->msgWriter=msgWriter;
|
xo->msgWriter=msgWriter;
|
||||||
AQH_Object_AddLink(msgWriter, AQH_MSG_WRITER_SIGNAL_MSGSENT, AQH_ENDPOINT_SLOT_MSG_SENT, o);
|
AQH_Object_AddLink(msgWriter, AQH_MSG_WRITER_SIGNAL_MSGSENT, AQH_ENDPOINT_SLOT_MSG_SENT, o);
|
||||||
|
AQH_Object_AddLink(msgWriter, AQH_MSG_WRITER_SIGNAL_CLOSED, AQH_ENDPOINT_SLOT_CLOSED, o);
|
||||||
}
|
}
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ GWEN_INHERIT(AQH_OBJECT, AQH_MSG_READER)
|
|||||||
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
static int _handleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObject, int param1, void *param2);
|
static int _handleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObject, int param1, void *param2);
|
||||||
static int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
static int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
||||||
|
static int _handleSocketClosed(AQH_OBJECT *o, int param1);
|
||||||
static int _fillRingbuffer(AQH_OBJECT *o, AQH_MSG_READER *xo, AQH_OBJECT *fdObject);
|
static int _fillRingbuffer(AQH_OBJECT *o, AQH_MSG_READER *xo, AQH_OBJECT *fdObject);
|
||||||
static void _handleSkipping(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
static void _handleSkipping(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
||||||
static int _isStillSkipTime(AQH_MSG_READER *xo);
|
static int _isStillSkipTime(AQH_MSG_READER *xo);
|
||||||
@@ -71,6 +72,7 @@ AQH_OBJECT *AQH_MsgReader_new(AQH_EVENT_LOOP *eventLoop, AQH_OBJECT *fdObject)
|
|||||||
if (fdObject) {
|
if (fdObject) {
|
||||||
xo->fdObject=fdObject;
|
xo->fdObject=fdObject;
|
||||||
AQH_Object_AddLink(xo->fdObject, AQH_FDOBJECT_SIGNAL_ISREADY, AQH_MSGREADER_SLOT_SOCKETREADY, o);
|
AQH_Object_AddLink(xo->fdObject, AQH_FDOBJECT_SIGNAL_ISREADY, AQH_MSGREADER_SLOT_SOCKETREADY, o);
|
||||||
|
AQH_Object_AddLink(xo->fdObject, AQH_FDOBJECT_SIGNAL_CLOSED, AQH_MSGREADER_SLOT_SOCKETCLOSED, o);
|
||||||
}
|
}
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
@@ -158,11 +160,12 @@ AQH_MSG_READER *AQH_MsgReader_GetData(const AQH_OBJECT *o)
|
|||||||
int _handleSignal(AQH_OBJECT *o,
|
int _handleSignal(AQH_OBJECT *o,
|
||||||
uint32_t slotId,
|
uint32_t slotId,
|
||||||
AQH_OBJECT *senderObject,
|
AQH_OBJECT *senderObject,
|
||||||
GWEN_UNUSED int param1,
|
int param1,
|
||||||
GWEN_UNUSED void *param2)
|
GWEN_UNUSED void *param2)
|
||||||
{
|
{
|
||||||
switch(slotId) {
|
switch(slotId) {
|
||||||
case AQH_MSGREADER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
|
case AQH_MSGREADER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
|
||||||
|
case AQH_MSGREADER_SLOT_SOCKETCLOSED: return _handleSocketClosed(o, param1);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -242,17 +245,34 @@ int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleSocketClosed(AQH_OBJECT *o, int param1)
|
||||||
|
{
|
||||||
|
DBG_DEBUG(AQH_LOGDOMAIN, "Socket closed");
|
||||||
|
AQH_Object_EmitSignal(o, AQH_MSG_READER_SIGNAL_CLOSED, param1, NULL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AQH_MsgReader_StartSkipping(AQH_OBJECT *o)
|
void AQH_MsgReader_StartSkipping(AQH_OBJECT *o)
|
||||||
{
|
{
|
||||||
AQH_MSG_READER *xo;
|
AQH_MSG_READER *xo;
|
||||||
|
|
||||||
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o);
|
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o);
|
||||||
if (xo) {
|
if (xo) {
|
||||||
DBG_ERROR(AQH_LOGDOMAIN, "Enter skip mode");
|
int rv;
|
||||||
|
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Skipping data in input buffers");
|
||||||
GWEN_RingBuffer_Reset(xo->ringBuffer);
|
GWEN_RingBuffer_Reset(xo->ringBuffer);
|
||||||
_resetBuffers(xo);
|
_resetBuffers(xo);
|
||||||
xo->flags|=AQH_MSGREADER_FLAGS_SKIP;
|
|
||||||
xo->timestamp=_getTimeInMilliSeconds();
|
rv=AQH_FdObject_FlushInput(xo->fdObject);
|
||||||
|
if (rv<0) {
|
||||||
|
AQH_Object_EmitSignal(o, AQH_MSG_READER_SIGNAL_ERROR, rv, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//xo->flags|=AQH_MSGREADER_FLAGS_SKIP;
|
||||||
|
//xo->timestamp=_getTimeInMilliSeconds();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ enum {
|
|||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AQH_MSGREADER_SLOT_SOCKETREADY=1
|
AQH_MSGREADER_SLOT_SOCKETREADY=1,
|
||||||
|
AQH_MSGREADER_SLOT_SOCKETCLOSED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ GWEN_INHERIT(AQH_OBJECT, AQH_MSG_WRITER)
|
|||||||
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
static int _handleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObject, int param1, void *param2);
|
static int _handleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObject, int param1, void *param2);
|
||||||
static int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
static int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject);
|
||||||
|
static int _handleSocketClosed(AQH_OBJECT *o, int param1);
|
||||||
static int _startMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject);
|
static int _startMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject);
|
||||||
static void _endMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject);
|
static void _endMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject);
|
||||||
static void _resetBuffer(AQH_OBJECT *o);
|
static void _resetBuffer(AQH_OBJECT *o);
|
||||||
@@ -111,11 +112,12 @@ void AQH_MsgWriter_SendMsg(AQH_OBJECT *o, const uint8_t *ptr, int len)
|
|||||||
int _handleSignal(AQH_OBJECT *o,
|
int _handleSignal(AQH_OBJECT *o,
|
||||||
uint32_t slotId,
|
uint32_t slotId,
|
||||||
GWEN_UNUSED AQH_OBJECT *senderObject,
|
GWEN_UNUSED AQH_OBJECT *senderObject,
|
||||||
GWEN_UNUSED int param1,
|
int param1,
|
||||||
GWEN_UNUSED void *param2)
|
GWEN_UNUSED void *param2)
|
||||||
{
|
{
|
||||||
switch(slotId) {
|
switch(slotId) {
|
||||||
case AQH_MSGWRITER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
|
case AQH_MSGWRITER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
|
||||||
|
case AQH_MSGWRITER_SLOT_SOCKETCLOSED: return _handleSocketClosed(o, param1);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -185,6 +187,15 @@ int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleSocketClosed(AQH_OBJECT *o, int param1)
|
||||||
|
{
|
||||||
|
DBG_DEBUG(AQH_LOGDOMAIN, "Socket closed");
|
||||||
|
AQH_Object_EmitSignal(o, AQH_MSG_WRITER_SIGNAL_CLOSED, param1, NULL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _startMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject)
|
int _startMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ enum {
|
|||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AQH_MSGWRITER_SLOT_SOCKETREADY=1
|
AQH_MSGWRITER_SLOT_SOCKETREADY=1,
|
||||||
|
AQH_MSGWRITER_SLOT_SOCKETCLOSED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ int _readMsg(AQH_OBJECT *o)
|
|||||||
AQH_MsgReader_StartSkipping(o);
|
AQH_MsgReader_StartSkipping(o);
|
||||||
}
|
}
|
||||||
free(msgPtr);
|
free(msgPtr);
|
||||||
|
/* handled a message */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <aqhome/events2/fdobject.h>
|
#include <aqhome/events2/fdobject.h>
|
||||||
|
|
||||||
#include <gwenhywfar/debug.h>
|
#include <gwenhywfar/debug.h>
|
||||||
|
#include <gwenhywfar/text.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -24,7 +25,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#define AQH_TTYOBJECT_BAUDRATE B19200
|
#define AQH_TTYOBJECT_BAUDRATE B19200
|
||||||
|
#define AQH_TTYOBJECT_FLUSH_LIMIT 500
|
||||||
|
#define AQH_TTYOBJECT_FLUSH_QUIET_TIME_MS 200
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------
|
||||||
@@ -32,8 +34,9 @@
|
|||||||
* ------------------------------------------------------------------------------------------------
|
* ------------------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int _startMsg(AQH_OBJECT *o);
|
static int _cbStartMsg(AQH_OBJECT *o);
|
||||||
static void _endMsg(AQH_OBJECT *o);
|
static void _cbEndMsg(AQH_OBJECT *o);
|
||||||
|
static int _cbFlush(AQH_OBJECT *o);
|
||||||
static int _getAttn(int fd);
|
static int _getAttn(int fd);
|
||||||
static int _setAttn(int fd, int val);
|
static int _setAttn(int fd, int val);
|
||||||
static int _fdSetBlocking(int sk, int fl);
|
static int _fdSetBlocking(int sk, int fl);
|
||||||
@@ -51,14 +54,18 @@ AQH_OBJECT *AQH_TtyObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int fdMode)
|
|||||||
AQH_OBJECT *o;
|
AQH_OBJECT *o;
|
||||||
|
|
||||||
o=AQH_FdObject_new(eventLoop, fd, fdMode);
|
o=AQH_FdObject_new(eventLoop, fd, fdMode);
|
||||||
AQH_FdObject_SetStartMsgFn(o, _startMsg);
|
AQH_FdObject_SetStartMsgFn(o, _cbStartMsg);
|
||||||
AQH_FdObject_SetEndMsgFn(o, _endMsg);
|
AQH_FdObject_SetEndMsgFn(o, _cbEndMsg);
|
||||||
|
AQH_FdObject_SetFlushFn(o, _cbFlush);
|
||||||
|
|
||||||
|
_cbFlush(o);
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _startMsg(AQH_OBJECT *o)
|
int _cbStartMsg(AQH_OBJECT *o)
|
||||||
{
|
{
|
||||||
if (o) {
|
if (o) {
|
||||||
if (AQH_Object_GetFlags(o) & AQH_TTYOBJECT_FLAGS_NOATTN)
|
if (AQH_Object_GetFlags(o) & AQH_TTYOBJECT_FLAGS_NOATTN)
|
||||||
@@ -91,7 +98,7 @@ int _startMsg(AQH_OBJECT *o)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void _endMsg(AQH_OBJECT *o)
|
void _cbEndMsg(AQH_OBJECT *o)
|
||||||
{
|
{
|
||||||
if (o) {
|
if (o) {
|
||||||
if (!(AQH_Object_GetFlags(o) & AQH_TTYOBJECT_FLAGS_NOATTN)) {
|
if (!(AQH_Object_GetFlags(o) & AQH_TTYOBJECT_FLAGS_NOATTN)) {
|
||||||
@@ -107,6 +114,65 @@ void _endMsg(AQH_OBJECT *o)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _cbFlush(AQH_OBJECT *o)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int rv;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Flush");
|
||||||
|
fd=AQH_FdObject_GetFd(o);
|
||||||
|
if (fd>=0) {
|
||||||
|
usleep(1000);
|
||||||
|
rv=ioctl(fd, TCFLSH, 2); // flush receive
|
||||||
|
if (rv!=0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0;i<AQH_TTYOBJECT_FLUSH_LIMIT;i++) {
|
||||||
|
uint8_t buffer[32];
|
||||||
|
|
||||||
|
/* wait for timeout */
|
||||||
|
rv=AQH_FdObject_WaitForActivity(o, AQH_TTYOBJECT_FLUSH_QUIET_TIME_MS);
|
||||||
|
if (rv==0) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "No data for some time, assuming flushed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data available, read */
|
||||||
|
rv=read(fd, buffer, sizeof(buffer));
|
||||||
|
if (rv==0) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "EOF met [%d]", i);
|
||||||
|
return GWEN_ERROR_EOF;
|
||||||
|
}
|
||||||
|
else if (rv<0) {
|
||||||
|
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d) [%d]", strerror(errno), errno, i);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Flushed %d bytes [%d]", rv, i);
|
||||||
|
GWEN_Text_LogString((const char*)buffer, rv, AQH_LOGDOMAIN, GWEN_LoggerLevel_Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i>=AQH_TTYOBJECT_FLUSH_LIMIT) {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Still data after reading for some time, assuming bad connection");
|
||||||
|
AQH_FdObject_Abort(o);
|
||||||
|
return GWEN_ERROR_IO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int _getAttn(int fd)
|
int _getAttn(int fd)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
@@ -168,12 +234,14 @@ int AQH_TtyObject_OpenAndInitDevice(const char *device, struct termios *initialT
|
|||||||
if (initialTermiosState)
|
if (initialTermiosState)
|
||||||
*initialTermiosState=options;
|
*initialTermiosState=options;
|
||||||
|
|
||||||
|
#if 0
|
||||||
options.c_cflag=CLOCAL | CREAD | CS8;
|
options.c_cflag=CLOCAL | CREAD | CS8;
|
||||||
options.c_iflag=IGNPAR | IGNBRK;
|
options.c_iflag=IGNPAR | IGNBRK;
|
||||||
options.c_oflag=0;
|
options.c_oflag=0;
|
||||||
options.c_lflag&= ~(ICANON | ECHO | ECHOE | ISIG);
|
options.c_lflag&= ~(ICANON | ECHO | ECHOE | ISIG);
|
||||||
options.c_cc[VTIME]=0; /* read timeout in deciseconds */
|
options.c_cc[VTIME]=0; /* read timeout in deciseconds */
|
||||||
options.c_cc[VMIN]=0; /* no minimum number of receive bytes */
|
options.c_cc[VMIN]=0; /* no minimum number of receive bytes */
|
||||||
|
#endif
|
||||||
cfmakeraw(&options);
|
cfmakeraw(&options);
|
||||||
|
|
||||||
rv=cfsetispeed(&options, AQH_TTYOBJECT_BAUDRATE);
|
rv=cfsetispeed(&options, AQH_TTYOBJECT_BAUDRATE);
|
||||||
@@ -243,6 +311,7 @@ int _fdSetBlocking(int fd, int fl)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int _msleep(long int msec)
|
int _msleep(long int msec)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -62,6 +62,13 @@
|
|||||||
#define AQH_IPCDATA_NODE_TAGS_STATSBUSY 0x0b /* uint16_t */
|
#define AQH_IPCDATA_NODE_TAGS_STATSBUSY 0x0b /* uint16_t */
|
||||||
#define AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS 0x0c /* uint16_t */
|
#define AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS 0x0c /* uint16_t */
|
||||||
#define AQH_IPCDATA_NODE_TAGS_STATSIOERRORS 0x0d /* uint16_t */
|
#define AQH_IPCDATA_NODE_TAGS_STATSIOERRORS 0x0d /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED 0x0e /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED 0x0f /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED 0x10 /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER 0x11 /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED 0x12 /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE 0x13 /* uint16_t */
|
||||||
|
#define AQH_IPCDATA_NODE_TAGS_STATSXRAM 0x14 /* uint16_t */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -675,6 +682,13 @@ void _writeNodeInfoFieldsAsTagsToBuffer(const AQH_NODE_INFO *ni, GWEN_BUFFER *bu
|
|||||||
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSBUSY, AQH_NodeInfo_GetStatsBusy(ni), buf);
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSBUSY, AQH_NodeInfo_GetStatsBusy(ni), buf);
|
||||||
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS, AQH_NodeInfo_GetStatsCrcErrors(ni), buf);
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS, AQH_NodeInfo_GetStatsCrcErrors(ni), buf);
|
||||||
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSIOERRORS, AQH_NodeInfo_GetStatsIoErrors(ni), buf);
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSIOERRORS, AQH_NodeInfo_GetStatsIoErrors(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED, AQH_NodeInfo_GetStatsStackUsed(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED, AQH_NodeInfo_GetStatsBuffersUsed(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED, AQH_NodeInfo_GetStatsMaxBuffersUsed(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER, AQH_NodeInfo_GetStatsRecvNoBuffer(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED, AQH_NodeInfo_GetStatsHeapUsed(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE, AQH_NodeInfo_GetStatsHeapFree(ni), buf);
|
||||||
|
GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSXRAM, AQH_NodeInfo_GetStatsXramSize(ni), buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -789,6 +803,27 @@ AQH_NODE_INFO *_readNodeInfoFromTag(const uint8_t *ptr, uint32_t len)
|
|||||||
case AQH_IPCDATA_NODE_TAGS_STATSIOERRORS:
|
case AQH_IPCDATA_NODE_TAGS_STATSIOERRORS:
|
||||||
AQH_NodeInfo_SetStatsIoErrors(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
AQH_NodeInfo_SetStatsIoErrors(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
break;
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED:
|
||||||
|
AQH_NodeInfo_SetStatsStackUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED:
|
||||||
|
AQH_NodeInfo_SetStatsBuffersUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED:
|
||||||
|
AQH_NodeInfo_SetStatsMaxBuffersUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER:
|
||||||
|
AQH_NodeInfo_SetStatsRecvNoBuffer(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED:
|
||||||
|
AQH_NodeInfo_SetStatsHeapUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE:
|
||||||
|
AQH_NodeInfo_SetStatsHeapFree(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
|
case AQH_IPCDATA_NODE_TAGS_STATSXRAM:
|
||||||
|
AQH_NodeInfo_SetStatsXramSize(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DBG_INFO(AQH_LOGDOMAIN, "Unhandled tag typ %d (%02x)", tagType, tagType);
|
DBG_INFO(AQH_LOGDOMAIN, "Unhandled tag typ %d (%02x)", tagType, tagType);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
m_flashresponse.h
|
m_flashresponse.h
|
||||||
m_range.h
|
m_range.h
|
||||||
m_time.h
|
m_time.h
|
||||||
|
m_heartbeat.h
|
||||||
</headers>
|
</headers>
|
||||||
|
|
||||||
|
|
||||||
@@ -93,6 +94,7 @@
|
|||||||
m_flashresponse.c
|
m_flashresponse.c
|
||||||
m_range.c
|
m_range.c
|
||||||
m_time.c
|
m_time.c
|
||||||
|
m_heartbeat.c
|
||||||
</sources>
|
</sources>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
55
aqhome/msg/node/m_heartbeat.c
Normal file
55
aqhome/msg/node/m_heartbeat.c
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* 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 "aqhome/msg/node/m_heartbeat.h"
|
||||||
|
#include "aqhome/msg/node/m_node.h"
|
||||||
|
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
#include <gwenhywfar/endianfns.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define AQH_MSG_OFFS_HEARTBEAT_TIMESTAMP 0 /* 4 bytes */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_MESSAGE *AQH_HeartbeatMessage_new(uint8_t destAddr, uint8_t srcAddr, uint8_t code, uint32_t timestamp)
|
||||||
|
{
|
||||||
|
uint32_t payload;
|
||||||
|
|
||||||
|
payload=GWEN_ENDIAN_HTOLE32(timestamp);
|
||||||
|
return AQH_NodeMessage_new(destAddr, srcAddr, code, sizeof(payload), (const uint8_t*)&payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t AQH_HeartbeatMessage_GetTimestamp(const AQH_MESSAGE *msg)
|
||||||
|
{
|
||||||
|
return AQH_Message_ReadUint32At(msg, AQH_MSG_OFFS_ALL_DATA_BEGIN+AQH_MSG_OFFS_HEARTBEAT_TIMESTAMP, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_HeartbeatMessage_DumpToBuffer(const AQH_MESSAGE *msg, GWEN_BUFFER *dbuf, const char *sText)
|
||||||
|
{
|
||||||
|
GWEN_Buffer_AppendArgs(dbuf,
|
||||||
|
"0x%02x->0x%02x: HEARTBEAT(%s) %s (uid=0x%08x)\n",
|
||||||
|
AQH_NodeMessage_GetSourceAddress(msg),
|
||||||
|
AQH_NodeMessage_GetDestAddress(msg),
|
||||||
|
AQH_NodeMessage_MsgTypeToChar(AQH_NodeMessage_GetMsgType(msg)),
|
||||||
|
sText,
|
||||||
|
(unsigned int) AQH_HeartbeatMessage_GetTimestamp(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
28
aqhome/msg/node/m_heartbeat.h
Normal file
28
aqhome/msg/node/m_heartbeat.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* 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.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQH_M_HEARTBEAT_H
|
||||||
|
#define AQH_M_HEARTBEAT_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <aqhome/api.h>
|
||||||
|
#include <aqhome/ipc2/message.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
AQHOME_API AQH_MESSAGE *AQH_HeartbeatMessage_new(uint8_t destAddr, uint8_t srcAddr, uint8_t code, uint32_t timestamp);
|
||||||
|
AQHOME_API uint32_t AQH_HeartbeatMessage_GetTimestamp(const AQH_MESSAGE *msg);
|
||||||
|
|
||||||
|
AQHOME_API void AQH_HeartbeatMessage_DumpToBuffer(const AQH_MESSAGE *msg, GWEN_BUFFER *dbuf, const char *sText);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "aqhome/msg/node/m_needaddr.h"
|
#include "aqhome/msg/node/m_needaddr.h"
|
||||||
#include "aqhome/msg/node/m_ping.h"
|
#include "aqhome/msg/node/m_ping.h"
|
||||||
#include "aqhome/msg/node/m_pong.h"
|
#include "aqhome/msg/node/m_pong.h"
|
||||||
|
#include "aqhome/msg/node/m_heartbeat.h"
|
||||||
#include "aqhome/msg/node/m_reboot.h"
|
#include "aqhome/msg/node/m_reboot.h"
|
||||||
#include "aqhome/msg/node/m_value.h"
|
#include "aqhome/msg/node/m_value.h"
|
||||||
#include "aqhome/msg/node/m_flashstart.h"
|
#include "aqhome/msg/node/m_flashstart.h"
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
#include "aqhome/msg/node/m_flashready.h"
|
#include "aqhome/msg/node/m_flashready.h"
|
||||||
#include "aqhome/msg/node/m_flashresponse.h"
|
#include "aqhome/msg/node/m_flashresponse.h"
|
||||||
#include "aqhome/msg/node/m_range.h"
|
#include "aqhome/msg/node/m_range.h"
|
||||||
|
#include "aqhome/msg/node/m_time.h"
|
||||||
|
|
||||||
#include <gwenhywfar/text.h>
|
#include <gwenhywfar/text.h>
|
||||||
|
|
||||||
@@ -202,6 +204,7 @@ const char *AQH_NodeMessage_MsgTypeToChar(uint8_t i)
|
|||||||
switch(i) {
|
switch(i) {
|
||||||
case AQH_MSG_TYPE_PING: return "Ping";
|
case AQH_MSG_TYPE_PING: return "Ping";
|
||||||
case AQH_MSG_TYPE_PONG: return "Pong";
|
case AQH_MSG_TYPE_PONG: return "Pong";
|
||||||
|
case AQH_MSG_TYPE_HEARTBEAT: return "Heartbeat";
|
||||||
case AQH_MSG_TYPE_COMSENDSTATS: return "SendStats";
|
case AQH_MSG_TYPE_COMSENDSTATS: return "SendStats";
|
||||||
case AQH_MSG_TYPE_COMRECVSTATS: return "RecvStats";
|
case AQH_MSG_TYPE_COMRECVSTATS: return "RecvStats";
|
||||||
case AQH_MSG_TYPE_TWIBUSMEMBER: return "TwiBusMember";
|
case AQH_MSG_TYPE_TWIBUSMEMBER: return "TwiBusMember";
|
||||||
@@ -245,6 +248,7 @@ void AQH_NodeMessage_DumpSpecificToBuffer(const AQH_MESSAGE *msg, GWEN_BUFFER *d
|
|||||||
switch(AQH_NodeMessage_GetMsgType(msg)) {
|
switch(AQH_NodeMessage_GetMsgType(msg)) {
|
||||||
case AQH_MSG_TYPE_PING: AQH_PingMessage_DumpToBuffer(msg, dbuf, sText); break;
|
case AQH_MSG_TYPE_PING: AQH_PingMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
case AQH_MSG_TYPE_PONG: AQH_PongMessage_DumpToBuffer(msg, dbuf, sText); break;
|
case AQH_MSG_TYPE_PONG: AQH_PongMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
|
case AQH_MSG_TYPE_HEARTBEAT: AQH_HeartbeatMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
case AQH_MSG_TYPE_COMSENDSTATS: AQH_SendStatsMessage_DumpToBuffer(msg, dbuf, sText); break;
|
case AQH_MSG_TYPE_COMSENDSTATS: AQH_SendStatsMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
case AQH_MSG_TYPE_COMRECVSTATS: AQH_RecvStatsMessage_DumpToBuffer(msg, dbuf, sText); break;
|
case AQH_MSG_TYPE_COMRECVSTATS: AQH_RecvStatsMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
case AQH_MSG_TYPE_NEED_ADDRESS: AQH_AddrMessage_DumpToBuffer(msg, dbuf, sText); break;
|
case AQH_MSG_TYPE_NEED_ADDRESS: AQH_AddrMessage_DumpToBuffer(msg, dbuf, sText); break;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#define AQH_MSG_TYPE_PING 10
|
#define AQH_MSG_TYPE_PING 10
|
||||||
#define AQH_MSG_TYPE_PONG 11
|
#define AQH_MSG_TYPE_PONG 11
|
||||||
|
#define AQH_MSG_TYPE_HEARTBEAT 12
|
||||||
#define AQH_MSG_TYPE_COMSENDSTATS 22
|
#define AQH_MSG_TYPE_COMSENDSTATS 22
|
||||||
#define AQH_MSG_TYPE_COMRECVSTATS 23
|
#define AQH_MSG_TYPE_COMRECVSTATS 23
|
||||||
#define AQH_MSG_TYPE_TWIBUSMEMBER 30
|
#define AQH_MSG_TYPE_TWIBUSMEMBER 30
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ uint16_t AQH_RecvStatsMessage_GetMissed(const AQH_MESSAGE *msg)
|
|||||||
void AQH_RecvStatsMessage_DumpToBuffer(const AQH_MESSAGE *msg, GWEN_BUFFER *dbuf, const char *sText)
|
void AQH_RecvStatsMessage_DumpToBuffer(const AQH_MESSAGE *msg, GWEN_BUFFER *dbuf, const char *sText)
|
||||||
{
|
{
|
||||||
GWEN_Buffer_AppendArgs(dbuf,
|
GWEN_Buffer_AppendArgs(dbuf,
|
||||||
"0x%02x->0x%02x: RECVSTATS %s"
|
"0x%02x->0x%02x: RECVSTATS %s "
|
||||||
"(uid=0x%08x, dev=%d, in=%d, eCrc=%d, eIo=%d, eNobuf=%d, eMsgSize=%d, eMissed=%d)\n",
|
"(uid=0x%08x, dev=%d, in=%d, eCrc=%d, eIo=%d, eNobuf=%d, eMsgSize=%d, eMissed=%d)\n",
|
||||||
AQH_NodeMessage_GetSourceAddress(msg),
|
AQH_NodeMessage_GetSourceAddress(msg),
|
||||||
AQH_NodeMessage_GetDestAddress(msg),
|
AQH_NodeMessage_GetDestAddress(msg),
|
||||||
|
|||||||
@@ -134,6 +134,56 @@
|
|||||||
<flags></flags>
|
<flags></flags>
|
||||||
</member>
|
</member>
|
||||||
|
|
||||||
|
<member name="statsStackUsed" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsBuffersUsed" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsMaxBuffersUsed" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsRecvNoBuffer" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsHeapUsed" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsHeapFree" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
<member name="statsXramSize" type="uint32_t" maxlen="8">
|
||||||
|
<default>0</default>
|
||||||
|
<preset>0</preset>
|
||||||
|
<access>public</access>
|
||||||
|
<flags></flags>
|
||||||
|
</member>
|
||||||
|
|
||||||
|
|
||||||
<member name="timestampLastChange" type="gwen_timestamp" maxlen="8">
|
<member name="timestampLastChange" type="gwen_timestamp" maxlen="8">
|
||||||
<default>NULL</default>
|
<default>NULL</default>
|
||||||
<preset>NULL</preset>
|
<preset>NULL</preset>
|
||||||
|
|||||||
30
avr/README
30
avr/README
@@ -1,8 +1,9 @@
|
|||||||
|
|
||||||
AqHome Node Operating System (AqOS4Avr)
|
AqHome Node Base System
|
||||||
=======================================
|
=======================
|
||||||
|
|
||||||
This is a very simple operating system for AVR nodes using ATtiny and ATmega MCUs.
|
This is a very simple base system especially for old AVR devices like ATtiny and ATmega MCUs
|
||||||
|
written in pure AVR assembler.
|
||||||
|
|
||||||
It doesn't use administration objects in RAM, it just defines some routine calls which
|
It doesn't use administration objects in RAM, it just defines some routine calls which
|
||||||
have to be added into the system to add new drivers and modules.
|
have to be added into the system to add new drivers and modules.
|
||||||
@@ -16,6 +17,21 @@ With full AqHome network stack (including address assignment protocol):
|
|||||||
- <300 bytes SDRAM (including network buffers)
|
- <300 bytes SDRAM (including network buffers)
|
||||||
|
|
||||||
|
|
||||||
|
Currently supported (and in use) are:
|
||||||
|
- ATtiny 84A
|
||||||
|
- ATtiny 85
|
||||||
|
- ATtiny 841
|
||||||
|
- ATtiny 861
|
||||||
|
- AtMega 8515
|
||||||
|
- AtMega 644P
|
||||||
|
|
||||||
|
|
||||||
|
A full system consists of these elements:
|
||||||
|
- device main app (main device code provided by the user allowing full control by the developer)
|
||||||
|
- modules (basically drivers implementing support for hardware devices like sensors or displays)
|
||||||
|
- apps (internal apps combining and extending functionality of driver modules)
|
||||||
|
|
||||||
|
|
||||||
The following system routine types are defined:
|
The following system routine types are defined:
|
||||||
|
|
||||||
Function I Description I required I add to file
|
Function I Description I required I add to file
|
||||||
@@ -26,7 +42,7 @@ MSGRECVD I called when new messages arrive I no I module
|
|||||||
EVERY100MS I called every 100 millisecs (system timer tick) I no I modules_100ms.asm or apps_100ms.asm
|
EVERY100MS I called every 100 millisecs (system timer tick) I no I modules_100ms.asm or apps_100ms.asm
|
||||||
|
|
||||||
|
|
||||||
If the CLOCK module is enable the following routines are also available:
|
If the CLOCK module is enabled the following routines are also available:
|
||||||
|
|
||||||
Function I Description I required I add to file
|
Function I Description I required I add to file
|
||||||
----------+------------------------------------------------+-----------+----------------------------------
|
----------+------------------------------------------------+-----------+----------------------------------
|
||||||
@@ -63,3 +79,9 @@ This enables all the function calls for this module. Nothing else needs to be ch
|
|||||||
code file in order to enable that module.
|
code file in order to enable that module.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
For a purely minimal system (without any drivers and apps) see "devices/minimal".
|
||||||
|
For a system which uses a two-wire-protocol to communicate with a temp/humidity sensor, has a motion sensor
|
||||||
|
and a photo diode to measure environmental light see "devices/n29". This device uses 5312 bytes FLASH (including
|
||||||
|
full AqHome network stack with statistics and value reporting) and 295 bytes SDRAM (including network buffers).
|
||||||
|
|
||||||
|
|||||||
15
avr/apps/co2_watch/0BUILD
Normal file
15
avr/apps/co2_watch/0BUILD
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<subdirs>
|
||||||
|
</subdirs>
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
main.asm
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
|
|
||||||
150
avr/apps/co2_watch/main.asm
Normal file
150
avr/apps/co2_watch/main.asm
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ APPCO2WATCH_WARN = 1000
|
||||||
|
.equ APPCO2WATCH_CRIT = 2000
|
||||||
|
|
||||||
|
.equ APPCO2WATCH_LEVEL_OK = 0
|
||||||
|
.equ APPCO2WATCH_LEVEL_WARN = 1
|
||||||
|
.equ APPCO2WATCH_LEVEL_CRIT = 2
|
||||||
|
|
||||||
|
.equ APPCO2WATCH_LED_ONTIME = 3
|
||||||
|
.equ APPCO2WATCH_LED_OFFTIME = 17
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data
|
||||||
|
|
||||||
|
.dseg
|
||||||
|
|
||||||
|
appCo2WatchDatBegin:
|
||||||
|
appCo2WatchLimitWarnLo: .byte 1
|
||||||
|
appCo2WatchLimitWarnHi: .byte 1
|
||||||
|
appCo2WatchLimitCritLo: .byte 1
|
||||||
|
appCo2WatchLimitCritHi: .byte 1
|
||||||
|
appCo2WatchDatEnd:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
AppCo2Watch_Init:
|
||||||
|
ldi r16, LOW(APPCO2WATCH_WARN)
|
||||||
|
ldi r17, HIGH(APPCO2WATCH_WARN)
|
||||||
|
sts appCo2WatchLimitWarnLo, r16
|
||||||
|
sts appCo2WatchLimitWarnHi, r17
|
||||||
|
|
||||||
|
ldi r16, LOW(APPCO2WATCH_CRIT)
|
||||||
|
ldi r17, HIGH(APPCO2WATCH_CRIT)
|
||||||
|
sts appCo2WatchLimitCritLo, r16
|
||||||
|
sts appCo2WatchLimitCritHi, r17
|
||||||
|
|
||||||
|
ldi r18, 50 ; 5secs on
|
||||||
|
ldi r19, 1 ; 100ms off
|
||||||
|
ldi r20, 1 ; go into standard heartbeat mode after period
|
||||||
|
bigcall LED1_SetTiming
|
||||||
|
|
||||||
|
ldi r18, 40 ; 4secs on
|
||||||
|
ldi r19, 1 ; 100ms off
|
||||||
|
ldi r20, 255 ; turn off after period
|
||||||
|
bigcall LED2_SetTiming
|
||||||
|
|
||||||
|
ldi r18, 30 ; 3secs on
|
||||||
|
ldi r19, 1 ; 100ms off
|
||||||
|
ldi r20, 255 ; turn off after period
|
||||||
|
bigcall LED3_SetTiming
|
||||||
|
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AppCo2Watch_OnEveryMinute:
|
||||||
|
ldi r16, SGP30_VALUE_CO2
|
||||||
|
bigcall SGP30_GetValue ; R19:R18=value, R21:R20=denom
|
||||||
|
ldi r23, APPCO2WATCH_LEVEL_OK
|
||||||
|
brcc AppCo2Watch_OnEveryMinute_ret
|
||||||
|
lds r16, appCo2WatchLimitCritLo
|
||||||
|
lds r17, appCo2WatchLimitCritHi
|
||||||
|
cp r18, r16
|
||||||
|
cpc r19, r17
|
||||||
|
brcs AppCo2Watch_OnEveryMinute_next ; below critical
|
||||||
|
ldi r23, APPCO2WATCH_LEVEL_CRIT
|
||||||
|
rjmp AppCo2Watch_OnEveryMinute_setLed
|
||||||
|
AppCo2Watch_OnEveryMinute_next:
|
||||||
|
lds r16, appCo2WatchLimitWarnLo
|
||||||
|
lds r17, appCo2WatchLimitWarnHi
|
||||||
|
cp r18, r16
|
||||||
|
cpc r19, r17
|
||||||
|
brcs AppCo2Watch_OnEveryMinute_setLed
|
||||||
|
ldi r23, APPCO2WATCH_LEVEL_WARN
|
||||||
|
AppCo2Watch_OnEveryMinute_setLed:
|
||||||
|
cpi r23, APPCO2WATCH_LEVEL_OK
|
||||||
|
breq AppCo2Watch_OnEveryMinute_setGreen
|
||||||
|
cpi r23, APPCO2WATCH_LEVEL_WARN
|
||||||
|
breq AppCo2Watch_OnEveryMinute_setYellow
|
||||||
|
cpi r23, APPCO2WATCH_LEVEL_CRIT
|
||||||
|
breq AppCo2Watch_OnEveryMinute_setRed
|
||||||
|
AppCo2Watch_OnEveryMinute_setGreen:
|
||||||
|
rcall appCo2WatchLed2Off
|
||||||
|
rcall appCo2WatchLed3Off
|
||||||
|
rjmp AppCo2Watch_OnEveryMinute_ret
|
||||||
|
AppCo2Watch_OnEveryMinute_setYellow:
|
||||||
|
rcall appCo2WatchLed2On
|
||||||
|
rcall appCo2WatchLed3Off
|
||||||
|
rjmp AppCo2Watch_OnEveryMinute_ret
|
||||||
|
AppCo2Watch_OnEveryMinute_setRed:
|
||||||
|
rcall appCo2WatchLed2Off
|
||||||
|
rcall appCo2WatchLed3On
|
||||||
|
AppCo2Watch_OnEveryMinute_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
appCo2WatchLed2On:
|
||||||
|
ldi r18, APPCO2WATCH_LED_ONTIME
|
||||||
|
ldi r19, APPCO2WATCH_LED_OFFTIME
|
||||||
|
clr r20
|
||||||
|
bigjmp Led2_SetTiming
|
||||||
|
|
||||||
|
appCo2WatchLed2Off:
|
||||||
|
clr r18
|
||||||
|
clr r19
|
||||||
|
clr r20
|
||||||
|
bigjmp Led2_SetTiming
|
||||||
|
|
||||||
|
appCo2WatchLed3On:
|
||||||
|
ldi r18, APPCO2WATCH_LED_ONTIME
|
||||||
|
ldi r19, APPCO2WATCH_LED_OFFTIME
|
||||||
|
clr r20
|
||||||
|
bigjmp Led3_SetTiming
|
||||||
|
|
||||||
|
appCo2WatchLed3Off:
|
||||||
|
clr r18
|
||||||
|
clr r19
|
||||||
|
clr r20
|
||||||
|
bigjmp Led3_SetTiming
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -108,8 +108,8 @@ appDoorSendValue_send:
|
|||||||
ldi r17, VALUE_ID_TCRT1K ; VALUE ID
|
ldi r17, VALUE_ID_TCRT1K ; VALUE ID
|
||||||
ldi r22, AQHOME_VALUETYPE_DOOR ; VALUE TYPE
|
ldi r22, AQHOME_VALUETYPE_DOOR ; VALUE TYPE
|
||||||
rcall Main_Send8BitValueReport
|
rcall Main_Send8BitValueReport
|
||||||
#ifdef MODULES_LED_ACTIVITY
|
#ifdef MODULES_LED1
|
||||||
rcall LedActivity_Trigger ; (r16)
|
rcall Led1_SetActivityTiming ; (r16)
|
||||||
#endif
|
#endif
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|||||||
3
avr/apps/fan_control/README
Normal file
3
avr/apps/fan_control/README
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
# use MOTION (7) value from node 18
|
||||||
|
aqhome-tool setdata -N nodes/a5502228/FANCTL_TRIGGER1_SOURCE -v 0:0:7:18
|
||||||
35
avr/apps/fan_control/defs.asm
Normal file
35
avr/apps/fan_control/defs.asm
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_FAN_CONTROL_DEFS_ASM
|
||||||
|
#define AQH_AVR_APPS_FAN_CONTROL_DEFS_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_FANCONTROL_STEPS = 5
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_FANCONTROL_FLASH_OFFS_BEGIN = TCA_FLASH_SIZE
|
||||||
|
.equ APP_FANCONTROL_FLASH_OFFS_STEPTABLE = APP_FANCONTROL_FLASH_OFFS_BEGIN+0
|
||||||
|
.equ APP_FANCONTROL_FLASH_SIZE = APP_FANCONTROL_FLASH_OFFS_STEPTABLE+(APP_FANCONTROL_STEPS*3)
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_FANCONTROL_RAM_OFFS_BEGIN = TCA_RAM_SIZE
|
||||||
|
.equ APP_FANCONTROL_RAM_OFFS_VALUE_LO = APP_FANCONTROL_RAM_OFFS_BEGIN+0
|
||||||
|
.equ APP_FANCONTROL_RAM_OFFS_VALUE_HI = APP_FANCONTROL_RAM_OFFS_BEGIN+1
|
||||||
|
.equ APP_FANCONTROL_RAM_SIZE = APP_FANCONTROL_RAM_OFFS_BEGIN+2
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_FANCONTROL_EE_OFFS_BEGIN = TCA_EE_SIZE
|
||||||
|
.equ APP_FANCONTROL_EE_OFFS_VALUE_LO = APP_FANCONTROL_EE_OFFS_BEGIN+0
|
||||||
|
.equ APP_FANCONTROL_EE_OFFS_VALUE_HI = APP_FANCONTROL_EE_OFFS_BEGIN+1
|
||||||
|
.equ APP_FANCONTROL_EE_SIZE = APP_FANCONTROL_EE_OFFS_BEGIN+2
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
282
avr/apps/fan_control/main.asm
Normal file
282
avr/apps/fan_control/main.asm
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_FAN_CONTROL_MAIN_ASM
|
||||||
|
#define AQH_AVR_APPS_FAN_CONTROL_MAIN_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_FANCONTROL_TEMP_LIMIT = 2400
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppFanControl_Init
|
||||||
|
|
||||||
|
AppFanControl_Init:
|
||||||
|
ldi zl, LOW(appFanControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appFanControlObjectFlash*2)
|
||||||
|
|
||||||
|
; preset RAM
|
||||||
|
lpm xl, Z+
|
||||||
|
lpm xh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
clr r16
|
||||||
|
ldi r17,TCA_RAM_SIZE
|
||||||
|
bigcall Utils_FillSram
|
||||||
|
|
||||||
|
; init base class
|
||||||
|
bigcall TCA_Init
|
||||||
|
|
||||||
|
; preset source limits (low=1, high=65535)
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
ldi r16, 1
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
ldi r16, 0xff
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_HI), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_HI), r16
|
||||||
|
|
||||||
|
; preset guard limits (low=24.0 Grad, high=65535)
|
||||||
|
ldi r16, LOW(APP_FANCONTROL_TEMP_LIMIT)
|
||||||
|
ldi r17, HIGH(APP_FANCONTROL_TEMP_LIMIT)
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_HI), r17
|
||||||
|
ldi r16, 0xff
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_HI), r16
|
||||||
|
|
||||||
|
; ldi r16, 2
|
||||||
|
ldi r16, 1
|
||||||
|
std Y+HTIM_RAM_OFFS_MODE, r16
|
||||||
|
|
||||||
|
; setup from eeprom
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
rcall appFanControlReadEeprom
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
|
||||||
|
; start in given mode
|
||||||
|
rcall appFanControlUpdate
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppFanControl_OnEveryTick @global
|
||||||
|
|
||||||
|
AppFanControl_OnEveryTick:
|
||||||
|
ldi zl, LOW(appFanControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appFanControlObjectFlash*2)
|
||||||
|
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
|
||||||
|
bigcall TCA_OnEveryTick
|
||||||
|
|
||||||
|
; check update flag
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
sbrs r16, TCA_FLAGBIT_UPDATED
|
||||||
|
rjmp AppFanControl_OnEveryTick_ret ; jump if clear (value unchanged)
|
||||||
|
; value updated
|
||||||
|
cbr r16, (1<<TCA_FLAGBIT_UPDATED) ; clear update bit
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
rcall appFanControlWriteEeprom
|
||||||
|
rcall appFanControlUpdate
|
||||||
|
AppFanControl_OnEveryTick_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlUpdate
|
||||||
|
|
||||||
|
appFanControlUpdate:
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
ldd r17, Y+HTIM_RAM_OFFS_MODE
|
||||||
|
cpi r17, 2 ; auto?
|
||||||
|
breq appFanControlUpdate_auto
|
||||||
|
; non-auto
|
||||||
|
cbr r16, (1<<HTIM_FLAGBIT_ACTIVE) | (1<<HTIM_FLAGBIT_ACTORENABLED) ; disable timer
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
cpi r17, 1 ; on?
|
||||||
|
breq appFanControlUpdate_on
|
||||||
|
rcall appFanControlActorOff
|
||||||
|
rjmp appFanControlUpdate_ret
|
||||||
|
appFanControlUpdate_auto:
|
||||||
|
sbr r16, (1<<HTIM_FLAGBIT_ACTIVE) | (1<<HTIM_FLAGBIT_ACTORENABLED) ; enable timer
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
sbrs r16, HTIM_FLAGBIT_STATE
|
||||||
|
rjmp appFanControlUpdate_ret ; jump if clear (actor is off)
|
||||||
|
rcall appFanControlActorOn
|
||||||
|
rjmp appFanControlUpdate_ret
|
||||||
|
appFanControlUpdate_on:
|
||||||
|
rcall appFanControlActorOn
|
||||||
|
appFanControlUpdate_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlReadEeprom
|
||||||
|
;
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appFanControlReadEeprom:
|
||||||
|
ldi r16, APP_FANCONTROL_EEID
|
||||||
|
bigcall EepromTlv_FindFirst
|
||||||
|
brcc appFanControlReadEeprom_ret
|
||||||
|
|
||||||
|
; let base class read
|
||||||
|
bigcall TCA_ReadEepromAt ; (r16, r17, Y)
|
||||||
|
brcc appFanControlReadEeprom_ret
|
||||||
|
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, APP_FANCONTROL_RAM_OFFS_BEGIN
|
||||||
|
ldi r17, (APP_FANCONTROL_EE_SIZE-APP_FANCONTROL_EE_OFFS_BEGIN)
|
||||||
|
bigcall Eeprom_ReadBytes ; (r16, r17, X, Y)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
appFanControlReadEeprom_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlWriteEeprom
|
||||||
|
;
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appFanControlWriteEeprom:
|
||||||
|
ldi r16, APP_FANCONTROL_EEID
|
||||||
|
bigcall EepromTlv_FindFirst
|
||||||
|
brcs appFanControlWriteEeprom_write
|
||||||
|
; create eeprom TLV
|
||||||
|
ldi r16, APP_FANCONTROL_EEID
|
||||||
|
ldi r17, APP_FANCONTROL_EE_SIZE
|
||||||
|
bigcall EepromTlv_AddTlv
|
||||||
|
brcc appFanControlWriteEeprom_ret
|
||||||
|
appFanControlWriteEeprom_write:
|
||||||
|
; let base class write
|
||||||
|
bigcall TCA_WriteEepromAt
|
||||||
|
brcc appFanControlWriteEeprom_ret
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, APP_FANCONTROL_RAM_OFFS_BEGIN
|
||||||
|
ldi r17, (APP_FANCONTROL_EE_SIZE-APP_FANCONTROL_EE_OFFS_BEGIN)
|
||||||
|
bigcall Eeprom_WriteBytes ; (r16, r17, r18, X, Y)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
appFanControlWriteEeprom_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlActorOn
|
||||||
|
; @param Z pointer to timer data in FLASH (byte address for lpm!)
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appFanControlActorOn:
|
||||||
|
ldd r16, Y+APP_FANCONTROL_RAM_OFFS_VALUE_LO
|
||||||
|
rcall appFanControlSetFanDutyFromTable
|
||||||
|
bigcall AppFanControl_ReportState
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlActorOff
|
||||||
|
;
|
||||||
|
; @param Z pointer to timer data in FLASH (byte address for lpm!)
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appFanControlActorOff:
|
||||||
|
clr r16
|
||||||
|
rcall appFanControlSetFanDutyFromTable
|
||||||
|
bigcall AppFanControl_ReportState
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlSetFanDutyFromTable
|
||||||
|
|
||||||
|
; @param r16 step value
|
||||||
|
|
||||||
|
appFanControlSetFanDutyFromTable:
|
||||||
|
cpi r16, APP_FANCONTROL_STEPS
|
||||||
|
brcs appFanControlSetFanDutyFromTable_getValue
|
||||||
|
ldi r16, APP_FANCONTROL_STEPS-1
|
||||||
|
appFanControlSetFanDutyFromTable_getValue:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
adiw zh:zl, APP_FANCONTROL_FLASH_OFFS_STEPTABLE
|
||||||
|
clr r17
|
||||||
|
add zl, r16 ; 3 entries per step
|
||||||
|
adc zh, r17
|
||||||
|
add zl, r16
|
||||||
|
adc zh, r17
|
||||||
|
add zl, r16
|
||||||
|
adc zh, r17
|
||||||
|
lpm r16, Z+
|
||||||
|
bigcall MultiFan_SetFan1Duty
|
||||||
|
lpm r16, Z+
|
||||||
|
bigcall MultiFan_SetFan2Duty
|
||||||
|
lpm r16, Z+
|
||||||
|
bigcall MultiFan_SetFan3Duty
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
appFanControlObjectFlash:
|
||||||
|
.dw appFanControlObjectRam ; HTIM_FLASH_OFFS_RAMPTR
|
||||||
|
.dw appFanControlActorOn ; HTIM_FLASH_OFFS_ON_PTR
|
||||||
|
.dw appFanControlActorOff ; HTIM_FLASH_OFFS_OFF_PTR
|
||||||
|
.dw (5*60*10) ; HTIM_FLASH_OFFS_RELOADVAL
|
||||||
|
.db 0, 0, 0, 20, 20, 20, 40, 40, 40, 70, 70, 70, 100, 100, 100, 0 ; speed table for 5 steps
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.dseg
|
||||||
|
|
||||||
|
|
||||||
|
appFanControlObjectRam:
|
||||||
|
.byte APP_FANCONTROL_RAM_SIZE
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
77
avr/apps/fan_control/recv.asm
Normal file
77
avr/apps/fan_control/recv.asm
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_FAN_CONTROL_RECV_ASM
|
||||||
|
#define AQH_AVR_APPS_FAN_CONTROL_RECV_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppMotionLight_OnPacketReceived @global
|
||||||
|
;
|
||||||
|
; @clobbers any, -X
|
||||||
|
|
||||||
|
AppFanControl_OnPacketReceived:
|
||||||
|
ldi zl, LOW(appFanControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appFanControlObjectFlash*2)
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
ldi zl, LOW(appFanControlMsgTable*2)
|
||||||
|
ldi zh, HIGH(appFanControlMsgTable*2)
|
||||||
|
bigcall Main_HandleValueMsg
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
AppFanControl_OnPacketReceived_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appFanControlSetValue
|
||||||
|
;
|
||||||
|
; @clobbers any, -X
|
||||||
|
|
||||||
|
appFanControlSetValue:
|
||||||
|
std Y+APP_FANCONTROL_RAM_OFFS_VALUE_LO, r18
|
||||||
|
std Y+APP_FANCONTROL_RAM_OFFS_VALUE_HI, r19
|
||||||
|
bigjmp TCA_SetValueACK
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
appFanControlMsgTable:
|
||||||
|
.db NETMSG_CMD_VALUE_REPORT, 0, LOW(TCA_HandleMsg), HIGH(TCA_HandleMsg)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_GUARDSRC, LOW(TCA_SetValue_GuardSrc), HIGH(TCA_SetValue_GuardSrc)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_GUARDLIM, LOW(TCA_SetValue_GuardLimits), HIGH(TCA_SetValue_GuardLimits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_TRIGGER1SRC, LOW(TCA_SetValue_Trigger1Src), HIGH(TCA_SetValue_Trigger1Src)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_TRIGGER1LIM, LOW(TCA_SetValue_Trigger1Limits), HIGH(TCA_SetValue_Trigger1Limits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_TRIGGER2SRC, LOW(TCA_SetValue_Trigger2Src), HIGH(TCA_SetValue_Trigger2Src)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_TRIGGER2LIM, LOW(TCA_SetValue_Trigger2Limits), HIGH(TCA_SetValue_Trigger2Limits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_HOLDTIME, LOW(TCA_SetValue_HoldTime), HIGH(TCA_SetValue_HoldTime)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_MODE, LOW(TCA_SetValue_Mode), HIGH(TCA_SetValue_Mode)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_FANCTRL_VALUE, LOW(appFanControlSetValue), HIGH(appFanControlSetValue)
|
||||||
|
.db 0, 0, 0, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
53
avr/apps/fan_control/send.asm
Normal file
53
avr/apps/fan_control/send.asm
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_FAN_CONTROL_SEND_ASM
|
||||||
|
#define AQH_AVR_APPS_FAN_CONTROL_SEND_ASM
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppFanControl_ReportState
|
||||||
|
;
|
||||||
|
; @clobbers R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, X
|
||||||
|
|
||||||
|
AppFanControl_ReportState:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldi zl, LOW(appFanControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appFanControlObjectFlash*2)
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
clr r18
|
||||||
|
sbrc r16, HTIM_FLAGBIT_STATE
|
||||||
|
inc r18
|
||||||
|
ldi r17, VALUE_ID_FANCTRL_STATE
|
||||||
|
clr r19
|
||||||
|
ldi r20, 1
|
||||||
|
clr r21
|
||||||
|
ldi r22, AQHOME_VALUETYPE_ONOFF
|
||||||
|
rcall Main_SendValueReport ; (R16, R17, R18, R19, R20, R21, R23, R24, R25, X)
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
15
avr/apps/light_control/0BUILD
Normal file
15
avr/apps/light_control/0BUILD
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<subdirs>
|
||||||
|
</subdirs>
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
main.asm
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
|
|
||||||
40
avr/apps/light_control/defs.asm
Normal file
40
avr/apps/light_control/defs.asm
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_LIGHT_CONTROL_DEFS_ASM
|
||||||
|
#define AQH_AVR_APPS_LIGHT_CONTROL_DEFS_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_LIGHTCONTROL_FLASH_OFFS_BEGIN = TCA_FLASH_SIZE
|
||||||
|
.equ APP_LIGHTCONTROL_FLASH_SIZE = APP_LIGHTCONTROL_FLASH_OFFS_BEGIN+0
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_BEGIN = TCA_RAM_SIZE
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_VALUE_RED = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+0
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_VALUE_GREEN = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+1
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_VALUE_BLUE = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+2
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_VALUE_WHITE = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+3
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_LO = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+4
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_HI = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+5
|
||||||
|
.equ APP_LIGHTCONTROL_RAM_SIZE = APP_LIGHTCONTROL_RAM_OFFS_BEGIN+6
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_BEGIN = TCA_EE_SIZE
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_VALUE_RED = APP_LIGHTCONTROL_EE_OFFS_BEGIN+0
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_VALUE_GREEN = APP_LIGHTCONTROL_EE_OFFS_BEGIN+1
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_VALUE_BLUE = APP_LIGHTCONTROL_EE_OFFS_BEGIN+2
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_VALUE_WHITE = APP_LIGHTCONTROL_EE_OFFS_BEGIN+3
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_LEDCOUNT_LO = APP_LIGHTCONTROL_EE_OFFS_BEGIN+4
|
||||||
|
.equ APP_LIGHTCONTROL_EE_OFFS_LEDCOUNT_HI = APP_LIGHTCONTROL_EE_OFFS_BEGIN+5
|
||||||
|
.equ APP_LIGHTCONTROL_EE_SIZE = APP_LIGHTCONTROL_EE_OFFS_BEGIN+6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
294
avr/apps/light_control/main.asm
Normal file
294
avr/apps/light_control/main.asm
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_LIGHT_CONTROL_MAIN_ASM
|
||||||
|
#define AQH_AVR_APPS_LIGHT_CONTROL_MAIN_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_LIGHTCONTROL_LIGHT_LIMIT = 20
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppLightControl_Init
|
||||||
|
|
||||||
|
AppLightControl_Init:
|
||||||
|
ldi zl, LOW(appLightControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appLightControlObjectFlash*2)
|
||||||
|
|
||||||
|
; preset RAM
|
||||||
|
lpm xl, Z+
|
||||||
|
lpm xh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
clr r16
|
||||||
|
ldi r17,TCA_RAM_SIZE
|
||||||
|
bigcall Utils_FillSram
|
||||||
|
|
||||||
|
; init base class
|
||||||
|
bigcall TCA_Init
|
||||||
|
|
||||||
|
; preset source limits (low=1, high=65535)
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
ldi r16, 1
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
ldi r16, 0xff
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_HI), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_HI), r16
|
||||||
|
|
||||||
|
; preset guard limits
|
||||||
|
clr r16
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_HI), r16
|
||||||
|
ldi r16, LOW(APP_LIGHTCONTROL_LIGHT_LIMIT)
|
||||||
|
ldi r17, HIGH(APP_LIGHTCONTROL_LIGHT_LIMIT)
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_LO), r16
|
||||||
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_HI), r17
|
||||||
|
|
||||||
|
clr r16
|
||||||
|
std Y+HTIM_RAM_OFFS_MODE, r16
|
||||||
|
|
||||||
|
; set default color to white
|
||||||
|
clr r16
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_RED, r16
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_GREEN, r16
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_BLUE, r16
|
||||||
|
ldi r16, 32
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_WHITE, r16
|
||||||
|
|
||||||
|
ldi r16, 144
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_LO, r16
|
||||||
|
clr r16
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_HI, r16
|
||||||
|
|
||||||
|
; setup from eeprom
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
rcall appLightControlReadEeprom
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
|
||||||
|
; start in given mode
|
||||||
|
rcall appLightControlUpdate
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppLightControl_OnEveryTick @global
|
||||||
|
|
||||||
|
AppLightControl_OnEveryTick:
|
||||||
|
ldi zl, LOW(appLightControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appLightControlObjectFlash*2)
|
||||||
|
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
|
||||||
|
bigcall TCA_OnEveryTick
|
||||||
|
|
||||||
|
; check update flag
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
sbrs r16, TCA_FLAGBIT_UPDATED
|
||||||
|
rjmp AppLightControl_OnEveryTick_ret ; jump if clear (value unchanged)
|
||||||
|
; value updated
|
||||||
|
cbr r16, (1<<TCA_FLAGBIT_UPDATED) ; clear update bit
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
rcall appLightControlWriteEeprom
|
||||||
|
rcall appLightControlUpdate
|
||||||
|
AppLightControl_OnEveryTick_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlUpdate
|
||||||
|
|
||||||
|
appLightControlUpdate:
|
||||||
|
ldd r18, Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_LO
|
||||||
|
ldd r19, Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_HI
|
||||||
|
bigcall SK6812_SetLedNum ; (none)
|
||||||
|
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
ldd r17, Y+HTIM_RAM_OFFS_MODE
|
||||||
|
cpi r17, 2 ; auto?
|
||||||
|
breq appLightControlUpdate_auto
|
||||||
|
; non-auto
|
||||||
|
cbr r16, (1<<HTIM_FLAGBIT_ACTIVE) | (1<<HTIM_FLAGBIT_ACTORENABLED) ; disable timer
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
cpi r17, 1 ; on?
|
||||||
|
breq appLightControlUpdate_on
|
||||||
|
rcall appLightControlActorOff
|
||||||
|
rjmp appLightControlUpdate_ret
|
||||||
|
appLightControlUpdate_auto:
|
||||||
|
sbr r16, (1<<HTIM_FLAGBIT_ACTIVE) | (1<<HTIM_FLAGBIT_ACTORENABLED) ; enable timer
|
||||||
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
||||||
|
bigcall HTIM_Trigger
|
||||||
|
; sbrs r16, HTIM_FLAGBIT_STATE
|
||||||
|
; rjmp appLightControlUpdate_ret ; jump if clear (actor is off)
|
||||||
|
; rcall appLightControlActorOn
|
||||||
|
rjmp appLightControlUpdate_ret
|
||||||
|
appLightControlUpdate_on:
|
||||||
|
rcall appLightControlActorOn
|
||||||
|
appLightControlUpdate_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlReadEeprom
|
||||||
|
;
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appLightControlReadEeprom:
|
||||||
|
ldi r16, APP_LIGHTCONTROL_EEID
|
||||||
|
bigcall EepromTlv_FindFirst
|
||||||
|
brcc appLightControlReadEeprom_ret
|
||||||
|
|
||||||
|
; let base class read
|
||||||
|
bigcall TCA_ReadEepromAt ; (r16, r17, Y)
|
||||||
|
brcc appLightControlReadEeprom_ret
|
||||||
|
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, APP_LIGHTCONTROL_RAM_OFFS_BEGIN
|
||||||
|
ldi r17, (APP_LIGHTCONTROL_EE_SIZE-APP_LIGHTCONTROL_EE_OFFS_BEGIN)
|
||||||
|
bigcall Eeprom_ReadBytes ; (r16, r17, X, Y)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
appLightControlReadEeprom_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlWriteEeprom
|
||||||
|
;
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appLightControlWriteEeprom:
|
||||||
|
ldi r16, APP_LIGHTCONTROL_EEID
|
||||||
|
bigcall EepromTlv_FindFirst ; X=ptr, r17=length (r16, r18)
|
||||||
|
brcs appLightControlWriteEeprom_write
|
||||||
|
; create eeprom TLV
|
||||||
|
ldi r16, APP_LIGHTCONTROL_EEID
|
||||||
|
ldi r17, APP_LIGHTCONTROL_EE_SIZE
|
||||||
|
bigcall EepromTlv_AddTlv ; X=ptr (r16, r20, r21, r18)
|
||||||
|
brcc appLightControlWriteEeprom_ret
|
||||||
|
appLightControlWriteEeprom_write:
|
||||||
|
; let base class write
|
||||||
|
bigcall TCA_WriteEepromAt ;
|
||||||
|
brcc appLightControlWriteEeprom_ret
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
adiw yh:yl, APP_LIGHTCONTROL_RAM_OFFS_BEGIN
|
||||||
|
ldi r17, (APP_LIGHTCONTROL_EE_SIZE-APP_LIGHTCONTROL_EE_OFFS_BEGIN)
|
||||||
|
bigcall Eeprom_WriteBytes ; (r16, r17, r18, X, Y)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
appLightControlWriteEeprom_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlActorOn
|
||||||
|
; @param Z pointer to timer data in FLASH (byte address for lpm!)
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appLightControlActorOn:
|
||||||
|
ldd r18, Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_RED
|
||||||
|
ldd r19, Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_GREEN
|
||||||
|
ldd r20, Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_BLUE
|
||||||
|
ldd r21, Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_WHITE
|
||||||
|
bigcall SK6812_SetRGBW ; (r16, r24, r25)
|
||||||
|
|
||||||
|
bigcall AppLightControl_ReportState
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlActorOff
|
||||||
|
;
|
||||||
|
; @param Z pointer to timer data in FLASH (byte address for lpm!)
|
||||||
|
; @param Y pointer to data in RAM
|
||||||
|
|
||||||
|
appLightControlActorOff:
|
||||||
|
clr r18
|
||||||
|
clr r19
|
||||||
|
clr r20
|
||||||
|
clr r21
|
||||||
|
bigcall SK6812_SetRGBW ; (r16, r24, r25)
|
||||||
|
|
||||||
|
bigcall AppLightControl_ReportState
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
appLightControlDebug:
|
||||||
|
; debug
|
||||||
|
ldi r17, 0xf0
|
||||||
|
ldd r18, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
ldd r19, Y+HTIM_RAM_OFFS_MODE
|
||||||
|
ldd r20, Y+HTIM_RAM_OFFS_CURRVAL_LO
|
||||||
|
ldd r21, Y+HTIM_RAM_OFFS_CURRVAL_HI
|
||||||
|
ldi r22, AQHOME_VALUETYPE_ONOFF
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
rcall Main_SendValueReport ; (R16, R17, R18, R19, R20, R21, R23, R24, R25, X)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
appLightControlObjectFlash:
|
||||||
|
.dw appLightControlObjectRam ; HTIM_FLASH_OFFS_RAMPTR
|
||||||
|
.dw appLightControlActorOn ; HTIM_FLASH_OFFS_ON_PTR
|
||||||
|
.dw appLightControlActorOff ; HTIM_FLASH_OFFS_OFF_PTR
|
||||||
|
.dw (10*60*10) ; HTIM_FLASH_OFFS_RELOADVAL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.dseg
|
||||||
|
|
||||||
|
|
||||||
|
appLightControlObjectRam:
|
||||||
|
.byte APP_LIGHTCONTROL_RAM_SIZE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
88
avr/apps/light_control/recv.asm
Normal file
88
avr/apps/light_control/recv.asm
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_LIGHT_CONTROL_RECV_ASM
|
||||||
|
#define AQH_AVR_APPS_LIGHT_CONTROL_RECV_ASM
|
||||||
|
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppLightControl_OnPacketReceived @global
|
||||||
|
;
|
||||||
|
; @clobbers any, -X
|
||||||
|
|
||||||
|
AppLightControl_OnPacketReceived:
|
||||||
|
ldi zl, LOW(appLightControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appLightControlObjectFlash*2)
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
ldi zl, LOW(appLightControlMsgTable*2)
|
||||||
|
ldi zh, HIGH(appLightControlMsgTable*2)
|
||||||
|
bigcall Main_HandleValueMsg
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
AppLightControl_OnPacketReceived_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlSetValue
|
||||||
|
;
|
||||||
|
; @clobbers any, -X
|
||||||
|
|
||||||
|
appLightControlSetValue:
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_RED, r18
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_GREEN, r19
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_BLUE, r20
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_VALUE_WHITE, r21
|
||||||
|
bigjmp TCA_SetValueACK
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine appLightControlSetNumLeds
|
||||||
|
;
|
||||||
|
; @clobbers any, -X
|
||||||
|
|
||||||
|
appLightControlSetNumLeds:
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_LO, r18
|
||||||
|
std Y+APP_LIGHTCONTROL_RAM_OFFS_LEDCOUNT_HI, r19
|
||||||
|
bigjmp TCA_SetValueACK
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
appLightControlMsgTable:
|
||||||
|
.db NETMSG_CMD_VALUE_REPORT, 0, LOW(TCA_HandleMsg), HIGH(TCA_HandleMsg)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_GUARDSRC, LOW(TCA_SetValue_GuardSrc), HIGH(TCA_SetValue_GuardSrc)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_GUARDLIM, LOW(TCA_SetValue_GuardLimits), HIGH(TCA_SetValue_GuardLimits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_TRIGGER1SRC, LOW(TCA_SetValue_Trigger1Src), HIGH(TCA_SetValue_Trigger1Src)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_TRIGGER1LIM, LOW(TCA_SetValue_Trigger1Limits), HIGH(TCA_SetValue_Trigger1Limits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_TRIGGER2SRC, LOW(TCA_SetValue_Trigger2Src), HIGH(TCA_SetValue_Trigger2Src)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_TRIGGER2LIM, LOW(TCA_SetValue_Trigger2Limits), HIGH(TCA_SetValue_Trigger2Limits)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_HOLDTIME, LOW(TCA_SetValue_HoldTime), HIGH(TCA_SetValue_HoldTime)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_MODE, LOW(TCA_SetValue_Mode), HIGH(TCA_SetValue_Mode)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_VALUE, LOW(appLightControlSetValue), HIGH(appLightControlSetValue)
|
||||||
|
.db NETMSG_CMD_VALUE_SET, VALUE_ID_LIGHTCTRL_NUMLEDS, LOW(appLightControlSetNumLeds), HIGH(appLightControlSetNumLeds)
|
||||||
|
.db 0, 0, 0, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
53
avr/apps/light_control/send.asm
Normal file
53
avr/apps/light_control/send.asm
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
|
; email : martin@libchipcard.de
|
||||||
|
;
|
||||||
|
; ***************************************************************************
|
||||||
|
; * This file is part of the project "AqHome". *
|
||||||
|
; * Please see toplevel file COPYING of that project for license details. *
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
#ifndef AQH_AVR_APPS_LIGHT_CONTROL_SEND_ASM
|
||||||
|
#define AQH_AVR_APPS_LIGHT_CONTROL_SEND_ASM
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine AppLightControl_ReportState
|
||||||
|
;
|
||||||
|
; @clobbers R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, X
|
||||||
|
|
||||||
|
AppLightControl_ReportState:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldi zl, LOW(appLightControlObjectFlash*2)
|
||||||
|
ldi zh, HIGH(appLightControlObjectFlash*2)
|
||||||
|
lpm yl, Z+
|
||||||
|
lpm yh, Z
|
||||||
|
sbiw zh:zl, 1
|
||||||
|
|
||||||
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
||||||
|
clr r18
|
||||||
|
sbrc r16, HTIM_FLAGBIT_STATE
|
||||||
|
inc r18
|
||||||
|
ldi r17, VALUE_ID_LIGHTCONTROL_STATE
|
||||||
|
clr r19
|
||||||
|
ldi r20, 1
|
||||||
|
clr r21
|
||||||
|
ldi r22, AQHOME_VALUETYPE_ONOFF
|
||||||
|
rcall Main_SendValueReport ; (R16, R17, R18, R19, R20, R21, R23, R24, R25, X)
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
; copyright : (C) 2025 by Martin Preuss
|
; copyright : (C) 2026 by Martin Preuss
|
||||||
; email : martin@libchipcard.de
|
; email : martin@libchipcard.de
|
||||||
;
|
;
|
||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
@@ -16,10 +16,12 @@
|
|||||||
|
|
||||||
|
|
||||||
appMotionLightDataBegin:
|
appMotionLightDataBegin:
|
||||||
appMotionLightSources: .byte APP_MOTIONLIGHT_SOURCE_NUM*APP_MOTIONLIGHT_SOURCE_SIZE
|
appMotionLightSettings:
|
||||||
appMotionLightLSourceAddr: .byte 1
|
appMotionLightOnTime: .byte 2
|
||||||
appMotionLightLSourceValueId: .byte 1
|
appMotionLightMSources: .byte APP_MOTIONLIGHT_SOURCE_NUM*APP_MOTIONLIGHT_SOURCE_SIZE
|
||||||
|
appMotionLightLSource: .byte APP_MOTIONLIGHT_SOURCE_SIZE
|
||||||
appMotionLightLSourceValue: .byte 2
|
appMotionLightLSourceValue: .byte 2
|
||||||
|
|
||||||
appMotionLightLastBrightness: .byte 2
|
appMotionLightLastBrightness: .byte 2
|
||||||
appMotionLightFlags: .byte 1
|
appMotionLightFlags: .byte 1
|
||||||
appMotionLightDataEnd:
|
appMotionLightDataEnd:
|
||||||
|
|||||||
@@ -23,3 +23,17 @@
|
|||||||
.equ APP_MOTIONLIGHT_FLAGS_HAVELIGHT = 0x01
|
.equ APP_MOTIONLIGHT_FLAGS_HAVELIGHT = 0x01
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_ONTIME_LO = 0
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_ONTIME_HI = 1
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_MSRC1_ADDR = 2
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_MSRC1_VALUEID = 3
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_MSRC2_ADDR = 4
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_MSRC2_VALUEID = 5
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_BSRC1_ADDR = 6
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_BSRC1_VALUEID = 7
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_BLIMIT_LO = 8
|
||||||
|
.equ APP_MOTIONLIGHT_EE_OFFS_BLIMIT_HI = 9
|
||||||
|
.equ APP_MOTIONLIGHT_EE_SIZE = 10
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user