r7023: reduced the number of warnings in building ejs and esp
[sfrench/samba-autobuild/.git] / source4 / web_server / esp / espProcs.c
1 /*
2  *      @file   espProcs.c
3  *      @brief  Embedded Server Pages (ESP) Procedures.
4  *      @overview These ESP procedures can be used in ESP pages for common tasks.
5  */
6 /********************************* Copyright **********************************/
7 /*
8  *      @copy   default
9  *      
10  *      Copyright (c) Mbedthis Software LLC, 2003-2005. All Rights Reserved.
11  *      
12  *      This software is distributed under commercial and open source licenses.
13  *      You may use the GPL open source license described below or you may acquire 
14  *      a commercial license from Mbedthis Software. You agree to be fully bound 
15  *      by the terms of either license. Consult the LICENSE.TXT distributed with 
16  *      this software for full details.
17  *      
18  *      This software is open source; you can redistribute it and/or modify it 
19  *      under the terms of the GNU General Public License as published by the 
20  *      Free Software Foundation; either version 2 of the License, or (at your 
21  *      option) any later version. See the GNU General Public License for more 
22  *      details at: http://www.mbedthis.com/downloads/gplLicense.html
23  *      
24  *      This program is distributed WITHOUT ANY WARRANTY; without even the 
25  *      implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
26  *      
27  *      This GPL license does NOT permit incorporating this software into 
28  *      proprietary programs. If you are unable to comply with the GPL, you must
29  *      acquire a commercial license to use this software. Commercial licenses 
30  *      for this software and support services are available from Mbedthis 
31  *      Software at http://www.mbedthis.com 
32  *      
33  *      @end
34  */
35 /********************************** Includes **********************************/
36
37 #include        "esp.h"
38
39 /************************************ Code ************************************/
40 #if BLD_FEATURE_ESP_MODULE
41 #if BLD_FEATURE_SESSION
42 /*
43  *      destroySession
44  */
45
46 static int destroySessionProc(EspRequest *ep, int argc, char **argv)
47 {
48         ep->esp->destroySession(ep->requestHandle);
49         return 0;
50 }
51
52 #endif  /* BLD_FEATURE_SESSION */
53
54 /******************************************************************************/
55 /*
56  *      include
57  *
58  *      This includes javascript libraries. For example:
59  *
60  *              <% include("file", ...); %> 
61  *
62  *      Don't confuse with ESP includes:
63  *
64  *              <% include file.esp %>
65  *
66  *      Filenames are relative to the base document including the file.
67  *      FUTURE -- move back to EJS. Only here now because we need ep->readFile.
68  */ 
69
70 static int includeProc(EspRequest *ep, int argc, char **argv)
71 {
72         const Esp               *esp;
73         char    path[MPR_MAX_FNAME], dir[MPR_MAX_FNAME];
74         char    *emsg, *buf;
75         int             size, i;
76
77         esp = ep->esp;
78         mprAssert(argv);
79         for (i = 0; i < argc; i++) {
80                 if (argv[i][0] != '/') {
81                         mprGetDirName(dir, sizeof(dir), ep->docPath);
82                         mprSprintf(path, sizeof(path), "%s/%s", dir, argv[i]);
83                 } else {
84                         mprSprintf(path, sizeof(path), "%s", argv[i]);
85                 }
86                 
87                 if (esp->readFile(ep->requestHandle, &buf, &size, path) < 0) {
88                         espError(ep, "Can't read include file: %s", path);
89                         return MPR_ERR_CANT_ACCESS;
90                 }
91                 buf[size] = '\0';
92
93                 if (ejsEvalScript(espGetScriptHandle(ep), buf, 0, &emsg) < 0) {
94                         espError(ep, "Cant evaluate script");
95                         mprFree(buf);
96                         return -1;
97                 }
98                 mprFree(buf);
99         }
100         return 0;
101 }
102
103 /******************************************************************************/
104 /*
105  *      redirect
106  *
107  *      This implemements <% redirect(url, code); %> command. The redirection 
108  *      code is optional.
109  */ 
110
111 static int redirectProc(EspRequest *ep, int argc, char **argv)
112 {
113         char    *url;
114         int             code;
115
116         if (argc < 1) {
117                 espError(ep, "Bad args");
118                 return MPR_ERR_BAD_ARGS;
119         }
120         url = argv[0];
121         if (argc == 2) {
122                 code = atoi(argv[1]);
123         } else {
124                 code = 302;
125         }
126         espRedirect(ep, code, url);
127         return 0;
128 }
129
130 /******************************************************************************/
131 #if BLD_FEATURE_SESSION
132 /*
133  *      useSession
134  */
135
136 static int useSessionProc(EspRequest *ep, int argc, char **argv)
137 {
138         int                     timeout;
139
140         if (argc > 1) {
141                 espError(ep, "Bad args");
142                 return MPR_ERR_BAD_ARGS;
143
144         } else if (argc == 1) {
145                 timeout = atoi(argv[0]);
146         } else {
147                 timeout = 0;
148         }
149         
150         ep->esp->createSession(ep->requestHandle, timeout);
151         espSetReturnString(ep, ep->esp->getSessionId(ep->requestHandle));
152         return 0;
153 }
154
155 #endif /* BLD_FEATURE_SESSION */
156 /******************************************************************************/
157 /*
158  *      setHeader
159  *
160  *      This implemements <% setHeader("key: value", allowMultiple); %> command.
161  */ 
162
163 static int setHeaderProc(EspRequest *ep, int argc, char **argv)
164 {
165         mprAssert(argv);
166         if (argc != 2) {
167                 espError(ep, "Bad args");
168                 return MPR_ERR_BAD_ARGS;
169         }
170         ep->esp->setHeader(ep->requestHandle, argv[0], atoi(argv[1]));
171         return 0;
172 }
173
174 /******************************************************************************/
175 /*
176  *      write
177  *
178  *      This implemements <% write("text"); %> command.
179  */ 
180
181 static int writeProc(EspRequest *ep, int argc, char **argv)
182 {
183         char    *s;
184         int             i, len;
185
186         mprAssert(argv);
187         for (i = 0; i < argc; i++) {
188                 s = argv[i];
189                 len = strlen(s);
190                 if (len > 0) {
191                         if (espWrite(ep, s, len) != len) {
192                                 espError(ep, "Can't write to client");
193                                 return -1;
194                         }
195                 }
196         }
197         return 0;
198 }
199
200 /******************************************************************************/
201
202 void espRegisterProcs()
203 {
204         espDefineStringCFunction(0, "write", writeProc, 0);
205         espDefineStringCFunction(0, "setHeader", setHeaderProc, 0);
206         espDefineStringCFunction(0, "redirect", redirectProc, 0);
207         espDefineStringCFunction(0, "include", includeProc, 0);
208
209 #if BLD_FEATURE_SESSION
210         /*
211          *      Create and use are synonomous
212          */
213         espDefineStringCFunction(0, "useSession", useSessionProc, 0);
214         espDefineStringCFunction(0, "createSession", useSessionProc, 0);
215         espDefineStringCFunction(0, "destroySession", destroySessionProc, 0);
216 #endif
217 }
218
219 /******************************************************************************/
220
221 #else
222 void mprEspControlsDummy() {}
223
224 #endif /* BLD_FEATURE_ESP_MODULE */
225
226 /*
227  * Local variables:
228  * tab-width: 4
229  * c-basic-offset: 4
230  * End:
231  * vim:tw=78
232  * vim600: sw=4 ts=4 fdm=marker
233  * vim<600: sw=4 ts=4
234  */