67bffacca95551081f1698f7ff46fbe914977e12
[citadel.git] / webcit / mainmenu.c
1 /*
2  * $Id$
3  */
4
5 #include "webcit.h"
6
7 /*
8  * The Main Menu
9  */
10 void display_main_menu(void)
11 {
12         begin_burst();
13         output_headers(1, 0, 0, 0, 1, 0);
14         DoTemplate(HKEY("display_main_menu"), NULL, &NoCtx);
15         end_burst();
16 }
17
18
19 /*
20  * System administration menu
21  */
22 void display_aide_menu(void)
23 {
24         begin_burst();
25         output_headers(1, 0, 0, 0, 1, 0);
26         DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
27         end_burst();
28 }
29
30
31 /*
32  * Interactive window to perform generic Citadel server commands.
33  */
34 void do_generic(void)
35 {
36         WCTemplputParams SubTP;
37         int Done = 0;
38         StrBuf *Buf;
39         StrBuf *LineBuf;
40         char *junk;
41         size_t len;
42
43         if (!havebstr("sc_button")) {
44                 display_main_menu();
45                 return;
46         }
47
48         memset(&SubTP, 0, sizeof(WCTemplputParams));
49         Buf = NewStrBuf();
50         serv_puts(bstr("g_cmd"));
51         StrBuf_ServGetln(Buf);
52         
53         switch (GetServerStatus(Buf, NULL)) {
54         case 8:
55                 serv_puts("\n\n000");
56                 if ( (StrLength(Buf)==3) && 
57                      !strcmp(ChrPtr(Buf), "000")) {
58                         StrBufAppendBufPlain(Buf, HKEY("\000"), 0);
59                         break;
60                 }
61         case 1:
62                 LineBuf = NewStrBuf();
63                 StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
64                 while (!Done) {
65                         StrBuf_ServGetln(LineBuf);
66                         if ( (StrLength(LineBuf)==3) && 
67                              !strcmp(ChrPtr(LineBuf), "000")) {
68                                 Done = 1;
69                         }
70                         StrBufAppendBuf(Buf, LineBuf, 0);
71                         StrBufAppendBufPlain(Buf, HKEY("\n"), 0);
72                 }
73                 FreeStrBuf(&LineBuf);
74                 break;
75         case 2:
76                 break;
77         case 4:
78                 text_to_server(bstr("g_input"));
79                 serv_puts("000");
80                 break;
81         case 6:
82                 len = atol(&ChrPtr(Buf)[4]);
83                 StrBuf_ServGetBLOBBuffered(Buf, len);
84                 break;
85         case 7:
86                 len = atol(&ChrPtr(Buf)[4]);
87                 junk = malloc(len);
88                 memset(junk, 0, len);
89                 serv_write(junk, len);
90                 free(junk);
91                 break;
92         }
93         
94         begin_burst();
95         output_headers(1, 0, 0, 0, 1, 0);
96
97         SubTP.Filter.ContextType = CTX_STRBUF;
98         SubTP.Context = Buf;
99
100         DoTemplate(HKEY("aide_display_generic_result"), NULL, &SubTP);
101
102         wDumpContent(1);
103
104         FreeStrBuf(&Buf);
105 }
106
107 /*
108  * Display the wait / input dialog while restarting the server.
109  */
110 void display_shutdown(void)
111 {
112         char buf[SIZ];
113         char *when;
114         
115         when=bstr("when");
116         if (strcmp(when, "now") == 0){
117                 serv_printf("DOWN 1");
118                 serv_getln(buf, sizeof buf);
119                 if (atol(buf) == 500)
120                 { /* upsie. maybe the server is not running as daemon? */
121                         
122                         safestrncpy(WC->ImportantMessage,
123                                     &buf[4],
124                                     sizeof WC->ImportantMessage);
125                 }
126                 begin_burst();
127                 output_headers(1, 0, 0, 0, 1, 0);
128                 DoTemplate(HKEY("aide_display_serverrestart"), NULL, &NoCtx);
129                 end_burst();
130                 lingering_close(WC->Hdr->http_sock);
131                 sleeeeeeeeeep(10);
132                 serv_printf("NOOP");
133                 serv_printf("NOOP");
134         }
135         else if (strcmp(when, "page") == 0) {
136                 char *message;
137                
138                 message = bstr("message");
139                 if ((message == NULL) || (IsEmptyStr(message)))
140                 {
141                         begin_burst();
142                         output_headers(1, 0, 0, 0, 1, 0);
143                         DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
144                         end_burst();
145                 }
146                 else
147                 {
148                         serv_printf("SEXP broadcast|%s", message);
149                         serv_getln(buf, sizeof buf); /* TODO: should we care? */
150                         begin_burst();
151                         output_headers(1, 0, 0, 0, 1, 0);
152                         DoTemplate(HKEY("aide_display_serverrestart_page"), NULL, &NoCtx);
153                         end_burst();                    
154                 }
155         }
156         else if (!strcmp(when, "idle")) {
157                 serv_printf("SCDN 3");
158                 serv_getln(buf, sizeof buf);
159
160                 if (atol(buf) == 500)
161                 { /* upsie. maybe the server is not running as daemon? */
162                         safestrncpy(WC->ImportantMessage,
163                                     &buf[4],
164                                     sizeof WC->ImportantMessage);
165                 }
166                 begin_burst();
167                 output_headers(1, 0, 0, 0, 1, 0);
168                 DoTemplate(HKEY("aide_display_menu"), NULL, &NoCtx);
169                 end_burst();                    
170         }
171 }
172
173 void 
174 InitModule_MAINMENU
175 (void)
176 {
177         WebcitAddUrlHandler(HKEY("display_aide_menu"), "", 0, display_aide_menu, 0);
178         WebcitAddUrlHandler(HKEY("server_shutdown"), "", 0, display_shutdown, 0);
179         WebcitAddUrlHandler(HKEY("display_main_menu"), "", 0, display_main_menu, 0);
180         WebcitAddUrlHandler(HKEY("do_generic"), "", 0, do_generic, 0);
181 }