256 Commits

Author SHA1 Message Date
Martin Preuss
a386ac43ab n32: 2nd iteration of enclosure. 2026-08-12 17:34:58 +02:00
Martin Preuss
2338f5333d reportsensors: report fancontrol state. 2026-08-12 00:07:32 +02:00
Martin Preuss
91880f1cfb added device. 2026-08-12 00:07:06 +02:00
Martin Preuss
1e6a3f06d0 avr: increment firmware version. 2026-08-11 23:48:04 +02:00
Martin Preuss
22e5e7853f reportSensors: increase interval to 3 mins. 2026-08-11 23:47:11 +02:00
Martin Preuss
3018b014bb avr/valsched: only repeat 0 values once. 2026-08-11 23:46:40 +02:00
Martin Preuss
1941b76aa7 avr: increment version. 2026-08-10 19:50:44 +02:00
Martin Preuss
c67fa6ebc9 n14, n25, n30: use new app LightControl instead of old app MA_Light 2026-08-10 19:50:29 +02:00
Martin Preuss
b9f2d9e59a avr: lengthen statistics report interval from 10mins to 30mins. 2026-08-10 19:49:39 +02:00
Martin Preuss
9d9ccbd46c n32:
- start ventilation slits lower (from 3 to 1.5mm) to also remove heat from
  under the pcb
- elevate notwork and power connectors by 2mm
2026-08-10 19:48:48 +02:00
Martin Preuss
568aec9c35 n32: started really working on enclosure. 2026-08-10 19:42:13 +02:00
Martin Preuss
7ad51a251b avr: new version of ds18b20 module.
works better with reportsensor app.
2026-08-07 23:48:15 +02:00
Martin Preuss
dd58bac1a3 avr: removed unneeded code. 2026-08-07 23:47:31 +02:00
Martin Preuss
69a5f40e60 avr: no longer handle REENUM messages (not used, anyway).
needed to get code size down for n30.
2026-08-07 23:46:30 +02:00
Martin Preuss
9c380316d2 avr: fixed a bug (was not setting CFLAG). 2026-08-07 23:45:43 +02:00
Martin Preuss
f973ce1b14 avr: more work on fan- and light controller app and modules. 2026-08-07 23:45:21 +02:00
Martin Preuss
296ead3241 avr: simplified modules. 2026-08-07 01:02:45 +02:00
Martin Preuss
f3820aee22 avr: fully implemented app light_control. 2026-08-07 00:43:42 +02:00
Martin Preuss
7bae2072aa avr: more code sharing. 2026-08-07 00:42:45 +02:00
Martin Preuss
44044e9bba tca: also rename FLAGBIT_UPDATED in TCA module. 2026-08-07 00:42:16 +02:00
Martin Preuss
928ebe1ec7 light_control: started working on new app (replaces ma_light). 2026-08-07 00:41:32 +02:00
Martin Preuss
db53d0d905 fan_control: fixed setting of default mode, moved FLAGBIT_UPDATED to TCA. 2026-08-07 00:39:40 +02:00
Martin Preuss
bbb6c4ac7d avr: start defining generic message with msgRef. 2026-08-06 18:48:05 +02:00
Martin Preuss
273c8d215a n32: remove old defines. 2026-08-06 18:47:21 +02:00
Martin Preuss
e7f9bea979 avr: move check for activated actor to htimCallActorOn 2026-08-06 18:47:03 +02:00
Martin Preuss
3155c499ed avr: enable guard source and 2nd trigger source. 2026-08-06 00:10:45 +02:00
Martin Preuss
1477293b49 avr: more comments, minor reformatting. 2026-08-06 00:09:59 +02:00
Martin Preuss
5bf067166e avr: fixed apidoc. 2026-08-06 00:09:21 +02:00
Martin Preuss
a2da503e7d avr: minor formatting. 2026-08-06 00:09:03 +02:00
Martin Preuss
fe1937c9cd e02, e06: added hardware category to device info 2026-08-06 00:08:37 +02:00
Martin Preuss
1cdec816f6 avr: fixed apidoc. 2026-08-06 00:08:09 +02:00
Martin Preuss
b961575906 avr: clarified api doc 2026-08-06 00:07:58 +02:00
Martin Preuss
27bb9d0f7f avr: fixed a typo. 2026-08-06 00:07:32 +02:00
Martin Preuss
80259d39c9 aqhome-tool: preset var. 2026-08-06 00:07:20 +02:00
Martin Preuss
3df7b69c2c aqhome-cgi: handle int values as well 2026-08-06 00:07:02 +02:00
Martin Preuss
e08054bbdf n32: use fan controller app 2026-08-06 00:06:31 +02:00
Martin Preuss
88a66f6822 avr: add complex fan controller app with base classes to be used by other apps as well.
- add modules
  - holdtimer (keep actor running while triggered)
  - triggeraction (connect actor with holdtimer)
- add app fan_controller
  - uses the modules mentioned above to turn on/off fans in connection
    with e.g. motion sensor nodes
2026-08-06 00:05:50 +02:00
Martin Preuss
d8498dceaf avr: add TextSel widget to CWidget. 2026-07-13 23:26:54 +02:00
Martin Preuss
3286d8e1d7 avr: fixed apidoc. 2026-07-13 23:25:12 +02:00
Martin Preuss
f5c530507e avr: more work on list widget. 2026-07-13 23:24:54 +02:00
Martin Preuss
56831ac53d more work on dialog class. 2026-07-13 23:24:32 +02:00
Martin Preuss
0675538258 lcd2: more work on light settings. 2026-07-13 23:23:49 +02:00
Martin Preuss
f81f031e23 Revert "avr: attempt to abstract IO code."
This reverts commit ae2a0f33b0.
2026-07-13 23:23:05 +02:00
Martin Preuss
ae2a0f33b0 avr: attempt to abstract IO code.
doesn't work with avra because of macro argument problems.
2026-07-13 23:22:47 +02:00
Martin Preuss
391c49d647 avr/co2_watch: change LED timing. 2026-07-13 23:21:51 +02:00
Martin Preuss
6a8f4156a5 add device e06. 2026-07-11 18:07:31 +02:00
Martin Preuss
29d18e8732 reportsensors: use table. 2026-07-11 18:06:57 +02:00
Martin Preuss
07db3879a1 n32: minor docu changes 2026-07-06 00:01:30 +02:00
Martin Preuss
f4c60cf428 n32: minor cleanup. 2026-07-05 23:52:07 +02:00
Martin Preuss
657853c1fe avr: minor reformatting. 2026-07-05 23:17:23 +02:00
Martin Preuss
276127e139 avr: removed NET_IFACE_OFFS_LASTPORTVALUE 2026-07-05 23:17:04 +02:00
Martin Preuss
a50c8da388 t03: fixed description. 2026-07-05 23:16:31 +02:00
Martin Preuss
e811cf1a8d n32: run at 8MHz now (1MHz is too slow for counting FAN tacho pulses). 2026-07-05 23:16:13 +02:00
Martin Preuss
bafb9c289a avr: fixed HW code for tn861. 2026-07-05 23:15:31 +02:00
Martin Preuss
a5559770ef avr: more work on MultiFAN module (now works, tested with a single fan). 2026-07-05 23:15:06 +02:00
Martin Preuss
9842d8a2e5 avr: more work on multifan module. 2026-07-05 20:27:28 +02:00
Martin Preuss
4dc2e0143f n32: enable Multifan module. 2026-07-05 20:21:13 +02:00
Martin Preuss
d51112e291 avr: enable module com2w2. 2026-07-05 20:08:02 +02:00
Martin Preuss
d4428128cb decreased flush limit, show received data (debug) 2026-07-05 20:07:34 +02:00
Martin Preuss
23cb3e62dc n32: use com2w2 instead of com2w 2026-07-05 20:07:05 +02:00
Martin Preuss
e6919677b3 n32: improved documentation. 2026-07-05 20:06:26 +02:00
Martin Preuss
db3f88f3af avr: added com2w2 (slightly improved version of com2w).
- move IRQ control to main code (only the main code knows exactly which
  combination of pins is used for com2)
- split one big module into multiple smaller files (easier to maintain)
2026-07-05 20:06:00 +02:00
Martin Preuss
b863e29612 com2w: removed unneeded code. 2026-07-05 20:03:29 +02:00
Martin Preuss
0ba4e879e6 more work on flush code. 2026-06-30 23:31:06 +02:00
Martin Preuss
f23806d884 propagate socket closure up to endpoint. 2026-06-30 23:30:48 +02:00
Martin Preuss
cdb9da2f9e n32: handle SETVALUE requests for fan speeds. 2026-06-29 22:17:29 +02:00
Martin Preuss
7a32f6deb7 avr/network: added field for last port value (should later be moved to com2w specific data). 2026-06-29 22:16:38 +02:00
Martin Preuss
cf2a0daae2 com2w: added routine COM2W_CheckPort
to be used by common pin change interrupt handler in n32
2026-06-29 22:15:58 +02:00
Martin Preuss
cbc3eab164 multiFan: handle SETVALUE messages. 2026-06-29 22:15:15 +02:00
Martin Preuss
183adb192e aqhome: added modality RPM 2026-06-29 22:14:16 +02:00
Martin Preuss
b784f6bb45 avr: added device n32 (FAN controller). 2026-06-29 17:48:02 +02:00
Martin Preuss
3ae542f61b com2w: use inr/outr macros for COM_IRQ_ADDR_CLK
the corresponding register is not inside the lower address space on some
devices (like ATtiny 861).
2026-06-29 17:45:42 +02:00
Martin Preuss
2974303007 avr: started working on MultiFAN module.
PWM basically works.
2026-06-29 17:44:22 +02:00
Martin Preuss
343562f6ca avr: added hw code for ATtiny 861. 2026-06-29 17:42:40 +02:00
Martin Preuss
fc2ef40d50 aqhome-nodes: read device from config file if not given as argument. 2026-06-08 11:23:49 +02:00
Martin Preuss
427d1e08f4 incremented version. 2026-06-01 19:12:18 +02:00
Martin Preuss
8488001f51 avr: removed old includes. 2026-06-01 19:11:52 +02:00
Martin Preuss
85b7b66db6 aqhome: simplified tty setup. 2026-06-01 19:11:15 +02:00
Martin Preuss
bda2a15da9 aqhome-cgi: fixed includes. 2026-06-01 19:10:50 +02:00
Martin Preuss
7ef6a22557 c03: added resources. 2026-06-01 15:58:36 +02:00
Martin Preuss
54ebc5ec69 add device e5. 2026-06-01 15:58:06 +02:00
Martin Preuss
b5c9557671 ipc2: improved flush code in tty object.
we still occasionally see problems with partially flushed serial port
especially when using /dev/ttyACM0.
2026-06-01 15:57:43 +02:00
Martin Preuss
6117ce5cad nodes: improved handling of memstat messages. 2026-06-01 15:56:38 +02:00
Martin Preuss
c262c4a56a aqhome-cgi: use service code from AqCGI. 2026-06-01 15:55:42 +02:00
Martin Preuss
62741e1c16 incremented version. 2026-06-01 15:54:47 +02:00
Martin Preuss
f5ae108756 aqhome-cgi: removed unneeded lines. 2026-05-29 17:22:33 +02:00
Martin Preuss
b8d2fc76eb aqhome-cgi: use AQH_ModService_DenyRequest
this function redirects to the login page and then to the requested page.
2026-05-29 17:22:12 +02:00
Martin Preuss
03db148a3b aqhome-cgi: added some functions for redirection headers. allow vars in static files. 2026-05-29 17:21:11 +02:00
Martin Preuss
5bb50d4187 aqhome-cgi: choose graph params according to modality. 2026-05-29 17:19:19 +02:00
Martin Preuss
62c86285f5 aqhome-cgi: removed unused line. 2026-05-29 17:18:50 +02:00
Martin Preuss
78ea72efe0 aqhome-cgi: add login url. 2026-05-29 17:18:20 +02:00
Martin Preuss
a65e6fbec2 textsel: use index instead of ressource id as value for the widget. 2026-05-23 11:06:39 +02:00
Martin Preuss
776ec7a363 gui: minor reformatting. 2026-05-23 11:06:12 +02:00
Martin Preuss
323122c4c7 c03: use far call 2026-05-23 01:43:34 +02:00
Martin Preuss
a3220d74b1 avr: added List_GetItemAt 2026-05-23 01:43:18 +02:00
Martin Preuss
710162e242 gui: sorted files. started working on TextSel class. 2026-05-23 01:43:04 +02:00
Martin Preuss
4b13f16e05 gui: improved Label class (can now have a suffix to reduce FLASH usage).
- e.g. light1 and light2 can now share the string but have different suffix
- allow for initially empty text
2026-05-23 01:41:58 +02:00
Martin Preuss
15edfd46e4 c03: fixed apidoc. 2026-05-18 17:15:09 +02:00
Martin Preuss
0c42acf76d gui: added image label (image plus text). 2026-05-18 17:14:50 +02:00
Martin Preuss
311741ae64 gui: added Widget_GetRessource 2026-05-18 17:14:17 +02:00
Martin Preuss
4ad55e2c6e gui: minor reformatting. 2026-05-18 17:13:31 +02:00
Martin Preuss
18e1751e14 gui: added missing register setting. 2026-05-18 17:13:03 +02:00
Martin Preuss
b2e5be974e gui: added LONG mode for buttons (handles short and long presses). 2026-05-18 17:12:39 +02:00
Martin Preuss
ed899dbe6f gui: re-enable NetStats window. 2026-05-14 13:45:39 +02:00
Martin Preuss
401cfc9ffb gui: rewrote NetStatWin to use CDIALOG (much more code sharing). 2026-05-14 13:45:13 +02:00
Martin Preuss
0c4a2aace9 gui: use CDialog_GetChildValue 2026-05-14 13:44:25 +02:00
Martin Preuss
73b7699054 avr: add CDialog_GetChildValue/CDialog_SetChildValue (more code sharing). 2026-05-14 13:44:10 +02:00
Martin Preuss
79e7ac47d9 c03: use DIALOG as base class for MenuWin 2026-05-13 20:08:36 +02:00
Martin Preuss
76def6c8dc gui: set WIDGET_FLAGS_VISIBLE_BIT early in Dialog_OnShow 2026-05-13 20:07:45 +02:00
Martin Preuss
a4722bc8f6 gui: fixed a typo. 2026-05-13 20:07:12 +02:00
Martin Preuss
32061554c0 c03: enable climate window. 2026-05-13 00:31:13 +02:00
Martin Preuss
3d14c54df3 gui: adjusted climate window and SensorWatch to latest changes. 2026-05-13 00:30:58 +02:00
Martin Preuss
1b0d36b84d avr: fixed apidoc. 2026-05-13 00:30:26 +02:00
Martin Preuss
313b2c05a1 gui: implemented DlgLightConns_OnCmdLight and DlgLightConns_OnDlgEndLight. 2026-05-11 12:11:33 +02:00
Martin Preuss
d54a259060 gui: adapted ScreenSaver to latest changes. 2026-05-11 11:55:56 +02:00
Martin Preuss
d07f411e51 gui: implement DlgLightConns_OnCmdMotion2 and DlgLightConns_OnDlgEndMotion2 2026-05-11 11:55:16 +02:00
Martin Preuss
b4ac70dbd1 gui: removed unneeded code, use CDialog_DefaultSignalmap as fallback signal map 2026-05-11 11:54:23 +02:00
Martin Preuss
d34062df39 gui: make CDialog a full object with signal map, implement "OnMkContent". 2026-05-11 11:53:37 +02:00
Martin Preuss
b927bfdab6 gui: added dialog signals DIALOG_SIGNAL_MKCONTENT and DIALOG_SIGNAL_RMCONTENT. 2026-05-11 11:52:23 +02:00
Martin Preuss
39b3d4d174 gui: adapt to latest changes.
need to work on other MainWindow derivates next.
2026-05-11 00:42:42 +02:00
Martin Preuss
0ec290e29c gui: allow setting OPTS from r16.
this is used by the caller to specify whether standard dialog buttons are
to be added.
2026-05-11 00:42:05 +02:00
Martin Preuss
fc28a57b05 gui: define signals for dialog class, create to-be-shared code. 2026-05-11 00:41:16 +02:00
Martin Preuss
cd0d74d491 MainWindow: no longer auto-create content widget
will be called later by deriving classes upon SHOW signal to save on
SDRAM.
2026-05-11 00:40:28 +02:00
Martin Preuss
800b6d316e widget: save Z 2026-05-11 00:39:19 +02:00
Martin Preuss
556cbb1d48 c03: temporarily disable c03AppCreateWinClimate 2026-05-10 17:03:34 +02:00
Martin Preuss
85a837d9ef avr: re-enable heapCoalecseUp 2026-05-10 17:03:13 +02:00
Martin Preuss
6787b4f527 avr: use Heap_AllocAndZero 2026-05-10 17:02:53 +02:00
Martin Preuss
455b81d8eb avr: minor formatting. 2026-05-10 17:02:41 +02:00
Martin Preuss
41c947a486 DEBUG: temporarily disable heapCoalecseUp. 2026-05-09 02:03:31 +02:00
Martin Preuss
afc6d3de24 debug: increase frequency of memstats again (now every minute). 2026-05-09 02:03:11 +02:00
Martin Preuss
8e6017a4ad c03: allocate settings. 2026-05-09 02:02:35 +02:00
Martin Preuss
2dec641f04 gui: added comment. 2026-05-09 02:02:08 +02:00
Martin Preuss
184195ba9f gui: fixed apidoc. 2026-05-09 02:01:55 +02:00
Martin Preuss
bb753b6009 gui: comment-out code 2026-05-09 02:01:39 +02:00
Martin Preuss
d55c9b0cb7 gui: fixed some problems. 2026-05-09 02:01:11 +02:00
Martin Preuss
dad807e7ad gui: add routine to destroy objects outside event loop. 2026-05-09 02:00:41 +02:00
Martin Preuss
c165432c1c gui: fixed a bug (missing ret). 2026-05-09 02:00:06 +02:00
Martin Preuss
21b6a992ff gui: fixed ValueLabel to also use WIDGET_VALUE_CURRENTVALUE 2026-05-09 01:59:47 +02:00
Martin Preuss
35a45e5cb2 gui: fixed some bugs.
calling a dialog from another basically works now.
2026-05-09 01:58:38 +02:00
Martin Preuss
941948fc11 Revert "gui, heap: modified how the heap works."
This reverts commit abe0bef99a.
2026-05-08 22:08:58 +02:00
Martin Preuss
abe0bef99a gui, heap: modified how the heap works.
not well enough tested, yet.
2026-05-08 22:08:47 +02:00
Martin Preuss
22b3b14dfb gui: started working on connections page for light settings. 2026-05-08 22:08:06 +02:00
Martin Preuss
f00b7975c0 gui: added ressources. 2026-05-08 22:07:07 +02:00
Martin Preuss
97fd75e3ba c03: fixed calculation of heap size. decrease number of buffers. 2026-05-08 22:06:55 +02:00
Martin Preuss
33c750bb34 minor reformatting. 2026-05-08 22:06:13 +02:00
Martin Preuss
8a4b63422a avr: temporarily increased frequency of memstat messages. 2026-05-08 22:05:53 +02:00
Martin Preuss
781478d2d2 gui: emit signal when dialog button clicked. 2026-05-08 12:31:53 +02:00
Martin Preuss
db97cf9644 gui: removed unused code. 2026-05-08 12:21:55 +02:00
Martin Preuss
d149c5667f gui: more work on dialogs. 2026-05-08 12:20:43 +02:00
Martin Preuss
b0d9c46d87 gui: allow for style setting in parent of configured widgets. 2026-05-08 10:15:46 +02:00
Martin Preuss
d236c9571e c03: fixed overwrite detection. 2026-05-08 10:15:04 +02:00
Martin Preuss
67e084b856 gui: introduced base class for dialogs. 2026-05-08 10:04:25 +02:00
Martin Preuss
c746abcc0f gui: added value WIDGET_VALUE_STYLE 2026-05-08 10:03:51 +02:00
Martin Preuss
c4af86c4f2 c03: added ressources. 2026-05-08 10:03:05 +02:00
Martin Preuss
f154146b14 gui: improved style handling. 2026-05-08 10:02:34 +02:00
Martin Preuss
cc65fb8f0b c03: debug dialog: DlgNodeValueId. 2026-05-08 00:31:49 +02:00
Martin Preuss
245181112a gui: started with dialog NodeValueId
- lets you input a node address and a value id
- needed e.g. for light settings
2026-05-08 00:31:31 +02:00
Martin Preuss
5513878b24 gui: removed CWidget_GetChildBySelector (use OBJ_GetChildBySelector). 2026-05-08 00:30:10 +02:00
Martin Preuss
31dca13123 gui: fixed HSpinner (wasn't propagating values to ValueLabel). 2026-05-08 00:29:26 +02:00
Martin Preuss
d713e774ee gui: added Widget_GetCurrentValue, Widget_GetMinValue, Widget_GetMaxValue 2026-05-08 00:29:00 +02:00
Martin Preuss
c48423b4c1 gui: added OBJ_GetChildBySelector 2026-05-08 00:28:31 +02:00
Martin Preuss
6cb0ecd9ba gui: added some text ressources. 2026-05-08 00:28:07 +02:00
Martin Preuss
80ac3cbebd gui: added DESTROY flag. 2026-05-07 22:10:45 +02:00
Martin Preuss
8c077d2931 gui: more documentation. 2026-05-07 22:10:16 +02:00
Martin Preuss
12a701014a gui: use CWidget. 2026-05-07 22:09:55 +02:00
Martin Preuss
d1c823c11e gui: more generic approach to generating widgets from config. 2026-05-07 22:09:25 +02:00
Martin Preuss
5300e50440 gui: add routine CDialog_CreateWidgets (to be used outside CDIALOG). 2026-05-06 23:57:57 +02:00
Martin Preuss
1c90e66f74 c03: use new CDIALOG class for LightSettings dialog. 2026-05-06 23:44:46 +02:00
Martin Preuss
dfeedecf22 gui: move some value definitions to WIDGET class (need to do the same for VALUE_LABEL!) 2026-05-06 23:44:04 +02:00
Martin Preuss
ce1fd901e7 gui: added configuration-based dialog
creates a dialog with widgets from a configuration stored as sequence of
bytes in flash.
2026-05-06 23:43:15 +02:00
Martin Preuss
5483df48cd c03: test light settings dialog. 2026-05-06 17:17:51 +02:00
Martin Preuss
c7f2206228 c03: added missing include. 2026-05-06 17:17:35 +02:00
Martin Preuss
d50ff7f74f c03: add line to light settings dialog. 2026-05-06 17:17:13 +02:00
Martin Preuss
10496a67ef gui: use TextButtons for HSpinner. 2026-05-06 17:16:50 +02:00
Martin Preuss
44a8acb845 c03: added ressources. 2026-05-06 17:16:17 +02:00
Martin Preuss
538bb48968 gui: added documentation 2026-05-06 17:15:48 +02:00
Martin Preuss
c7de06f812 gui: added textButton 2026-05-06 17:15:28 +02:00
Martin Preuss
957c2ccc71 avr: test keypads. 2026-05-06 00:26:20 +02:00
Martin Preuss
4d57f15dad gui: started working on keypads. 2026-05-06 00:26:08 +02:00
Martin Preuss
0771986b28 e02: no longer autoreset MCP2221. 2026-05-06 00:25:45 +02:00
Martin Preuss
bcbd777b8f ttyObject: still problems recovering from desynced connection.
tcflush doesn't seem to completely flush the os buffers...
2026-05-06 00:25:23 +02:00
Martin Preuss
636d6ce643 gui: fixed a bug. 2026-05-05 21:15:29 +02:00
Martin Preuss
8a41b156aa gui: added routines
- Widget_DrawRect
- Widget_DrawCharAt
- Widget_GetNormalColors
- Widget_GetActivatedColors
2026-05-05 21:15:03 +02:00
Martin Preuss
c059b6aad3 avr: add 8 bit multiplication. 2026-05-05 17:25:50 +02:00
Martin Preuss
43c69ca22e avr: incremented firmware version. 2026-05-04 22:51:33 +02:00
Martin Preuss
f98e591ca8 avr: improved apidoc. 2026-05-04 22:51:20 +02:00
Martin Preuss
596def6e10 avr: added missing build files. 2026-05-04 21:50:26 +02:00
Martin Preuss
3c89a35645 e05: use 23LC512 (RAM) and 25LC256 (EEPROM) via spi_sw. 2026-05-04 21:45:50 +02:00
Martin Preuss
99aae535e7 avr: added modules spi_sw, 23LC512, 25LC256 2026-05-04 21:44:55 +02:00
Martin Preuss
6bc747938b e02: fixed a typo. 2026-05-04 15:01:26 +02:00
Martin Preuss
2e6c846f1e avr: removed more occurrences of MODULES_LED_ACTIVITY 2026-05-04 14:47:35 +02:00
Martin Preuss
d14845db7a t03: adapted to earlier changes. 2026-05-04 14:43:11 +02:00
Martin Preuss
adcca2f306 avr: removed old definitions. 2026-05-04 14:42:48 +02:00
Martin Preuss
44bb477680 avr: fixed definitions to use updated LED module. 2026-05-04 14:35:55 +02:00
Martin Preuss
67d5d1687d avr: updated apps and modules to latest changes. 2026-05-04 14:35:20 +02:00
Martin Preuss
bea424de36 sgp30: fixed apidoc. 2026-05-04 13:59:04 +02:00
Martin Preuss
a9147f911c avr: removed LED, renamed LED_SIMPLE to LED, introduces LED1, LED2, LED3 2026-05-04 13:58:39 +02:00
Martin Preuss
a9a87ab94b avr: added app CO2WATCH 2026-05-04 13:57:09 +02:00
Martin Preuss
10fcb053a0 sk6812: store current state (not used for now). 2026-05-04 10:26:14 +02:00
Martin Preuss
9613157753 added flash instructions for n31. 2026-05-04 10:25:46 +02:00
Martin Preuss
7f28c22f6a improved error handling on msg desync on TTY connections.
just directly flush on error and return to normal operations immediately.
2026-05-04 10:25:29 +02:00
Martin Preuss
47cd79d7aa added debug msg. 2026-05-04 10:24:26 +02:00
Martin Preuss
7543afa7b8 c03: create light settings window. 2026-04-30 00:11:46 +02:00
Martin Preuss
721b06a044 gui: more work on light settings window. 2026-04-30 00:11:19 +02:00
Martin Preuss
db4825f483 gui: fixed lightsettings. 2026-04-30 00:10:56 +02:00
Martin Preuss
5856913b6c gui: use given button mode. 2026-04-30 00:10:30 +02:00
Martin Preuss
8b25922b88 gui: more work on spinner. 2026-04-30 00:10:07 +02:00
Martin Preuss
5767329895 gui: fixed CFLAG return value. 2026-04-30 00:08:22 +02:00
Martin Preuss
7173ea14ac gui: add OBJECT_OPTS_TIMER_BIT to buttons, decrease repeat time. 2026-04-30 00:07:28 +02:00
Martin Preuss
ac832bfefc avr: added ressources. 2026-04-30 00:06:32 +02:00
Martin Preuss
8bd1ceaec2 avr: fixed a bug. 2026-04-28 00:23:48 +02:00
Martin Preuss
6cf572ab44 avr: started woring on hspinner. 2026-04-27 23:31:26 +02:00
Martin Preuss
1a31985c58 avr: minor changes to lightsettings. 2026-04-27 23:31:12 +02:00
Martin Preuss
8b17a63fa1 avr: more work on c03 and gui. 2026-04-27 23:30:49 +02:00
Martin Preuss
3b7317bb0f avr: added EepromTlv_FindNext 2026-04-27 19:16:26 +02:00
Martin Preuss
606404095e avr: add e04 device. 2026-04-27 16:05:32 +02:00
Martin Preuss
f656895198 c03: add boot loader entry to README. 2026-04-27 16:05:19 +02:00
Martin Preuss
c49e794827 minor formatting. 2026-04-27 16:04:53 +02:00
Martin Preuss
59c05d379c aqhome: add and implement a flush function for fd/tty objects. 2026-04-27 16:04:42 +02:00
Martin Preuss
0ac20ba82c aqhome-nodes: send heartbeat message to interface every 2mins.
e02 now expects this message. If for at least 10mins no such msg is
received the USB interface is reset.
2026-04-27 16:01:12 +02:00
Martin Preuss
a0360d5373 avr: re-enable APPS_STATS in n25. 2026-04-27 00:41:07 +02:00
Martin Preuss
9b10e454a9 avr: fixed apidoc. 2026-04-27 00:40:39 +02:00
Martin Preuss
a31f360e3c avr: cleanup e03. 2026-04-27 00:40:26 +02:00
Martin Preuss
5e7c01c100 avr: added e04 and e05. 2026-04-27 00:40:00 +02:00
Martin Preuss
accc7d41a2 avr: added module ds1307. 2026-04-27 00:39:02 +02:00
Martin Preuss
14edff1369 avr: save X in Main_HandleValueMsg 2026-04-27 00:37:30 +02:00
Martin Preuss
6948028284 avr: optimized app MA_LIGHT (from 3295 to 3222 words). 2026-04-26 15:18:38 +02:00
Martin Preuss
c6fdc94a46 avr: minor changes. 2026-04-26 12:48:25 +02:00
Martin Preuss
74e471ef28 avr: guard with precompiler directives. 2026-04-26 12:47:50 +02:00
Martin Preuss
240624c727 avr: added README. 2026-04-26 12:47:14 +02:00
Martin Preuss
abac650427 avr: removed old modules. 2026-04-26 12:47:01 +02:00
Martin Preuss
cacfdaa6e7 n30: removed unneeded code, re-enable stats app. 2026-04-26 12:46:08 +02:00
Martin Preuss
0db8eda08b avr: more work on README. 2026-04-25 20:10:22 +02:00
Martin Preuss
d48745394c avr: add room field. 2026-04-25 20:01:51 +02:00
Martin Preuss
bed8a4afc2 more documentation. 2026-04-25 20:01:26 +02:00
Martin Preuss
93aa9b46c3 avr: more work on gui. 2026-04-21 00:01:15 +02:00
Martin Preuss
8c567c3a87 avr: adapted to latest changes. 2026-04-21 00:00:51 +02:00
Martin Preuss
00bb83ef4e avr: use Heap_AllocAndZero, added OBJ_EmitSignalWithSelector 2026-04-21 00:00:14 +02:00
Martin Preuss
0eeff3634c avr: added Heap_AllocAndZero 2026-04-20 23:59:46 +02:00
Martin Preuss
ea286e68ce avr: minor reformatting. 2026-04-20 23:59:33 +02:00
Martin Preuss
decd2120a4 avr: fixed more typos. 2026-04-20 23:59:16 +02:00
Martin Preuss
49c0088b0d n29: removed unneeded files. 2026-04-20 23:58:31 +02:00
Martin Preuss
71a9df7332 avr: fixed typos 2026-04-20 23:57:41 +02:00
Martin Preuss
abe218e7b0 avr: reorganized common code. 2026-04-20 23:56:52 +02:00
Martin Preuss
2d2105ae00 n30: removed unused value. 2026-04-18 16:17:27 +02:00
Martin Preuss
a995313750 n21, n28: use LED_SIMPLE instead of LED_ACTIVITY.
LED_SIMPLE can now also show activity.
2026-04-18 16:17:07 +02:00
Martin Preuss
23a8439b73 c03: remove unused values. 2026-04-18 16:16:06 +02:00
Martin Preuss
cc3c9dbd57 aqhome-cgi: fixed ids of created roles (now start with 1). 2026-04-18 16:15:42 +02:00
Martin Preuss
e5f9be1bff n29: no longer support sgp30 (is now supported by n31). 2026-04-16 23:45:22 +02:00
Martin Preuss
77484433f7 n29: removed LEDTIMING, SGP30_TVOC and SGP30_CO2 2026-04-16 23:44:57 +02:00
Martin Preuss
26cc4235be c03: added LIGHT value, removed LEDTIMING and BEEPERTIMING 2026-04-16 23:44:26 +02:00
Martin Preuss
7054a42909 avr: added device n31. 2026-04-16 23:43:56 +02:00
Martin Preuss
b643d2bbcc c03: use brightness module and report its values. 2026-04-16 21:28:44 +02:00
Martin Preuss
0c8d812a7a avr: make brightness module ready for ATmega devices. 2026-04-16 21:28:17 +02:00
Martin Preuss
0be8ad101a avr: more documentation. 2026-04-15 00:03:57 +02:00
Martin Preuss
3e78e2cdca avr: fixed a typo. 2026-04-14 23:57:58 +02:00
425 changed files with 21727 additions and 9211 deletions

2
0BUILD
View File

@@ -2,7 +2,7 @@
<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="version">
$(project_vmajor).$(project_vminor).$(project_vpatchlevel)

View File

@@ -51,7 +51,6 @@
<useTargets>
aqhomecgi
aqhcgi_service
aqhome
</useTargets>
@@ -121,7 +120,6 @@
<useTargets>
aqhome
aqhcgi_service
aqhcgi_modules
</useTargets>
@@ -133,7 +131,6 @@
</libraries>
<subdirs>
service
modules
</subdirs>

View File

@@ -38,7 +38,7 @@
*/
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 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)
{
AQH_SERVICE *sv;
AQCGI_SERVICE *sv;
int rv;
sv=AQH_ServiceFiles_new(sPathRuntimeFiles, sBaseUrl);
AQCGI_Service_SetLoginUrl(sv, "/aqhome/login");
rv=_handlePath(sv, rq, sPathStaticFiles);
if (rv<0) {
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;
AQH_MODULE *mParent;
AQH_SESSION *session;
AQCGI_MODULE *mRoot;
AQCGI_MODULE *mParent;
AQCGI_SESSION *session;
const GWEN_STRINGLIST *sl;
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);
if (s && *s) {
if (seNext) {
AQH_MODULE *m;
AQCGI_MODULE *m;
DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last");
m=AQH_ModService_LoadSubModule(mParent, rq, session, s);
if (m==NULL) {
AQH_Session_free(session);
AQH_Module_free(mRoot);
AQCGI_Session_free(session);
AQCGI_Module_free(mRoot);
return GWEN_ERROR_GENERIC;
}
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);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
AQH_Session_free(session);
AQH_Module_free(mRoot);
AQCGI_Session_free(session);
AQCGI_Module_free(mRoot);
return rv;
}
break;
@@ -194,13 +195,13 @@ int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles
se=seNext;
}
AQH_Session_free(session);
AQH_Module_free(mRoot);
AQCGI_Session_free(session);
AQCGI_Module_free(mRoot);
return 0;
}
else {
AQH_Session_free(session);
AQH_Module_free(mRoot);
AQCGI_Session_free(session);
AQCGI_Module_free(mRoot);
return GWEN_ERROR_GENERIC;
}
}
@@ -222,7 +223,7 @@ void logStart()
int _init(const char *sPathRuntimeFiles, const char *sBaseUrl)
{
AQH_SERVICE *sv;
AQCGI_SERVICE *sv;
int rv;
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);
if (rv<0) {
DBG_ERROR(NULL, "Error creating module \"admin\"");
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return rv;
}
rv=AQH_ModAdmModules_Create(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error creating module \"modules\"");
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return rv;
}
rv=AQH_ModAdmUsers_Create(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error creating module \"users\"");
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return rv;
}
rv=AQH_ModDevices_Create(sv);
if (rv<0) {
DBG_ERROR(NULL, "Error creating module \"devices\"");
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return rv;
}
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return 0;
}

View File

@@ -6,6 +6,7 @@
<includes type="c" >
$(gwenhywfar_cflags)
$(aqcgi_cflags)
-I$(topsrcdir)
-I$(topbuilddir)
-I$(topsrcdir)/apps

View File

@@ -6,6 +6,7 @@
<includes type="c" >
$(gwenhywfar_cflags)
$(aqcgi_cflags)
-I$(topsrcdir)
-I$(topbuilddir)
-I$(topsrcdir)/apps

View File

@@ -13,10 +13,11 @@
#include "./madmin.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/common/mmodules.h"
#include "aqhome-cgi/modules/common/musers.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
@@ -37,12 +38,12 @@
* ------------------------------------------------------------------------------------------------
*/
static void _createPermDefList(AQH_MODULE *m);
static void _createRoleList(AQH_MODULE *m);
static void _createPermDefList(AQCGI_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 int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
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_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;
m=AQH_Module_new();
AQH_Module_SetName(m, "admin");
AQH_Module_SetDescr(m, "administration module");
AQH_Module_SetGuestPerms(m, 0);
m=AQCGI_Module_new();
AQCGI_Module_SetName(m, "admin");
AQCGI_Module_SetDescr(m, "administration module");
AQCGI_Module_SetGuestPerms(m, 0);
_createPermDefList(m);
_createRoleList(m);
rv=AQH_Service_AddModule(sv, m);
rv=AQCGI_Service_AddModule(sv, m);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
}
AQH_Module_free(m);
AQCGI_Module_free(m);
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, "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;
int id=0;
AQCGI_ROLE_LIST *roleList;
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++, "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);
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) {
const char *s;
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:".");
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);
return mSub;
}
}
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) {
const char *s;
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:".");
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);
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;
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 (AQH_ModService_GetUserPerms(m) & (AQH_MODADM_PERMS_ADMINUSERS | AQH_MODADM_PERMS_ADMINMODULES))
rv=_handleRqIndex(m, rq, dbuf);
else {
AQCGI_Request_SetResponseCode(rq, 403);
AQCGI_Request_SetResponseText(rq, "Forbidden");
}
else
AQH_ModService_DenyRequest(m, rq, session, dbuf);
}
else {
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) {
uint32_t userPerms;

View File

@@ -20,9 +20,9 @@
#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);

View File

@@ -13,7 +13,7 @@
#include "./mmodules.h"
#include "aqhome-cgi/service/module.h"
#include "aqcgi/service/module.h"
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
@@ -35,33 +35,33 @@
* ------------------------------------------------------------------------------------------------
*/
static void _createPermDefList(AQH_MODULE *m);
static void _createRoleList(AQH_MODULE *m);
static void _createPermDefList(AQCGI_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 int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
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 _handleRqEditModPost(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(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 _handleRqAddRolePost(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(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 _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static int _getHighestUsedRoleId(const AQH_ROLE_LIST *roleList);
static void _handleRqEditRoleGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqEditRolePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
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 _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
static void _writeEditModForm(const AQCGI_MODULE *currentMod, const char *sModName, GWEN_BUFFER *dbuf);
static void _writeRoleListToForm(const AQCGI_ROLE_LIST *roleList,
const char *sModName,
const AQH_PERMDEF_LIST *permDefList,
const AQCGI_PERMDEF_LIST *permDefList,
GWEN_BUFFER *dbuf);
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_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;
m=AQH_Module_new();
AQH_Module_SetName(m, "modules");
AQH_Module_SetDescr(m, "modules administration module");
AQH_Module_SetGuestPerms(m, 0);
m=AQCGI_Module_new();
AQCGI_Module_SetName(m, "modules");
AQCGI_Module_SetDescr(m, "modules administration module");
AQCGI_Module_SetGuestPerms(m, 0);
_createPermDefList(m);
_createRoleList(m);
rv=AQH_Service_AddModule(sv, m);
rv=AQCGI_Service_AddModule(sv, m);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
}
AQH_Module_free(m);
AQCGI_Module_free(m);
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, "ModuleWrite", 0x002, "Modify modules");
AQH_ModService_AddPermDef(permDefList, "ModuleAdd", 0x004, "Add 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;
int id=0;
AQCGI_ROLE_LIST *roleList;
int id=1;
roleList=AQH_Role_List_new();
roleList=AQCGI_Role_List_new();
AQH_ModService_AddRole(roleList, id++, "admin",
AQH_MODADMMODULES_PERMS_MODULESREAD |
AQH_MODADMMODULES_PERMS_MODULESWRITE |
AQH_MODADMMODULES_PERMS_MODULESADD |
AQH_MODADMMODULES_PERMS_MODULESDEL,
"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 */
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);
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;
uint32_t perms;
perms=AQH_ModService_GetUserPerms(m);
sv=AQH_ModService_GetService(m);
slModules=AQH_Service_ListModules(sv);
slModules=AQCGI_Service_ListModules(sv);
if (slModules) {
GWEN_STRINGLISTENTRY *se;
@@ -195,18 +195,18 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
sModName=GWEN_StringListEntry_Data(se);
if (sModName && *sModName) {
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
currentMod=AQH_Service_LoadModule(sv, sModName);
currentMod=AQCGI_Service_LoadModule(sv, sModName);
if (currentMod) {
const char *s;
const char *sName;
sName=AQH_Module_GetName(currentMod);
sName=AQCGI_Module_GetName(currentMod);
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:"");
s=AQH_Module_GetDescr(currentMod);
s=AQCGI_Module_GetDescr(currentMod);
GBAA(dbuf, "<td>%s</td>", s?s:"");
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, "</td>\n");
GBAA(dbuf, "</tr>\n");
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
}
}
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;
const char *sModName;
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
sv=AQH_ModService_GetService(m);
dbQuery=AQCGI_Request_GetDbQuery(rq);
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) {
_writeEditModForm(currentMod, sModName, dbuf);
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
}
else {
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;
const char *sModName;
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
sv=AQH_ModService_GetService(m);
dbPost=AQCGI_Request_GetDbPostBody(rq);
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) {
const char *sNewModName;
const char *sDescr;
int rv;
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);
sDescr=GWEN_DB_GetCharValue(dbPost, "descr", 0, NULL);
perms=AQH_ModService_ReadPermsFromForm(dbPost, permDefList, NULL);
if (sNewModName && *sNewModName)
AQH_Module_SetName(currentMod, sNewModName);
AQH_Module_SetDescr(currentMod, sDescr);
AQH_Module_SetGuestPerms(currentMod, perms);
AQCGI_Module_SetName(currentMod, sNewModName);
AQCGI_Module_SetDescr(currentMod, sDescr);
AQCGI_Module_SetGuestPerms(currentMod, perms);
rv=AQH_Service_SaveModule(sv, currentMod);
rv=AQCGI_Service_SaveModule(sv, currentMod);
if (rv<0) {
GBAS(dbuf, "<h2>Error</h2><p>Error saving module</p>");
DBG_ERROR(NULL, "Could not save module \"%s\"", sModName);
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
return;
}
DBG_ERROR(NULL, "Module \"%s\" saved", sModName);
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
AQCGI_Request_SetResponseCode(rq, 303);
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;
const char *sModName;
AQH_MODULE *currentMod;
const AQH_PERMDEF_LIST *permDefList;
AQCGI_MODULE *currentMod;
const AQCGI_PERMDEF_LIST *permDefList;
uint32_t guestPerms;
sv=AQH_ModService_GetService(m);
dbQuery=AQCGI_Request_GetDbQuery(rq);
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
guestPerms=currentMod?AQH_Module_GetGuestPerms(currentMod):0;
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
guestPerms=currentMod?AQCGI_Module_GetGuestPerms(currentMod):0;
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
if (currentMod) {
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");
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 {
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;
const char *sModName;
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
int newId;
const char *sName;
const char *sDescr;
uint32_t perms;
AQH_PERMDEF_LIST *permDefList;
AQH_ROLE_LIST *roleList;
AQCGI_PERMDEF_LIST *permDefList;
AQCGI_ROLE_LIST *roleList;
int rv;
/* sample data */
@@ -369,9 +369,9 @@ void _handleRqAddRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session
sv=AQH_ModService_GetService(m);
dbPost=AQCGI_Request_GetDbPostBody(rq);
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
/* read role values */
newId=(roleList?_getHighestUsedRoleId(roleList):0)+1;
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) {
AQH_ROLE *role;
AQCGI_ROLE *role;
/* set new values */
role=AQH_Role_new();
AQH_Role_SetId(role, newId);
AQH_Role_SetName(role, sName);
AQH_Role_SetDescr(role, sDescr);
AQH_Role_SetPerms(role, perms);
role=AQCGI_Role_new();
AQCGI_Role_SetId(role, newId);
AQCGI_Role_SetName(role, sName);
AQCGI_Role_SetDescr(role, sDescr);
AQCGI_Role_SetPerms(role, perms);
/* add role */
if (roleList==NULL) {
roleList=AQH_Role_List_new();
AQH_Module_SetRoleList(currentMod, roleList);
roleList=AQCGI_Role_List_new();
AQCGI_Module_SetRoleList(currentMod, roleList);
}
AQH_Role_List_Add(role, roleList);
AQCGI_Role_List_Add(role, roleList);
/* save module */
rv=AQH_Service_SaveModule(sv, currentMod);
rv=AQCGI_Service_SaveModule(sv, currentMod);
if (rv<0) {
GBAS(dbuf, "<p>Error saving module.</p>\n");
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;
}
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
AQCGI_Request_SetResponseCode(rq, 303);
AQCGI_Request_SetResponseText(rq, "See Other");
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
}
else {
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;
const char *sModName;
int id;
const char *sName;
const char *sDescr;
uint32_t perms;
AQH_MODULE *currentMod;
const AQH_PERMDEF_LIST *permDefList;
const AQH_ROLE_LIST *roleList;
const AQH_ROLE *role;
AQCGI_MODULE *currentMod;
const AQCGI_PERMDEF_LIST *permDefList;
const AQCGI_ROLE_LIST *roleList;
const AQCGI_ROLE *role;
sv=AQH_ModService_GetService(m);
dbQuery=AQCGI_Request_GetDbQuery(rq);
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
id=dbQuery?GWEN_DB_GetIntValue(dbQuery, "id", 0, 0):0;
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
role=roleList?AQH_Role_List_GetById(roleList, id):NULL;
sName=role?AQH_Role_GetName(role):NULL;
sDescr=role?AQH_Role_GetDescr(role):NULL;
perms=role?AQH_Role_GetPerms(role):0;
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
role=roleList?AQCGI_Role_List_GetById(roleList, id):NULL;
sName=role?AQCGI_Role_GetName(role):NULL;
sDescr=role?AQCGI_Role_GetDescr(role):NULL;
perms=role?AQCGI_Role_GetPerms(role):0;
if (role) {
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;
const char *sModName;
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
int oldId;
const char *sName;
const char *sDescr;
uint32_t perms;
AQH_PERMDEF_LIST *permDefList;
AQH_ROLE_LIST *roleList;
AQH_ROLE *role;
AQCGI_PERMDEF_LIST *permDefList;
AQCGI_ROLE_LIST *roleList;
AQCGI_ROLE *role;
int rv;
/* sample data */
sv=AQH_ModService_GetService(m);
dbPost=AQCGI_Request_GetDbPostBody(rq);
sModName=dbPost?GWEN_DB_GetCharValue(dbPost, "mod", 0, NULL):NULL;
currentMod=(sModName && *sModName)?AQH_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQH_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
currentMod=(sModName && *sModName)?AQCGI_Service_LoadModule(sv, sModName):NULL;
permDefList=currentMod?AQCGI_Module_GetPermDefList(currentMod):NULL;
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
/* read role data */
oldId=dbPost?GWEN_DB_GetIntValue(dbPost, "oldId", 0, -1):-1;
sName=dbPost?GWEN_DB_GetCharValue(dbPost, "name", 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;
/* validate */
if (!(sName && *sName)) {
@@ -521,23 +521,23 @@ void _handleRqEditRolePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *sessio
if (currentMod) {
/* set new values */
AQH_Role_SetName(role, sName);
AQH_Role_SetDescr(role, sDescr);
AQH_Role_SetPerms(role, perms);
AQCGI_Role_SetName(role, sName);
AQCGI_Role_SetDescr(role, sDescr);
AQCGI_Role_SetPerms(role, perms);
/* save module */
rv=AQH_Service_SaveModule(sv, currentMod);
rv=AQCGI_Service_SaveModule(sv, currentMod);
if (rv<0) {
GBAS(dbuf, "<p>Error saving module.</p>\n");
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;
}
_setLocationHeaderForMod(rq, "editmodule.html", sModName);
AQCGI_Request_SetResponseCode(rq, 303);
AQCGI_Request_SetResponseText(rq, "See Other");
AQH_Module_free(currentMod);
AQCGI_Module_free(currentMod);
}
else {
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;
const char *sModName;
int id;
AQH_MODULE *currentMod;
const AQH_ROLE_LIST *roleList;
AQH_ROLE *role;
AQCGI_MODULE *currentMod;
const AQCGI_ROLE_LIST *roleList;
AQCGI_ROLE *role;
sv=AQH_ModService_GetService(m);
dbQuery=AQCGI_Request_GetDbQuery(rq);
sModName=dbQuery?GWEN_DB_GetCharValue(dbQuery, "mod", 0, NULL):NULL;
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) {
roleList=currentMod?AQH_Module_GetRoleList(currentMod):NULL;
role=roleList?AQH_Role_List_GetById(roleList, id):NULL;
roleList=currentMod?AQCGI_Module_GetRoleList(currentMod):NULL;
role=roleList?AQCGI_Role_List_GetById(roleList, id):NULL;
if (role) {
int rv;
AQH_Role_List_Del(role);
AQH_Role_free(role);
AQCGI_Role_List_Del(role);
AQCGI_Role_free(role);
/* save module */
rv=AQH_Service_SaveModule(sv, currentMod);
rv=AQCGI_Service_SaveModule(sv, currentMod);
if (rv<0) {
GBAS(dbuf, "<p>Error saving module.</p>\n");
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;
}
@@ -588,7 +588,7 @@ void _handleRqDeleteRole(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session,
GBAS(dbuf, "<p>Role not found.</p>\n");
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 {
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;
if (roleList) {
const AQH_ROLE *role;
const AQCGI_ROLE *role;
role=AQH_Role_List_First(roleList);
role=AQCGI_Role_List_First(roleList);
while(role) {
int rid;
rid=AQH_Role_GetId(role);
rid=AQCGI_Role_GetId(role);
id=(rid>id)?rid:id;
role=AQH_Role_List_Next(role);
role=AQCGI_Role_List_Next(role);
}
}
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 *sDescr;
const AQH_PERMDEF_LIST *permDefList;
const AQH_ROLE_LIST *roleList;
const AQCGI_PERMDEF_LIST *permDefList;
const AQCGI_ROLE_LIST *roleList;
permDefList=AQH_Module_GetPermDefList(currentMod);
roleList=AQH_Module_GetRoleList(currentMod);
sName=AQH_Module_GetName(currentMod);
sDescr=AQH_Module_GetDescr(currentMod);
permDefList=AQCGI_Module_GetPermDefList(currentMod);
roleList=AQCGI_Module_GetRoleList(currentMod);
sName=AQCGI_Module_GetName(currentMod);
sDescr=AQCGI_Module_GetDescr(currentMod);
/* write module info */
GBAS(dbuf, "<h2>Module Info</h2>\n");
GBAA(dbuf,
@@ -653,7 +653,7 @@ void _writeEditModForm(const AQH_MODULE *currentMod, const char *sModName, GWEN_
if (permDefList) {
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>");
}
@@ -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 AQH_PERMDEF_LIST *permDefList,
const AQCGI_PERMDEF_LIST *permDefList,
GWEN_BUFFER *dbuf)
{
const AQH_ROLE *role;
const AQCGI_ROLE *role;
GBAS(dbuf,
"<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"
"<tbody>\n");
role=AQH_Role_List_First(roleList);
role=AQCGI_Role_List_First(roleList);
while(role) {
uint8_t id;
const char *s;
GBAS(dbuf, "<tr>");
/* id */
id=AQH_Role_GetId(role);
id=AQCGI_Role_GetId(role);
GBAA(dbuf, "<td>%d</td>", id);
/* name */
s=AQH_Role_GetName(role);
s=AQCGI_Role_GetName(role);
GBAA(dbuf, "<td>%s</td>", s?s:"");
/* permissions */
GBAS(dbuf, "<td>");
if (permDefList)
_writeEnabledPermissions(permDefList, AQH_Role_GetPerms(role), dbuf);
_writeEnabledPermissions(permDefList, AQCGI_Role_GetPerms(role), dbuf);
GBAS(dbuf, "</td>");
/* description */
s=AQH_Role_GetDescr(role);
s=AQCGI_Role_GetDescr(role);
GBAA(dbuf, "<td>%s</td>", s?s:"");
/* actions */
GBAA(dbuf, "<td>");
@@ -711,7 +711,7 @@ void _writeRoleListToForm(const AQH_ROLE_LIST *roleList,
GBAA(dbuf, "</td>");
GBAS(dbuf, "</tr>\n");
role=AQH_Role_List_Next(role);
role=AQCGI_Role_List_Next(role);
}
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) {
const AQH_PERMDEF *permDef;
const AQCGI_PERMDEF *permDef;
permDef=AQH_PermDef_List_First(permDefList);
permDef=AQCGI_PermDef_List_First(permDefList);
while(permDef) {
const char *s;
uint32_t mask;
s=AQH_PermDef_GetId(permDef);
mask=AQH_PermDef_GetMask(permDef);
s=AQCGI_PermDef_GetId(permDef);
mask=AQCGI_PermDef_GetMask(permDef);
if (perms & mask)
GBAA(dbuf, "%s ", s?s:"");
permDef=AQH_PermDef_List_Next(permDef);
permDef=AQCGI_PermDef_List_Next(permDef);
}
}
}

View File

@@ -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);

View File

@@ -13,9 +13,10 @@
#include "./mservice_p.h"
#include "aqhome-cgi/service/module.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/text.h>
#include <string.h>
#include <ctype.h>
@@ -35,7 +36,6 @@
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
#define GBAS GWEN_Buffer_AppendString
#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 _calcUserModPerms(AQH_MODULE *m, const AQH_USER *user);
static uint32_t _calcRolePerms(const AQH_MODULE *m, const AQH_MODULE_PERMS *modPerms);
static void _calcUserModPerms(AQCGI_MODULE *m, const AQCGI_USER *user);
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;
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->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) {
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) {
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) {
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) {
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) {
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) {
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) {
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=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) {
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=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) {
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->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) {
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->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) {
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->addHeaderFn)
xm->addHeaderFn(m, lang, dbuf);
else {
AQH_MODULE *mParent;
AQCGI_MODULE *mParent;
mParent=AQH_Module_Tree2_GetParent(m);
mParent=AQCGI_Module_Tree2_GetParent(m);
if (mParent)
AQH_ModService_AddHeader(mParent, lang, 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) {
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->addFooterFn)
xm->addFooterFn(m, lang, dbuf);
else {
AQH_MODULE *mParent;
AQCGI_MODULE *mParent;
AQH_ModService_ReadStaticFile(m, lang, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
mParent=AQH_Module_Tree2_GetParent(m);
mParent=AQCGI_Module_Tree2_GetParent(m);
if (mParent)
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;
@@ -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) {
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)
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) {
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) {
AQH_MODULE *mReturn;
AQCGI_MODULE *mReturn;
mReturn=xm->loadSubModuleFn(m, rq, session, sModuleName);
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) {
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) {
GWEN_BUFFER *fbuf;
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;
const char *s;
@@ -333,9 +361,9 @@ AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
db=AQCGI_Request_GetDbRequestHeader(rq);
s=GWEN_DB_GetCharValue(db, "cookies/session", 0, NULL);
if (s && *s) {
AQH_SESSION *session;
AQCGI_SESSION *session;
session=AQH_Service_LoadSession(sv, s);
session=AQCGI_Service_LoadSession(sv, s);
if (session==NULL) {
DBG_ERROR(NULL, "Session \"%s\" not found", s);
return NULL;
@@ -344,24 +372,24 @@ AQH_SESSION *AQH_ModService_ReadSession(AQH_MODULE *m, AQCGI_REQUEST *rq)
const char *sUserName;
GWEN_BUFFER *tbuf;
sUserName=AQH_Session_GetUserAlias(session);
sUserName=AQCGI_Session_GetUserAlias(session);
if (sUserName && *sUserName) {
AQH_USER *user;
AQCGI_USER *user;
user=AQH_Service_LoadUser(sv, sUserName);
user=AQCGI_Service_LoadUser(sv, sUserName);
if (user==NULL) {
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
AQH_Session_free(session);
AQCGI_Session_free(session);
return NULL;
}
else {
DBG_ERROR(NULL, "User is \"%s\"", sUserName);
}
AQH_Session_SetUser(session, user);
AQCGI_Session_SetUser(session, user);
}
/* renew session cookie */
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));
DBG_ERROR(NULL, "Renew session cookie");
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);
}
void _calcUserModPerms(AQH_MODULE *m, const AQH_USER *user)
void _calcUserModPerms(AQCGI_MODULE *m, const AQCGI_USER *user)
{
if (m) {
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) {
uint32_t perms=0;
if (user) {
if (AQH_User_GetFlags(user) & AQH_USER_FLAGS_ADMIN)
if (AQCGI_User_GetFlags(user) & AQCGI_USER_FLAGS_ADMIN)
perms=0xffffffff;
else {
const char *sModName;
const AQH_MODULE_PERMS_LIST *modPermsList;
AQH_MODULE_PERMS *modPerms;
const AQCGI_MODULE_PERMS_LIST *modPermsList;
AQCGI_MODULE_PERMS *modPerms;
sModName=AQH_Module_GetName(m);
modPermsList=AQH_User_GetModulePermList(user);
modPerms=(sModName && modPermsList)?AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
sModName=AQCGI_Module_GetName(m);
modPermsList=AQCGI_User_GetModulePermList(user);
modPerms=(sModName && modPermsList)?AQCGI_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
if (modPerms)
perms=_calcRolePerms(m, modPerms);
else
perms=AQH_Module_GetGuestPerms(m);
perms=AQCGI_Module_GetGuestPerms(m);
}
} /* if (user) */
else
perms=AQH_Module_GetGuestPerms(m);
perms=AQCGI_Module_GetGuestPerms(m);
xm->userPerms=perms;
}
} /* 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;
const AQH_ROLE_LIST *roleList;
const AQCGI_ROLE_LIST *roleList;
roleList=AQH_Module_GetRoleList(m);
roleList=AQCGI_Module_GetRoleList(m);
if (roleList) {
int roleArraySize;
int i;
uint32_t explAddPerms=0;
uint32_t explDelPerms=0;
roleArraySize=AQH_ModulePerms_GetRoleArrayArraySize();
roleArraySize=AQCGI_ModulePerms_GetRoleArrayArraySize();
for (i=0; i<roleArraySize; i++) {
int roleId;
roleId=AQH_ModulePerms_GetRoleArrayAt(modPerms, i);
roleId=AQCGI_ModulePerms_GetRoleArrayAt(modPerms, i);
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) {
perms|=AQH_Role_GetPerms(role);
explAddPerms|=AQH_Role_GetExplAddPerms(role);
explAddPerms|=AQH_Role_GetExplDelPerms(role);
perms|=AQCGI_Role_GetPerms(role);
explAddPerms|=AQCGI_Role_GetExplAddPerms(role);
explAddPerms|=AQCGI_Role_GetExplDelPerms(role);
}
}
} /* for */
/* collate permissions */
perms|=explAddPerms;
perms|=AQH_ModulePerms_GetExplAddPerms(modPerms);
perms|=AQCGI_ModulePerms_GetExplAddPerms(modPerms);
perms&=~explDelPerms;
perms&=~AQH_ModulePerms_GetExplDelPerms(modPerms);
perms&=~AQCGI_ModulePerms_GetExplDelPerms(modPerms);
}
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();
AQH_PermDef_SetId(permDef, id);
AQH_PermDef_SetMask(permDef, mask);
AQH_PermDef_SetDescr(permDef, descr);
AQH_PermDef_List_Add(permDef, permDefList);
permDef=AQCGI_PermDef_new();
AQCGI_PermDef_SetId(permDef, id);
AQCGI_PermDef_SetMask(permDef, mask);
AQCGI_PermDef_SetDescr(permDef, descr);
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();
AQH_Role_SetId(role, id);
AQH_Role_SetName(role, name);
AQH_Role_SetPerms(role, perms);
AQH_Role_SetDescr(role, descr);
AQH_Role_List_Add(role, roleList);
role=AQCGI_Role_new();
AQCGI_Role_SetId(role, id);
AQCGI_Role_SetName(role, name);
AQCGI_Role_SetPerms(role, perms);
AQCGI_Role_SetDescr(role, descr);
AQCGI_Role_List_Add(role, roleList);
}
void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
void AQH_ModService_HandleRequestWithTable(AQCGI_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
AQCGI_SESSION *session,
const char *page,
const AQH_MODSERVICE_HANDLER_ENTRY *e)
{
@@ -517,11 +545,8 @@ void AQH_ModService_HandleRequestWithTable(AQH_MODULE *m,
AQCGI_Request_SetResponseText(rq, "Ok");
if ((perms & e[i].perms)==e[i].perms)
(e[i].handlerFn)(m, rq, session, dbuf);
else {
GWEN_Buffer_AppendString(dbuf, "<h1>Error</h1><p>No permissions for this request.</p>");
AQCGI_Request_SetResponseCode(rq, 403);
AQCGI_Request_SetResponseText(rq, "Forbidden");
}
else
AQH_ModService_DenyRequest(m, rq, session, dbuf);
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) {
const AQH_PERMDEF *permDef;
const AQCGI_PERMDEF *permDef;
GWEN_BUFFER *tbuf;
uint32_t pos;
@@ -549,16 +574,16 @@ void AQH_ModService_WritePermsToForm(uint32_t perms, const AQH_PERMDEF_LIST *per
GBAA(tbuf, "%s:", sPrefix);
pos=GWEN_Buffer_GetPos(tbuf);
permDef=AQH_PermDef_List_First(permDefList);
permDef=AQCGI_PermDef_List_First(permDefList);
while(permDef) {
const char *s;
s=AQH_PermDef_GetId(permDef);
s=AQCGI_PermDef_GetId(permDef);
if (s && *s) {
uint32_t mask;
GBAS(tbuf, s);
mask=AQH_PermDef_GetMask(permDef);
mask=AQCGI_PermDef_GetMask(permDef);
if (perms & mask)
GBAA(dbuf, "<input type=\"checkbox\" name=\"%s\" checked>", GWEN_Buffer_GetStart(tbuf));
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:"");
GWEN_Buffer_Crop(tbuf, 0, pos);
}
permDef=AQH_PermDef_List_Next(permDef);
permDef=AQCGI_PermDef_List_Next(permDef);
}
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;
if (permDefList) {
const AQH_PERMDEF *permDef;
const AQCGI_PERMDEF *permDef;
GWEN_BUFFER *tbuf;
uint32_t pos;
@@ -588,23 +613,23 @@ uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDE
GBAA(tbuf, "%s:", sPrefix);
pos=GWEN_Buffer_GetPos(tbuf);
permDef=AQH_PermDef_List_First(permDefList);
permDef=AQCGI_PermDef_List_First(permDefList);
while(permDef) {
const char *id;
id=AQH_PermDef_GetId(permDef);
id=AQCGI_PermDef_GetId(permDef);
if (id && *id) {
uint32_t mask;
const char *s;
GBAS(tbuf, id);
mask=AQH_PermDef_GetMask(permDef);
mask=AQCGI_PermDef_GetMask(permDef);
s=GWEN_DB_GetCharValue(dbPost, GWEN_Buffer_GetStart(tbuf), 0, NULL);
if (s && *s)
result|=mask;
GWEN_Buffer_Crop(tbuf, 0, pos);
}
permDef=AQH_PermDef_List_Next(permDef);
permDef=AQCGI_PermDef_List_Next(permDef);
}
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;
sv=AQH_ModService_GetService(m);
slModuleNames=AQH_Service_ListModules(sv);
slModuleNames=AQCGI_Service_ListModules(sv);
if (slModuleNames) {
AQH_MODULE_LIST *modList;
AQCGI_MODULE_LIST *modList;
GWEN_STRINGLISTENTRY *se;
modList=AQH_Module_List_new();
modList=AQCGI_Module_List_new();
se=GWEN_StringList_FirstEntry(slModuleNames);
while(se) {
const char *sModName;
sModName=GWEN_StringListEntry_Data(se);
if (sModName && *sModName) {
AQH_MODULE *currentMod;
AQCGI_MODULE *currentMod;
currentMod=AQH_Service_LoadModule(sv, sModName);
currentMod=AQCGI_Service_LoadModule(sv, sModName);
if (currentMod)
AQH_Module_List_Add(currentMod, modList);
AQCGI_Module_List_Add(currentMod, modList);
}
se=GWEN_StringListEntry_Next(se);
}
GWEN_StringList_free(slModuleNames);
if (AQH_Module_List_GetCount(modList))
if (AQCGI_Module_List_GetCount(modList))
return modList;
AQH_Module_List_free(modList);
AQCGI_Module_List_free(modList);
}
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;
sv=AQH_ModService_GetService(m);
slUserNames=AQH_Service_ListUsers(sv);
slUserNames=AQCGI_Service_ListUsers(sv);
if (slUserNames) {
AQH_USER_LIST *userList;
AQCGI_USER_LIST *userList;
GWEN_STRINGLISTENTRY *se;
userList=AQH_User_List_new();
userList=AQCGI_User_List_new();
se=GWEN_StringList_FirstEntry(slUserNames);
while(se) {
const char *sModName;
sModName=GWEN_StringListEntry_Data(se);
if (sModName && *sModName) {
AQH_USER *u;
AQCGI_USER *u;
u=AQH_Service_LoadUser(sv, sModName);
u=AQCGI_Service_LoadUser(sv, sModName);
if (u)
AQH_User_List_Add(u, userList);
AQCGI_User_List_Add(u, userList);
}
se=GWEN_StringListEntry_Next(se);
}
GWEN_StringList_free(slUserNames);
if (AQH_User_List_GetCount(userList))
if (AQCGI_User_List_GetCount(userList))
return userList;
AQH_User_List_free(userList);
AQCGI_User_List_free(userList);
}
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)));
}
}

View File

@@ -9,9 +9,9 @@
#ifndef AQHOME_CGI_MSERVICE_H
#define AQHOME_CGI_MSERVICE_H
#include <aqhome-cgi/service/module.h>
#include <aqhome-cgi/service/service.h>
#include <aqhome-cgi/service/session.h>
#include <aqcgi/service/module.h>
#include <aqcgi/service/service.h>
#include <aqcgi/service/session.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 AQH_MODULE* (*AQH_MODSERVICE_LOADSUBMODULE_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
typedef void (*AQH_MODSERVICE_ADDHEADER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
typedef void (*AQH_MODSERVICE_ADDFOOTER_FN)(AQH_MODULE *m, const char *lang, GWEN_BUFFER *dbuf);
typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
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)(AQCGI_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;
@@ -33,52 +33,52 @@ struct AQH_MODSERVICE_HANDLER_ENTRY {
const char *page;
int httpMethod;
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);
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m);
AQCGI_SERVICE *AQH_ModService_GetService(const AQCGI_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_AddFooter(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(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);
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
AQCGI_MODULE *AQH_ModService_LoadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
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);
void AQH_ModService_CalcSessionModPerms(AQH_MODULE *m, const AQH_SESSION *session);
AQCGI_SESSION *AQH_ModService_ReadSession(AQCGI_MODULE *m, AQCGI_REQUEST *rq);
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,
AQH_SESSION *session,
AQCGI_SESSION *session,
const char *page,
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_ReadStaticFile(AQH_MODULE *m, const char *lang, const char *filename, 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(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_AddRole(AQH_ROLE_LIST *roleList, int id, const char *name, uint32_t perms, const char *descr);
void AQH_ModService_AddPermDef(AQCGI_PERMDEF_LIST *permDefList, const char *id, uint32_t mask, 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);
uint32_t AQH_ModService_ReadPermsFromForm(GWEN_DB_NODE *dbPost, const AQH_PERMDEF_LIST *permDefList, const char *sPrefix);
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 AQCGI_PERMDEF_LIST *permDefList, const char *sPrefix);
AQH_MODULE_LIST *AQH_ModService_LoadRawModules(AQH_MODULE *m);
AQH_USER_LIST *AQH_ModService_LoadRawUsers(AQH_MODULE *m);
AQCGI_MODULE_LIST *AQH_ModService_LoadRawModules(AQCGI_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_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn);
void AQH_ModService_SetHandleRequestFn(AQCGI_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_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_SetAddFooterFn(AQH_MODULE *m, AQH_MODSERVICE_ADDFOOTER_FN fn);
void AQH_ModService_SetAddHeaderFn(AQCGI_MODULE *m, AQH_MODSERVICE_ADDHEADER_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_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_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

View File

@@ -14,7 +14,7 @@
typedef struct AQH_MOD_SERVICE AQH_MOD_SERVICE;
struct AQH_MOD_SERVICE {
AQH_SERVICE *service;
AQCGI_SERVICE *service;
char *baseFolder;
uint32_t userPerms;

View File

@@ -13,7 +13,7 @@
#include "./musers.h"
#include "aqhome-cgi/service/module.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
@@ -36,38 +36,37 @@
* ------------------------------------------------------------------------------------------------
*/
static void _createPermDefList(AQH_MODULE *m);
static void _createRoleList(AQH_MODULE *m);
static void _createPermDefList(AQCGI_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 int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqEditUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqEditUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqAddUserGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqAddUserPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
static void _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqEditUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqEditUserPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqAddUserGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_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 _modulePermsHasRole(const AQH_MODULE_PERMS *modPerms, uint8_t rid);
static int _getHighestUserId(const AQCGI_USER_LIST *userList);
static int _modulePermsHasRole(const AQCGI_MODULE_PERMS *modPerms, uint8_t rid);
static void _writeEditUserForm(AQH_MODULE *m,
const AQH_USER *u,
static void _writeEditUserForm(AQCGI_MODULE *m,
const AQCGI_USER *u,
const char *sAlias,
const char *sUrl,
const char *sSubmitText,
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,
const AQH_ROLE_LIST *roleList,
const AQCGI_ROLE_LIST *roleList,
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 _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_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;
m=AQH_Module_new();
AQH_Module_SetName(m, "users");
AQH_Module_SetDescr(m, "user administration module");
AQH_Module_SetGuestPerms(m, 0);
m=AQCGI_Module_new();
AQCGI_Module_SetName(m, "users");
AQCGI_Module_SetDescr(m, "user administration module");
AQCGI_Module_SetGuestPerms(m, 0);
_createPermDefList(m);
_createRoleList(m);
rv=AQH_Service_AddModule(sv, m);
rv=AQCGI_Service_AddModule(sv, m);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
}
AQH_Module_free(m);
AQCGI_Module_free(m);
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, "UserWrite", 0x002, "Modify users");
AQH_ModService_AddPermDef(permDefList, "UserAdd", 0x004, "Add 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;
int id=0;
AQCGI_ROLE_LIST *roleList;
int id=1;
roleList=AQH_Role_List_new();
roleList=AQCGI_Role_List_new();
AQH_ModService_AddRole(roleList, id++, "admin",
AQH_MODADMUSERS_PERMS_USERSREAD |
AQH_MODADMUSERS_PERMS_USERSWRITE |
AQH_MODADMUSERS_PERMS_USERSADD |
AQH_MODADMUSERS_PERMS_USERSDEL,
"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 */
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);
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;
perms=AQH_ModService_GetUserPerms(m);
@@ -189,31 +188,31 @@ void _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN
"</thead>\n"
"<tbody>\n");
if (userList) {
const AQH_USER *u;
const AQCGI_USER *u;
AQH_User_List_SortByAlias(userList, 1);
u=AQH_User_List_First(userList);
AQCGI_User_List_SortByAlias(userList, 1);
u=AQCGI_User_List_First(userList);
while(u) {
const char *sUserAlias;
sUserAlias=AQH_User_GetAlias(u);
sUserAlias=AQCGI_User_GetAlias(u);
if (sUserAlias && *sUserAlias) {
uint32_t id;
const char *s;
const char *sAlias;
id=AQH_User_GetId(u);
sAlias=AQH_User_GetAlias(u);
id=AQCGI_User_GetId(u);
sAlias=AQCGI_User_GetAlias(u);
GBAS(dbuf, "<tr>");
GBAA(dbuf, "<td>%lu</td>", (unsigned long int) id);
GBAA(dbuf, "<td>%s</td>", sAlias?sAlias:"");
s=AQH_User_GetName(u);
s=AQCGI_User_GetName(u);
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:"");
s=AQH_User_GetEmail(u);
s=AQCGI_User_GetEmail(u);
GBAA(dbuf, "<td>%s</td>", s?s:"");
s=AQH_User_GetNotes(u);
s=AQCGI_User_GetNotes(u);
GBAA(dbuf, "<td>%s</td>", s?s:"");
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, "</tr>\n");
}
u=AQH_User_List_Next(u);
u=AQCGI_User_List_Next(u);
}
GBAS(dbuf,
"</tbody>\n"
"</table>\n");
AQH_User_List_free(userList);
AQCGI_User_List_free(userList);
}
if (perms & AQH_MODADMUSERS_PERMS_USERSADD)
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;
const char *sAlias;
AQH_USER *user;
AQCGI_USER *user;
sv=AQH_ModService_GetService(m);
dbQuery=AQCGI_Request_GetDbQuery(rq);
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) {
_writeEditUserForm(m, user, sAlias, "edituser.html", "Save", dbuf);
AQH_User_free(user);
AQCGI_User_free(user);
}
else {
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;
const char *sAlias;
AQH_USER *u;
AQCGI_USER *u;
sv=AQH_ModService_GetService(m);
dbPost=AQCGI_Request_GetDbPostBody(rq);
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) {
const char *s;
int state;
int rv;
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);
AQH_User_SetEmail(u, s);
AQCGI_User_SetEmail(u, s);
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);
state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown;
if (state!=AQH_UserState_Unknown)
AQH_User_SetState(u, state);
state=(s && *s)?AQCGI_UserState_fromString(s):AQCGI_UserState_Unknown;
if (state!=AQCGI_UserState_Unknown)
AQCGI_User_SetState(u, state);
_readAllModRolesForUserFromForm(m, dbPost, u);
rv=AQH_Service_SaveUser(sv, u);
rv=AQCGI_Service_SaveUser(sv, u);
if (rv<0) {
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
DBG_ERROR(NULL, "Could not save user \"%s\"", sAlias);
AQH_User_free(u);
AQCGI_User_free(u);
return;
}
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
AQH_User_free(u);
AQCGI_User_free(u);
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
AQCGI_Request_SetResponseCode(rq, 303);
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");
_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;
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;
// TODO: check alias validity
if (sAlias) {
AQH_USER *u;
AQCGI_USER *u;
const char *s;
int state;
int rv;
uint32_t userId;
AQH_USER_LIST *userList;
AQCGI_USER_LIST *userList;
u=AQH_User_new();
u=AQCGI_User_new();
userList=AQH_ModService_LoadRawUsers(m);
userId=_getHighestUserId(userList)+1;
AQH_User_SetId(u, userId);
AQH_User_SetAlias(u, sAlias);
AQCGI_User_SetId(u, userId);
AQCGI_User_SetAlias(u, sAlias);
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);
AQH_User_SetEmail(u, s);
AQCGI_User_SetEmail(u, s);
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);
state=(s && *s)?AQH_UserState_fromString(s):AQH_UserState_Unknown;
if (state!=AQH_UserState_Unknown)
AQH_User_SetState(u, state);
state=(s && *s)?AQCGI_UserState_fromString(s):AQCGI_UserState_Unknown;
if (state!=AQCGI_UserState_Unknown)
AQCGI_User_SetState(u, state);
rv=AQH_Service_AddUser(sv, u);
rv=AQCGI_Service_AddUser(sv, u);
if (rv<0) {
GBAS(dbuf, "<h2>Error</h2><p>Error saving user</p>");
DBG_ERROR(NULL, "Could not save user \"%s\" (%d)", sAlias, rv);
AQH_User_free(u);
AQH_User_List_free(userList);
AQCGI_User_free(u);
AQCGI_User_List_free(userList);
return;
}
DBG_ERROR(NULL, "User \"%s\" saved", sAlias);
AQH_User_free(u);
AQCGI_Request_AddResponseHeaderData(rq, "Location: index.html");
AQCGI_Request_SetResponseCode(rq, 303);
AQCGI_Request_SetResponseText(rq, "See other");
AQH_User_List_free(userList);
AQCGI_User_free(u);
AQH_ModService_Redirect(rq, "index.html");
AQCGI_User_List_free(userList);
}
else {
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;
if (userList) {
const AQH_USER *user;
const AQCGI_USER *user;
user=AQH_User_List_First(userList);
user=AQCGI_User_List_First(userList);
while(user) {
int uid;
uid=AQH_User_GetId(user);
uid=AQCGI_User_GetId(user);
id=(uid>id)?uid:id;
user=AQH_User_List_Next(user);
user=AQCGI_User_List_Next(user);
}
}
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) {
int arraySize;
int i;
arraySize=AQH_ModulePerms_GetRoleArrayArraySize();
arraySize=AQCGI_ModulePerms_GetRoleArrayArraySize();
for(i=0; i<arraySize; i++) {
if (AQH_ModulePerms_GetRoleArrayAt(modPerms, i)==rid)
if (AQCGI_ModulePerms_GetRoleArrayAt(modPerms, i)==rid)
return 1;
}
}
@@ -419,14 +416,14 @@ int _modulePermsHasRole(const AQH_MODULE_PERMS *modPerms, uint8_t rid)
void _writeEditUserForm(AQH_MODULE *m,
const AQH_USER *u,
void _writeEditUserForm(AQCGI_MODULE *m,
const AQCGI_USER *u,
const char *sAlias,
const char *sUrl,
const char *sSubmitText,
GWEN_BUFFER *dbuf)
{
AQH_MODULE_LIST *moduleList;
AQCGI_MODULE_LIST *moduleList;
/* write user info */
GBAS(dbuf, "<h2>User Info</h2>\n");
@@ -435,10 +432,10 @@ void _writeEditUserForm(AQH_MODULE *m,
"<table class=\"formtable\">\n",
sUrl?sUrl:"");
_addLabelAndInputToFormTableH("Alias", "alias", sAlias, "required", dbuf);
_addLabelAndInputToFormTableH("Name", "name", u?AQH_User_GetName(u):NULL, NULL, dbuf);
_addLabelAndInputToFormTableH("Email", "email", u?AQH_User_GetEmail(u):NULL, NULL, dbuf);
_addLabelAndInputToFormTableH("Notes", "notes", u?AQH_User_GetNotes(u):NULL, NULL, dbuf);
_addUserStateLabelAndSelectionToFormTableH("Status", "status", u?AQH_User_GetState(u):AQH_UserState_Unknown, dbuf);
_addLabelAndInputToFormTableH("Name", "name", u?AQCGI_User_GetName(u):NULL, NULL, dbuf);
_addLabelAndInputToFormTableH("Email", "email", u?AQCGI_User_GetEmail(u):NULL, NULL, dbuf);
_addLabelAndInputToFormTableH("Notes", "notes", u?AQCGI_User_GetNotes(u):NULL, NULL, dbuf);
_addUserStateLabelAndSelectionToFormTableH("Status", "status", u?AQCGI_User_GetState(u):AQCGI_UserState_Unknown, dbuf);
GBAS(dbuf, "</table>\n");
@@ -452,26 +449,26 @@ void _writeEditUserForm(AQH_MODULE *m,
"<tbody>\n");
moduleList=AQH_ModService_LoadRawModules(m);
if (moduleList) {
const AQH_MODULE_PERMS_LIST *modPermsList;
const AQH_MODULE *currentMod;
const AQCGI_MODULE_PERMS_LIST *modPermsList;
const AQCGI_MODULE *currentMod;
modPermsList=u?AQH_User_GetModulePermList(u):NULL;
currentMod=AQH_Module_List_First(moduleList);
modPermsList=u?AQCGI_User_GetModulePermList(u):NULL;
currentMod=AQCGI_Module_List_First(moduleList);
while(currentMod) {
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);
modPerms=modPermsList?AQH_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
_writeUserModRolesToForm(AQH_Module_GetRoleList(currentMod), modPerms, sModName, dbuf);
modPerms=modPermsList?AQCGI_ModulePerms_List_GetByModuleId(modPermsList, sModName):NULL;
_writeUserModRolesToForm(AQCGI_Module_GetRoleList(currentMod), modPerms, sModName, dbuf);
GBAS(dbuf, "</td></tr>\n");
GBAS(dbuf, "<td>");
currentMod=AQH_Module_List_Next(currentMod);
currentMod=AQCGI_Module_List_Next(currentMod);
} /* while */
AQH_Module_List_free(moduleList);
AQCGI_Module_List_free(moduleList);
}
GBAS(dbuf,
"</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);
if (moduleList) {
AQH_MODULE_PERMS_LIST *permsList;
const AQH_MODULE *module;
AQCGI_MODULE_PERMS_LIST *permsList;
const AQCGI_MODULE *module;
permsList=AQH_User_GetModulePermList(u);
permsList=AQCGI_User_GetModulePermList(u);
if (permsList==NULL) {
DBG_ERROR(NULL, "Creating module perms list for user");
permsList=AQH_ModulePerms_List_new();
AQH_User_SetModulePermList(u, permsList);
permsList=AQCGI_ModulePerms_List_new();
AQCGI_User_SetModulePermList(u, permsList);
}
module=AQH_Module_List_First(moduleList);
module=AQCGI_Module_List_First(moduleList);
while(module) {
const char *sModName;
const AQH_ROLE_LIST *roleList;
const AQCGI_ROLE_LIST *roleList;
sModName=AQH_Module_GetName(module);
roleList=AQH_Module_GetRoleList(module);
sModName=AQCGI_Module_GetName(module);
roleList=AQCGI_Module_GetRoleList(module);
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) {
modPerms=AQH_ModulePerms_new();
AQH_ModulePerms_SetModuleId(modPerms, sModName);
AQH_ModulePerms_List_Add(modPerms, permsList);
modPerms=AQCGI_ModulePerms_new();
AQCGI_ModulePerms_SetModuleId(modPerms, sModName);
AQCGI_ModulePerms_List_Add(modPerms, permsList);
}
_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) {
const AQH_ROLE *role;
const AQCGI_ROLE *role;
role=AQH_Role_List_First(roleList);
role=AQCGI_Role_List_First(roleList);
while(role) {
const char *sRoleName;
uint8_t roleId;
roleId=AQH_Role_GetId(role);
sRoleName=AQH_Role_GetName(role);
roleId=AQCGI_Role_GetId(role);
sRoleName=AQCGI_Role_GetName(role);
if (sRoleName && *sRoleName) {
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);
}
}
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,
const AQH_ROLE_LIST *roleList,
const AQCGI_ROLE_LIST *roleList,
const char *sPrefix,
AQH_MODULE_PERMS *modPerms)
AQCGI_MODULE_PERMS *modPerms)
{
AQH_ModulePerms_PresetRoleArray(modPerms, 0);
AQCGI_ModulePerms_PresetRoleArray(modPerms, 0);
if (roleList) {
GWEN_BUFFER *tbuf;
uint32_t pos;
const AQH_ROLE *role;
const AQCGI_ROLE *role;
int nextRolePos=0;
tbuf=GWEN_Buffer_new(0, 256, 0, 1);
@@ -577,24 +574,27 @@ void _readModRolesFromForm(GWEN_DB_NODE *dbPost,
GBAA(tbuf, "%s:", sPrefix);
pos=GWEN_Buffer_GetPos(tbuf);
role=AQH_Role_List_First(roleList);
role=AQCGI_Role_List_First(roleList);
while(role) {
const char *roleName;
roleName=AQH_Role_GetName(role);
roleName=AQCGI_Role_GetName(role);
if (roleName && *roleName) {
const char *s;
GBAS(tbuf, roleName);
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 (nextRolePos<AQH_ModulePerms_GetRoleArrayArraySize())
AQH_ModulePerms_SetRoleArrayAt(modPerms, nextRolePos++, AQH_Role_GetId(role));
if (nextRolePos<AQCGI_ModulePerms_GetRoleArrayArraySize()) {
/*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);
}
role=AQH_Role_List_Next(role);
role=AQCGI_Role_List_Next(role);
} /* while */
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, "<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;
s=AQH_UserState_toString(i);
s=AQCGI_UserState_toString(i);
GBAA(dbuf, "<option value=\"%s\" %s>%s</option>", s, (i==st)?"selected":"", s);
}
GBAS(dbuf, "</select></td></tr>");

View File

@@ -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);

View File

@@ -22,9 +22,10 @@
#include "aqhome-cgi/modules/devices/mdevices_device.h"
#include "aqhome-cgi/modules/devices/mdevices_setdevice.h"
#include "aqhome-cgi/modules/devices/mdevices_page.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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 int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
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 _handleRqValuesTableGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqValuesGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqValueGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqSetDataPost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqGraphGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqDeviceGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqDevicePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqPageGet(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqPageGraphGet(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(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqValuesGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqValueGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqSetDataPost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqGraphGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqDeviceGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqDevicePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, GWEN_BUFFER *dbuf);
static void _handleRqPagePost(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_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);
@@ -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_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;
}
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);
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
@@ -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 *dpList;

View File

@@ -39,8 +39,8 @@
void AQH_ModDevices_Extend(AQH_MODULE *m, AQH_SERVICE *sv, const char *baseFolder);
int AQH_ModDevices_Create(AQH_SERVICE *sv);
void AQH_ModDevices_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
int AQH_ModDevices_Create(AQCGI_SERVICE *sv);
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,
uint64_t tsBegin, uint64_t tsEnd, uint64_t num);
void AQH_ModDevices_RedirectToDevice(AQCGI_REQUEST *rq, const char *destLocation, const AQH_DEVICE *device);

View File

@@ -13,9 +13,10 @@
#include "./mdevices_device.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
#include <gwenhywfar/text.h>
@@ -38,9 +39,9 @@
* ------------------------------------------------------------------------------------------------
*/
static void _runDeviceWithArgs(AQH_MODULE *m,
static void _runDeviceWithArgs(AQCGI_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_DATACLIENT *dc,
const char *sDeviceName,
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;
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,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_DATACLIENT *dc,
const char *sDeviceName,
GWEN_BUFFER *dbuf)

View File

@@ -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

View File

@@ -13,9 +13,10 @@
#include "./mdevices_index.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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 *device;

View File

@@ -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

View File

@@ -13,9 +13,10 @@
#include "./mdevices_init.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
#include <gwenhywfar/text.h>
@@ -40,8 +41,8 @@
* ------------------------------------------------------------------------------------------------
*/
static void _createPermDefList(AQH_MODULE *m);
static void _createRoleList(AQH_MODULE *m);
static void _createPermDefList(AQCGI_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;
m=AQH_Module_new();
AQH_Module_SetName(m, "devices");
AQH_Module_SetDescr(m, "device module");
AQH_Module_SetGuestPerms(m, 0);
m=AQCGI_Module_new();
AQCGI_Module_SetName(m, "devices");
AQCGI_Module_SetDescr(m, "device module");
AQCGI_Module_SetGuestPerms(m, 0);
_createPermDefList(m);
_createRoleList(m);
rv=AQH_Service_AddModule(sv, m);
rv=AQCGI_Service_AddModule(sv, m);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
}
AQH_Module_free(m);
AQCGI_Module_free(m);
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, "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, "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;
int id=0;
AQCGI_ROLE_LIST *roleList;
int id=1;
roleList=AQH_Role_List_new();
roleList=AQCGI_Role_List_new();
AQH_ModService_AddRole(roleList, id++, "Reader",
AQH_MODDEVICES_PERMS_DEVICEREAD |
AQH_MODDEVICES_PERMS_VALUEREAD,
@@ -121,7 +122,7 @@ void _createRoleList(AQH_MODULE *m)
AQH_MODDEVICES_PERMS_VALUEREAD |
AQH_MODDEVICES_PERMS_VALUESET,
"Set values");
AQH_Module_SetRoleList(m, roleList);
AQCGI_Module_SetRoleList(m, roleList);
}

View File

@@ -21,7 +21,7 @@
int AQH_ModDevices_Create(AQH_SERVICE *sv);
int AQH_ModDevices_Create(AQCGI_SERVICE *sv);
#endif

View File

@@ -13,9 +13,10 @@
#include "./mdevices_page.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <aqdiagram/graph/timegraph.h>
#include <aqdiagram/graph/w_graph.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 _writeItem(AQH_MODULE *m, AQH_DATACLIENT *dc, const char *sPageId, GWEN_XMLNODE *nItem, GWEN_BUFFER *dbuf);
static void _writePage(AQCGI_MODULE *m, AQH_DATACLIENT *dc, GWEN_XMLNODE *nPage, 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 _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 _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 _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 uint64_t _parseTime(const char *s);
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 _writeRgbwToForm(const char *sValueName, uint32_t color, 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 _setOnOffAutoData(AQH_DATACLIENT *dc, const AQH_VALUE *value, const char *sValue);
static void _sendPageList(AQH_MODULE *m, GWEN_BUFFER *dbuf);
static GWEN_STRINGLIST *_listPageFiles(AQH_MODULE *m);
static GWEN_XMLNODE *_readPage(AQH_MODULE *m, const char *sPageName);
static void _sendPageList(AQCGI_MODULE *m, GWEN_BUFFER *dbuf);
static GWEN_STRINGLIST *_listPageFiles(AQCGI_MODULE *m);
static GWEN_XMLNODE *_readPage(AQCGI_MODULE *m, const char *sPageName);
static GWEN_XMLNODE *_readPageFile(const char *sFilename);
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;
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;
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;
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;
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;
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);
AQH_ModService_EscapeToBuffer(s, buf);
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;
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;
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;
@@ -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;
AQH_SERVICE *sv;
AQCGI_SERVICE *sv;
GWEN_STRINGLIST *sl;
int rv;
sv=AQH_ModService_GetService(m);
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();
rv=GWEN_Directory_GetMatchingFilesRecursively(GWEN_Buffer_GetStart(fbuf), sl, "*.xml");
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;
AQH_SERVICE *sv;
AQCGI_SERVICE *sv;
GWEN_XMLNODE *fileNode;
sv=AQH_ModService_GetService(m);
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);
GBAS(fbuf, ".xml");

View File

@@ -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_RunPagePost(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_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_RunPageGet(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_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(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, AQH_DATACLIENT *dc, GWEN_BUFFER *dbuf);
#endif

View File

@@ -13,9 +13,10 @@
#include "./mdevices_setdata.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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 _setOnOffData(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;
const char *sDeviceName;
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_OnOff: _setOnOffData(dc, value, sValue); break;
case AQH_ValueModality_OnOffAuto: _setOnOffAutoData(dc, value, sValue); break;
default:
break;
default: _setIntData(dc, value, sValue); break;
} /* switch */
} /* 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)
{
if (sValue) {

View File

@@ -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

View File

@@ -13,9 +13,10 @@
#include "./mdevices_setdevice.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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;
const char *sDeviceName;
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");
}
if (sDeviceName && *sDeviceName) {
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");
AQH_ModDevices_RedirectToDevice(rq, "device.html", device);
}

View File

@@ -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

View File

@@ -13,9 +13,10 @@
#include "./mdevices_value.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
#include <gwenhywfar/text.h>
@@ -36,13 +37,14 @@
* ------------------------------------------------------------------------------------------------
*/
static void _runValueWithArgs(AQH_MODULE *m,
static void _runValueWithArgs(AQCGI_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_DATACLIENT *dc,
const char *sDeviceName,
const char *sValueName,
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 _writeRgbwToForm(const char *sValueName, uint32_t color, 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;
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,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_DATACLIENT *dc,
const char *sDeviceName,
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_OnOff: _writeOnOffToForm(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 */
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)
{
#if 1

View File

@@ -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

View File

@@ -14,9 +14,10 @@
#include "./mdevices_valuesgraph.h"
#include "./mdevices_index.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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 _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 _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;
const char *sDeviceName;
@@ -59,6 +61,10 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
if (!(sDeviceName && *sDeviceName))
AQH_ModDevices_RunIndex(m, rq, session, dc, dbuf);
else {
AQH_DEVICE *device;
device=AQH_DataClient_GetDeviceByName(dc, sDeviceName);
if (device) {
const char *sValueName;
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;
GBAA(dbuf,"<h1>Value %s/%s</h1>\n", sDeviceName, sValueName);
_writeDeviceInfo(device, dbuf);
value=AQH_ModDevices_GetValueForDevice(dc, sDeviceName, sValueName);
if (value) {
_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)) {
GBAA(dbuf,"<h1>Values for Device %s</h1>\n", sDeviceName);
_writeDeviceInfo(device, dbuf);
_writeValueListToTable(sDeviceName, valueList, dbuf);
GBAS(dbuf, "\n");
}
@@ -89,7 +97,31 @@ void AQH_ModDevices_RunValuesAsGraph(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSI
AQH_Value_List_free(valueList);
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>");
}

View File

@@ -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

View File

@@ -14,9 +14,10 @@
#include "./mdevices_valuestable.h"
#include "./mdevices_index.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.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;
const char *sDeviceName;

View File

@@ -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

View File

@@ -13,9 +13,10 @@
#include "./mdevices_vgraph.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/mdataclient.h"
#include <aqcgi/service/module.h>
#include <aqdiagram/graph/timegraph.h>
#include <aqdiagram/graph/w_graph.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},
{"1d", "last 24 hours", "Lm30", 24*60*60, 5*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
* ------------------------------------------------------------------------------------------------
*/
static void _runGraphValueWithArgs(AQH_MODULE *m,
static void _runGraphValueWithArgs(AQCGI_MODULE *m,
AQCGI_REQUEST *rq,
AQH_DATACLIENT *dc,
const char *sDeviceName,
@@ -83,8 +96,8 @@ static void _createGraph(AQH_DATACLIENT *dc,
const char *graphTitle, int precision, const char *curveLabel,
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 void _mkPathForValueAndPeriod(AQH_MODULE *m, const AQH_VALUE *v, const MY_GRAPH_PARAMS *graphParams, GWEN_BUFFER *dbuf);
static const MY_GRAPH_PARAMS *_getParamsByName(const char *s);
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, 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;
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,
AQH_DATACLIENT *dc,
const char *sDeviceName,
@@ -138,9 +151,6 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
DBG_DEBUG(NULL, "GraphValue with args");
dbQuery=AQCGI_Request_GetDbQuery(rq);
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",
sDeviceName?sDeviceName:"<empty>", sValueName?sValueName:"<empty>",
sPeriod?sPeriod:"<empty>");
@@ -149,6 +159,7 @@ void _runGraphValueWithArgs(AQH_MODULE *m,
if (value) {
GWEN_BUFFER *fbuf;
graphParams=_getParamsByName(sPeriod, AQH_Value_GetModality(value));
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
_mkPathForValueAndPeriod(m, value, graphParams, fbuf);
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;
sv=AQH_ModService_GetService(m);
/* cache folder */
s=AQH_Service_GetCacheFolder(sv);
s=AQCGI_Service_GetCacheFolder(sv);
GBAA(dbuf, "%s%s", s, GWEN_DIR_SEPARATOR_S);
/* 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;
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) {
if (strcasecmp(p->name, s)==0)
return p;
p++;
}
return NULL;
return startP;
}

View File

@@ -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

View File

@@ -13,11 +13,11 @@
#include "./mdataclient.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome/msg/ipc/m_ipc.h"
#include "aqhome/msg/ipc/data/m_ipcd.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.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);
@@ -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,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_MODDATACLIENT_RUN_FN runFn,
GWEN_BUFFER *dbuf)
{

View File

@@ -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_HandleRequest(AQH_MODULE *m,
void AQH_ModDataClient_Extend(AQCGI_MODULE *m, AQCGI_SERVICE *sv, const char *baseFolder);
void AQH_ModDataClient_HandleRequest(AQCGI_MODULE *m,
AQCGI_REQUEST *rq,
AQH_SESSION *session,
AQCGI_SESSION *session,
AQH_MODDATACLIENT_RUN_FN runFn,
GWEN_BUFFER *dbuf);

View File

@@ -13,12 +13,14 @@
#include "./mroot_p.h"
#include "aqhome-cgi/service/module.h"
#include "aqhome-cgi/modules/devices/mdevices.h"
#include "aqhome-cgi/modules/common/madmin.h"
#include <aqcgi/service/module.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/timestamp.h>
#include <gwenhywfar/text.h>
@@ -27,6 +29,10 @@
* ------------------------------------------------------------------------------------------------
*/
#define AQH_SERVICE_SESSION_MAXAGE 86400
/* ------------------------------------------------------------------------------------------------
* global vars
* ------------------------------------------------------------------------------------------------
@@ -37,12 +43,13 @@
* ------------------------------------------------------------------------------------------------
*/
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sModuleName);
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, AQH_SESSION *session, const char *sLastPathElem);
static int _handleRqIndex(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static int _handleRqLoginPost(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static AQH_USER *_getAndCheckUser(AQH_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static AQCGI_MODULE *_loadSubModule(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sModuleName);
static int _handleRequest(AQCGI_MODULE *m, AQCGI_REQUEST *rq, AQCGI_SESSION *session, const char *sLastPathElem);
static int _handleRqIndex(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static int _handleRqLogin(AQCGI_MODULE *m, AQCGI_REQUEST *rq, GWEN_BUFFER *dbuf);
static int _handleRqLoginGet(AQCGI_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_SetHandleRequestFn(m, _handleRequest);
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);
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) {
const char *s;
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:".");
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);
return mSub;
}
}
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) {
const char *s;
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:".");
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);
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;
@@ -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)
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)
AQH_ModService_RespondWithFile(m, rq, "en", "login.html", dbuf);
_handleRqLoginGet(m, rq, dbuf);
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST)
_handleRqLoginPost(m, rq, dbuf);
_handleRqLoginPost(m, rq);
else {
DBG_ERROR(NULL, "Invalid request method %d", AQCGI_Request_GetRequestMethod(rq));
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;
AQH_USER *user;
AQH_SESSION *session;
GWEN_DB_NODE *dbQuery;
const char *sSrc;
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_TIMESTAMP *ts;
GWEN_DB_NODE *dbPost;
const char *s;
int rv;
DBG_ERROR(NULL, "Handling request");
sv=AQH_ModService_GetService(m);
user=_getAndCheckUser(m, rq, dbuf);
user=_getAndCheckUser(m, rq);
if (user==NULL) {
DBG_INFO(NULL, "here");
AQCGI_Request_SetResponseCode(rq, 500);
AQCGI_Request_SetResponseText(rq, "Internal Error");
return GWEN_ERROR_GENERIC;
}
ts=GWEN_Timestamp_NowInLocalTime();
AQH_User_SetTimestampLastLogin(user, ts);
DBG_ERROR(NULL, "Saving user");
rv=AQH_Service_SaveUser(sv, user);
AQCGI_User_SetTimestampLastLogin(user, ts);
rv=AQCGI_Service_SaveUser(sv, user);
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_SetResponseText(rq, "Internal Error");
AQH_User_free(user);
AQCGI_User_free(user);
return rv;
}
/* generate session */
DBG_ERROR(NULL, "Generating session");
tbuf=GWEN_Buffer_new(0, 64, 0, 1);
AQCGI_GenerateSessionId(tbuf);
session=AQH_Session_new();
AQH_Session_SetTimestampCreation(session, ts);
AQH_Session_SetTimestampLastAccess(session, ts);
AQH_Session_SetUid(session, GWEN_Buffer_GetStart(tbuf));
session=AQCGI_Session_new();
AQCGI_Session_SetTimestampCreation(session, ts);
AQCGI_Session_SetTimestampLastAccess(session, ts);
AQCGI_Session_SetUid(session, GWEN_Buffer_GetStart(tbuf));
GWEN_Buffer_free(tbuf);
AQH_Session_SetUserAlias(session, AQH_User_GetAlias(user));
rv=AQH_Service_AddSession(sv, session);
AQCGI_Session_SetUserAlias(session, AQCGI_User_GetAlias(user));
rv=AQCGI_Service_AddSession(sv, session);
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_SetResponseText(rq, "Internal Error");
AQH_Session_free(session);
AQH_User_free(user);
AQCGI_Session_free(session);
AQCGI_User_free(user);
return GWEN_ERROR_INTERNAL;
}
/* add Set-Cookie header */
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));
GWEN_Buffer_free(tbuf);
/* 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_SetResponseCode(rq, 303);
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;
}
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;
dbPost=AQCGI_Request_GetDbPostBody(rq);
if (dbPost) {
AQH_SERVICE *sv;
AQCGI_SERVICE *sv;
const char *sUserName;
const char *sPasswd;
AQH_USER *user;
AQCGI_USER *user;
const char *hashedPaswd;
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);
user=AQH_Service_LoadUser(sv, sUserName);
user=AQCGI_Service_LoadUser(sv, sUserName);
if (user==NULL) {
DBG_ERROR(NULL, "User \"%s\" not found", sUserName);
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);
if (AQH_User_GetState(user)!=AQH_UserState_Active) {
if (AQCGI_User_GetState(user)!=AQCGI_UserState_Active) {
DBG_ERROR(NULL, "User \"%s\" not active", sUserName);
AQCGI_Request_SetResponseCode(rq, 403);
AQCGI_Request_SetResponseText(rq, "Forbidden");
AQH_User_free(user);
AQCGI_User_free(user);
return NULL;
}
hashedPaswd=AQH_User_GetHashedPassword(user);
hashedPaswd=AQCGI_User_GetHashedPassword(user);
if (!(hashedPaswd && *hashedPaswd)) {
DBG_ERROR(NULL, "User \"%s\" has no hashed password", sUserName);
AQCGI_Request_SetResponseCode(rq, 403);
AQCGI_Request_SetResponseText(rq, "Forbidden");
AQH_User_free(user);
AQCGI_User_free(user);
return NULL;
}
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_SetResponseText(rq, "Forbidden");
GWEN_Buffer_free(buf);
AQH_User_free(user);
AQCGI_User_free(user);
return NULL;
}
GWEN_Buffer_free(buf);

View File

@@ -16,10 +16,8 @@
#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);

View File

@@ -4,6 +4,7 @@
<h3>Enter your login credentials</h3>
<form action="login" method="post">
<input type="hidden" name="dest" value="$(destination)">
<label for="userid">Username:</label>
<input type="text" id="userid" name="userid" placeholder="Enter your Username" required>
<label for="password">Password:</label>
@@ -20,6 +21,4 @@
</a>
</p>
</div>
</body>
</html>

View File

@@ -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>

View File

@@ -1,20 +0,0 @@
- service:
- userList
- rootModule
- sessionList
- user:
- modulePerms
- module:
- roleList
- permDefList
- session

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 AQH_USER *_loadUser(AQH_SERVICE *sv, const char *s);
static int _saveUser(AQH_SERVICE *sv, AQH_USER *user);
static int _addUser(AQH_SERVICE *sv, AQH_USER *user);
static int _delUser(AQH_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listUsers(AQH_SERVICE *sv);
static AQCGI_USER *_loadUser(AQCGI_SERVICE *sv, const char *s);
static int _saveUser(AQCGI_SERVICE *sv, AQCGI_USER *user);
static int _addUser(AQCGI_SERVICE *sv, AQCGI_USER *user);
static int _delUser(AQCGI_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listUsers(AQCGI_SERVICE *sv);
static AQH_MODULE *_loadModule(AQH_SERVICE *sv, const char *s);
static int _saveModule(AQH_SERVICE *sv, AQH_MODULE *module);
static int _addModule(AQH_SERVICE *sv, AQH_MODULE *module);
static int _delModule(AQH_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listModules(AQH_SERVICE *sv);
static AQCGI_MODULE *_loadModule(AQCGI_SERVICE *sv, const char *s);
static int _saveModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module);
static int _addModule(AQCGI_SERVICE *sv, AQCGI_MODULE *module);
static int _delModule(AQCGI_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listModules(AQCGI_SERVICE *sv);
static AQH_SESSION* _loadSession(AQH_SERVICE *sv, const char *s);
static int _saveSession(AQH_SERVICE *sv, AQH_SESSION *session);
static int _addSession(AQH_SERVICE *sv, AQH_SESSION *session);
static int _delSession(AQH_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listSessions(AQH_SERVICE *sv);
static AQCGI_SESSION* _loadSession(AQCGI_SERVICE *sv, const char *s);
static int _saveSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session);
static int _addSession(AQCGI_SERVICE *sv, AQCGI_SESSION *session);
static int _delSession(AQCGI_SERVICE *sv, const char *s);
static GWEN_STRINGLIST *_listSessions(AQCGI_SERVICE *sv);
static GWEN_DB_NODE *_loadGroupLocked(AQH_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 _addGroupLocked(AQH_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 GWEN_STRINGLIST *_listGroup(AQH_SERVICE *sv, const char *groupName);
static GWEN_DB_NODE *_loadGroupLocked(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName);
static int _saveGroupLocked(AQCGI_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(AQCGI_SERVICE *sv, const char *groupName, const char *subGroupName);
static GWEN_STRINGLIST *_listGroup(AQCGI_SERVICE *sv, const char *groupName);
//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;
GWEN_BUFFER *dbuf;
sv=AQH_Service_new(baseFolder, baseUrl);
sv=AQCGI_Service_new(baseFolder, baseUrl);
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);
AQH_Service_SetSaveUserFn(sv, _saveUser);
AQH_Service_SetAddUserFn(sv, _addUser);
AQH_Service_SetDelUserFn(sv, _delUser);
AQH_Service_SetListUsersFn(sv, _listUsers);
AQCGI_Service_SetLoadUserFn(sv, _loadUser);
AQCGI_Service_SetSaveUserFn(sv, _saveUser);
AQCGI_Service_SetAddUserFn(sv, _addUser);
AQCGI_Service_SetDelUserFn(sv, _delUser);
AQCGI_Service_SetListUsersFn(sv, _listUsers);
AQH_Service_SetLoadModuleFn(sv, _loadModule);
AQH_Service_SetSaveModuleFn(sv, _saveModule);
AQH_Service_SetAddModuleFn(sv, _addModule);
AQH_Service_SetDelModuleFn(sv, _delModule);
AQH_Service_SetListModulesFn(sv, _listModules);
AQCGI_Service_SetLoadModuleFn(sv, _loadModule);
AQCGI_Service_SetSaveModuleFn(sv, _saveModule);
AQCGI_Service_SetAddModuleFn(sv, _addModule);
AQCGI_Service_SetDelModuleFn(sv, _delModule);
AQCGI_Service_SetListModulesFn(sv, _listModules);
AQH_Service_SetLoadSessionFn(sv, _loadSession);
AQH_Service_SetSaveSessionFn(sv, _saveSession);
AQH_Service_SetAddSessionFn(sv, _addSession);
AQH_Service_SetDelSessionFn(sv, _delSession);
AQH_Service_SetListSessionsFn(sv, _listSessions);
AQCGI_Service_SetLoadSessionFn(sv, _loadSession);
AQCGI_Service_SetSaveSessionFn(sv, _saveSession);
AQCGI_Service_SetAddSessionFn(sv, _addSession);
AQCGI_Service_SetDelSessionFn(sv, _delSession);
AQCGI_Service_SetListSessionsFn(sv, _listSessions);
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));
xs->configMgr=GWEN_ConfigMgr_Factory(GWEN_Buffer_GetStart(dbuf));
if (xs->configMgr==NULL) {
DBG_ERROR(NULL, "Error creating config mgr \"%s\"", GWEN_Buffer_GetStart(dbuf));
GWEN_Buffer_free(dbuf);
AQH_Service_free(sv);
AQCGI_Service_free(sv);
return NULL;
}
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;
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s);
if (db) {
AQH_USER *user;
AQCGI_USER *user;
user=AQH_User_fromDb(db);
user=AQCGI_User_fromDb(db);
GWEN_DB_Group_free(db);
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;
s=AQH_User_GetAlias(user);
s=AQCGI_User_GetAlias(user);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_User_toDb(user, db);
rv=AQCGI_User_toDb(user, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
GWEN_DB_Group_free(db);
return rv;
}
//_logGroup(AQH_SERVICE_FILE_GROUP_USERS, s, db);
rv=_saveGroupLocked(sv, AQH_SERVICE_FILE_GROUP_USERS, s, db);
if (rv<0) {
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;
s=AQH_User_GetAlias(user);
s=AQCGI_User_GetAlias(user);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_User_toDb(user, db);
rv=AQCGI_User_toDb(user, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
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);
}
GWEN_STRINGLIST *_listUsers(AQH_SERVICE *sv)
GWEN_STRINGLIST *_listUsers(AQCGI_SERVICE *sv)
{
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;
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_MODULES, s);
if (db) {
AQH_MODULE *module;
AQCGI_MODULE *module;
module=AQH_Module_fromDb(db);
module=AQCGI_Module_fromDb(db);
GWEN_DB_Group_free(db);
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;
s=AQH_Module_GetName(module);
s=AQCGI_Module_GetName(module);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_Module_toDb(module, db);
rv=AQCGI_Module_toDb(module, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
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;
s=AQH_Module_GetName(module);
s=AQCGI_Module_GetName(module);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_Module_toDb(module, db);
rv=AQCGI_Module_toDb(module, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
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);
}
GWEN_STRINGLIST *_listModules(AQH_SERVICE *sv)
GWEN_STRINGLIST *_listModules(AQCGI_SERVICE *sv)
{
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;
db=_loadGroupLocked(sv, AQH_SERVICE_FILE_GROUP_SESSIONS, s);
if (db) {
AQH_SESSION *session;
AQCGI_SESSION *session;
session=AQH_Session_fromDb(db);
session=AQCGI_Session_fromDb(db);
GWEN_DB_Group_free(db);
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;
s=AQH_Session_GetUid(session);
s=AQCGI_Session_GetUid(session);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_Session_toDb(session, db);
rv=AQCGI_Session_toDb(session, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
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;
s=AQH_Session_GetUid(session);
s=AQCGI_Session_GetUid(session);
if (s && *s) {
GWEN_DB_NODE *db;
int rv;
db=GWEN_DB_Group_new(s);
rv=AQH_Session_toDb(session, db);
rv=AQCGI_Session_toDb(session, db);
if (rv<0) {
DBG_ERROR(NULL, "here (%d)", rv);
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);
}
GWEN_STRINGLIST *_listSessions(AQH_SERVICE *sv)
GWEN_STRINGLIST *_listSessions(AQCGI_SERVICE *sv)
{
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);
if (sv && groupName && subGroupName) {
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) {
GWEN_DB_NODE *db=NULL;
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) {
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) {
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) {
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) {
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) {
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) {
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) {
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) {
GWEN_STRINGLIST *sl;
int rv;

View File

@@ -10,10 +10,10 @@
#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);

View File

@@ -18,6 +18,7 @@
#include "aqhome/msg/node/m_node.h"
#include "aqhome/msg/node/m_sendstats.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_addr.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 _handleMsgComSendStat(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 _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) {
case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(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_NEED_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)
{
AQH_NODE_INFO *ni;

View File

@@ -250,18 +250,9 @@ AQHNODE_DEVICE *_readXmlDevice(GWEN_XMLNODE *deviceNode)
AQHNODE_VALUE_LIST *valueList;
valueList=_readXmlValueList(valuesNode);
if (valueList==NULL) {
DBG_INFO(NULL, "here");
AQHNODE_Device_free(device);
return NULL;
}
if (valueList)
AQHNODE_Device_SetValueList(device, valueList);
}
else {
DBG_INFO(NULL, "No <values> element");
AQHNODE_Device_free(device);
return NULL;
}
return device;
}

View File

@@ -36,6 +36,7 @@
#define CONNCLEAN_INTERVAL_IN_SECS 2
#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;
time_t timeLastConnectionCleanup;
time_t timeLastConnCheck;
time_t timeLastHeartbeat;
timeout=AQH_NodeServer_GetTimeout(aqh);
timeStart=time(NULL);
timeLastConnectionCleanup=time(NULL);
timeLastConnCheck=time(NULL);
timeLastConnectionCleanup=timeStart;
timeLastConnCheck=timeStart;
timeLastHeartbeat=timeStart;
while(!stopService) {
time_t now;
@@ -162,6 +165,13 @@ void _runService(AQH_OBJECT *aqh, AQH_EVENT_LOOP *eventLoop)
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)) {
DBG_INFO(NULL, "Timeout");
break;

View File

@@ -42,6 +42,7 @@
#include <aqhome/msg/node/m_recvstats.h>
#include <aqhome/msg/node/m_sendstats.h>
#include <aqhome/msg/node/m_memstats.h>
#include <aqhome/msg/node/m_heartbeat.h>
#include <aqhome/data/value.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_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_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)
{
uint8_t code;
@@ -963,8 +983,13 @@ void _forwardDataFromMemStatsMsgToBroker(AQH_NODE_SERVER *xo, const AQH_MESSAGE
uid=AQH_MemStatsMessage_GetUid(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/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/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));
}

View File

@@ -57,6 +57,7 @@ void AQH_NodeServer_HandleClientMsgs(AQH_OBJECT *o);
void AQH_NodeServer_HandleBrokerMsgs(AQH_OBJECT *o);
void AQH_NodeServer_CheckBrokerConnection(AQH_OBJECT *o);
void AQH_NodeServer_CheckTtyConnection(AQH_OBJECT *o);
void AQH_NodeServer_SendHeartbeat(AQH_OBJECT *o);
/* getters and setters */

View File

@@ -23,6 +23,7 @@
#include "aqhome/msg/msg_sysstats.h"
#include "aqhome/msg/msg_ping.h"
#include "aqhome/msg/msg_pong.h"
#include "aqhome/msg/m_heartbeat.h"
#include "aqhome/msg/msg_needaddr.h"
#include "aqhome/msg/msg_claimaddr.h"
#include "aqhome/msg/msg_haveaddr.h"
@@ -80,6 +81,7 @@ void AqHomed_LogTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg)
switch(msgType) {
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_HEARTBEAT: AQH_HeartbeatMessage_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_TWIBUSMEMBER: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break;

View File

@@ -103,7 +103,7 @@ AQH_MESSAGE *_createRequestMessage(GWEN_UNUSED AQH_OBJECT *o, uint32_t msgId)
const char *valueName;
const char *valueUnits;
const char *valueDataAsString;
double valueData;
double valueData=0.0;
AQH_VALUE *v;
int rv;
@@ -205,6 +205,7 @@ int _read16BitValues(const GWEN_STRINGLIST *sl, double *pDouble)
}
result<<=16;
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);
}

View File

@@ -176,13 +176,15 @@ void _printNode(const AQH_NODE_INFO *ni, int printAll)
GWEN_Timestamp_GetHour(ts),
GWEN_Timestamp_GetMinute(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_GetStatsPacketsIn(ni),
AQH_NodeInfo_GetStatsCollisions(ni),
AQH_NodeInfo_GetStatsBusy(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));
}
}

View File

@@ -277,6 +277,8 @@ int AQH_ValueModality_fromString(const char *s)
return AQH_ValueModality_OnOff;
else if (strcasecmp(s, "onOffAuto")==0)
return AQH_ValueModality_OnOffAuto;
else if (strcasecmp(s, "rpm")==0)
return AQH_ValueModality_RPM;
}
return AQH_ValueModality_Unknown;
}
@@ -298,6 +300,7 @@ const char *AQH_ValueModality_toString(int i)
case AQH_ValueModality_Light: return "light";
case AQH_ValueModality_OnOff: return "onOff";
case AQH_ValueModality_OnOffAuto: return "onOffAuto";
case AQH_ValueModality_RPM: return "rpm";
case AQH_ValueModality_Unknown:
default: return "unknown";
}

View File

@@ -48,7 +48,8 @@ enum {
AQH_ValueModality_Stats,
AQH_ValueModality_Light,
AQH_ValueModality_OnOff,
AQH_ValueModality_OnOffAuto
AQH_ValueModality_OnOffAuto,
AQH_ValueModality_RPM
};

View File

@@ -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)
{
if (dc) {

View File

@@ -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 *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 uint64_t AQH_DataClient_GetFirstData(AQH_DATACLIENT *dc, const char *valueName, uint64_t *dataPtr, uint64_t maxNum);

View File

@@ -20,6 +20,8 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
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 _cbEnable(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);
xo->fd=fd;
xo->fdMode=mode;
xo->flushFn=_cbFlush;
AQH_Object_SetEnableFn(o, _cbEnable);
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)
{
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);
close(xo->fd);
xo->fd=-1;
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
return GWEN_ERROR_IO;
}
}
@@ -205,40 +227,22 @@ int AQH_FdObject_FlushInput(AQH_OBJECT *o)
AQH_FDOBJECT *xo;
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) {
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);
DBG_ERROR(AQH_LOGDOMAIN, "Error on flush, closing.");
close(xo->fd);
xo->fd=-1;
return GWEN_ERROR_IO;
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
}
}
return (bytesRead>0)?1:0;
}
else {
DBG_ERROR(AQH_LOGDOMAIN, "Previous error, not reading.");
return GWEN_ERROR_IO;
return rv;
}
}
}
return GWEN_ERROR_INVALID;
return 0;
}
@@ -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);
close(xo->fd);
xo->fd=-1;
AQH_Object_EmitSignal(o, AQH_FDOBJECT_SIGNAL_CLOSED, GWEN_ERROR_IO, NULL);
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)
{
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);
}
}
}

View File

@@ -20,12 +20,15 @@ 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 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_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

View File

@@ -20,6 +20,7 @@ struct AQH_FDOBJECT {
AQH_FDOBJECT_STARTMSG_FN startMsgFn;
AQH_FDOBJECT_ENDMSG_FN endMsgFn;
AQH_FDOBJECT_FLUSH_FN flushFn;
};

View File

@@ -92,6 +92,7 @@ AQH_OBJECT *AQH_Endpoint_new(AQH_EVENT_LOOP *eventLoop, AQH_OBJECT *msgReader, A
if (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_CLOSED, AQH_ENDPOINT_SLOT_CLOSED, o);
}
return o;

View File

@@ -39,6 +39,7 @@ GWEN_INHERIT(AQH_OBJECT, AQH_MSG_READER)
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 _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 void _handleSkipping(AQH_OBJECT *o, AQH_OBJECT *fdObject);
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) {
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_CLOSED, AQH_MSGREADER_SLOT_SOCKETCLOSED, o);
}
return o;
@@ -158,11 +160,12 @@ AQH_MSG_READER *AQH_MsgReader_GetData(const AQH_OBJECT *o)
int _handleSignal(AQH_OBJECT *o,
uint32_t slotId,
AQH_OBJECT *senderObject,
GWEN_UNUSED int param1,
int param1,
GWEN_UNUSED void *param2)
{
switch(slotId) {
case AQH_MSGREADER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
case AQH_MSGREADER_SLOT_SOCKETCLOSED: return _handleSocketClosed(o, param1);
default:
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)
{
AQH_MSG_READER *xo;
xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o);
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);
_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();
}
}

View File

@@ -23,7 +23,8 @@ enum {
enum {
AQH_MSGREADER_SLOT_SOCKETREADY=1
AQH_MSGREADER_SLOT_SOCKETREADY=1,
AQH_MSGREADER_SLOT_SOCKETCLOSED
};

View File

@@ -36,6 +36,7 @@ GWEN_INHERIT(AQH_OBJECT, AQH_MSG_WRITER)
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 _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 void _endMsg(AQH_MSG_WRITER *xo, AQH_OBJECT *fdObject);
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,
uint32_t slotId,
GWEN_UNUSED AQH_OBJECT *senderObject,
GWEN_UNUSED int param1,
int param1,
GWEN_UNUSED void *param2)
{
switch(slotId) {
case AQH_MSGWRITER_SLOT_SOCKETREADY: return _handleSocketReady(o, senderObject);
case AQH_MSGWRITER_SLOT_SOCKETCLOSED: return _handleSocketClosed(o, param1);
default:
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 rv;

View File

@@ -22,7 +22,8 @@ enum {
enum {
AQH_MSGWRITER_SLOT_SOCKETREADY=1
AQH_MSGWRITER_SLOT_SOCKETREADY=1,
AQH_MSGWRITER_SLOT_SOCKETCLOSED
};

View File

@@ -107,6 +107,7 @@ int _readMsg(AQH_OBJECT *o)
AQH_MsgReader_StartSkipping(o);
}
free(msgPtr);
/* handled a message */
return 1;
}
}

View File

@@ -14,6 +14,7 @@
#include <aqhome/events2/fdobject.h>
#include <gwenhywfar/debug.h>
#include <gwenhywfar/text.h>
#include <fcntl.h>
#include <errno.h>
@@ -24,7 +25,8 @@
#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 void _endMsg(AQH_OBJECT *o);
static int _cbStartMsg(AQH_OBJECT *o);
static void _cbEndMsg(AQH_OBJECT *o);
static int _cbFlush(AQH_OBJECT *o);
static int _getAttn(int fd);
static int _setAttn(int fd, int val);
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;
o=AQH_FdObject_new(eventLoop, fd, fdMode);
AQH_FdObject_SetStartMsgFn(o, _startMsg);
AQH_FdObject_SetEndMsgFn(o, _endMsg);
AQH_FdObject_SetStartMsgFn(o, _cbStartMsg);
AQH_FdObject_SetEndMsgFn(o, _cbEndMsg);
AQH_FdObject_SetFlushFn(o, _cbFlush);
_cbFlush(o);
return o;
}
int _startMsg(AQH_OBJECT *o)
int _cbStartMsg(AQH_OBJECT *o)
{
if (o) {
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 (!(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 rv;
@@ -168,12 +234,14 @@ int AQH_TtyObject_OpenAndInitDevice(const char *device, struct termios *initialT
if (initialTermiosState)
*initialTermiosState=options;
#if 0
options.c_cflag=CLOCAL | CREAD | CS8;
options.c_iflag=IGNPAR | IGNBRK;
options.c_oflag=0;
options.c_lflag&= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cc[VTIME]=0; /* read timeout in deciseconds */
options.c_cc[VMIN]=0; /* no minimum number of receive bytes */
#endif
cfmakeraw(&options);
rv=cfsetispeed(&options, AQH_TTYOBJECT_BAUDRATE);
@@ -243,6 +311,7 @@ int _fdSetBlocking(int fd, int fl)
#if 0
int _msleep(long int msec)
{

View File

@@ -62,6 +62,13 @@
#define AQH_IPCDATA_NODE_TAGS_STATSBUSY 0x0b /* 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_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_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_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:
AQH_NodeInfo_SetStatsIoErrors(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0));
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:
DBG_INFO(AQH_LOGDOMAIN, "Unhandled tag typ %d (%02x)", tagType, tagType);
break;

View File

@@ -64,6 +64,7 @@
m_flashresponse.h
m_range.h
m_time.h
m_heartbeat.h
</headers>
@@ -93,6 +94,7 @@
m_flashresponse.c
m_range.c
m_time.c
m_heartbeat.c
</sources>

View 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));
}

View 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

View File

@@ -21,6 +21,7 @@
#include "aqhome/msg/node/m_needaddr.h"
#include "aqhome/msg/node/m_ping.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_value.h"
#include "aqhome/msg/node/m_flashstart.h"
@@ -29,6 +30,7 @@
#include "aqhome/msg/node/m_flashready.h"
#include "aqhome/msg/node/m_flashresponse.h"
#include "aqhome/msg/node/m_range.h"
#include "aqhome/msg/node/m_time.h"
#include <gwenhywfar/text.h>
@@ -202,6 +204,7 @@ const char *AQH_NodeMessage_MsgTypeToChar(uint8_t i)
switch(i) {
case AQH_MSG_TYPE_PING: return "Ping";
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_COMRECVSTATS: return "RecvStats";
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)) {
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_HEARTBEAT: AQH_HeartbeatMessage_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_NEED_ADDRESS: AQH_AddrMessage_DumpToBuffer(msg, dbuf, sText); break;

View File

@@ -29,6 +29,7 @@
#define AQH_MSG_TYPE_PING 10
#define AQH_MSG_TYPE_PONG 11
#define AQH_MSG_TYPE_HEARTBEAT 12
#define AQH_MSG_TYPE_COMSENDSTATS 22
#define AQH_MSG_TYPE_COMRECVSTATS 23
#define AQH_MSG_TYPE_TWIBUSMEMBER 30

View File

@@ -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)
{
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",
AQH_NodeMessage_GetSourceAddress(msg),
AQH_NodeMessage_GetDestAddress(msg),

View File

@@ -134,6 +134,56 @@
<flags></flags>
</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">
<default>NULL</default>
<preset>NULL</preset>

View File

@@ -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
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)
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:
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
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
----------+------------------------------------------------+-----------+----------------------------------
@@ -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.
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
View File

@@ -0,0 +1,15 @@
<?xml?>
<gwbuild>
<subdirs>
</subdirs>
<extradist>
main.asm
</extradist>
</gwbuild>

150
avr/apps/co2_watch/main.asm Normal file
View 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

View File

@@ -108,8 +108,8 @@ appDoorSendValue_send:
ldi r17, VALUE_ID_TCRT1K ; VALUE ID
ldi r22, AQHOME_VALUETYPE_DOOR ; VALUE TYPE
rcall Main_Send8BitValueReport
#ifdef MODULES_LED_ACTIVITY
rcall LedActivity_Trigger ; (r16)
#ifdef MODULES_LED1
rcall Led1_SetActivityTiming ; (r16)
#endif
ret
; @end

View 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

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,15 @@
<?xml?>
<gwbuild>
<subdirs>
</subdirs>
<extradist>
main.asm
</extradist>
</gwbuild>

View 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

View 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

View 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

View 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

View File

@@ -1,5 +1,5 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; copyright : (C) 2026 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
@@ -16,10 +16,12 @@
appMotionLightDataBegin:
appMotionLightSources: .byte APP_MOTIONLIGHT_SOURCE_NUM*APP_MOTIONLIGHT_SOURCE_SIZE
appMotionLightLSourceAddr: .byte 1
appMotionLightLSourceValueId: .byte 1
appMotionLightSettings:
appMotionLightOnTime: .byte 2
appMotionLightMSources: .byte APP_MOTIONLIGHT_SOURCE_NUM*APP_MOTIONLIGHT_SOURCE_SIZE
appMotionLightLSource: .byte APP_MOTIONLIGHT_SOURCE_SIZE
appMotionLightLSourceValue: .byte 2
appMotionLightLastBrightness: .byte 2
appMotionLightFlags: .byte 1
appMotionLightDataEnd:

View File

@@ -23,3 +23,17 @@
.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