]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
* add way to have tokens do their custom parse-time preevaluation; this involves...
[citadel.git] / webcit / webcit.c
index 869793a2c2ace1b4c524d9d388b99c2e3c2dbaef..013e38cd440fe5d206a6d2553564afd865e6cd74 100644 (file)
@@ -209,8 +209,7 @@ void output_headers(        int do_httpheaders,     /* 1 = output HTTP headers
                        FlushStrBuf(WCC->ImportantMsg);
                }
                if ( (WCC->logged_in) && (!unset_cookies) ) {
-                       /*DoTemplate(HKEY("iconbar"), NULL, &NoCtx);*/
-                       page_popup();
+                       DoTemplate(HKEY("paging"), NULL, &NoCtx);
                }
 
                if (do_room_banner == 1) {
@@ -273,41 +272,6 @@ void http_transmit_thing(const char *content_type,
        end_burst();
 }
 
-/*
- * print menu box like used in the floor view or admin interface.
- * This function takes pair of strings as va_args, 
- * Title       Title string of the box
- * Class       CSS Class for the box
- * nLines      How many string pairs should we print? (URL, UrlText)
- * ...         Pairs of URL Strings and their Names
- */
-void print_menu_box(char* Title, char *Class, int nLines, ...)
-{
-       va_list arg_list;
-       long i;
-       
-       svput("BOXTITLE", WCS_STRING, Title);
-       do_template("beginboxx", NULL);
-       
-       wprintf("<ul class=\"%s\">", Class);
-       
-       va_start(arg_list, nLines);
-       for (i = 0; i < nLines; ++i)
-       { 
-               wprintf("<li><a href=\"%s\">", va_arg(arg_list, char *));
-               wprintf((char *) va_arg(arg_list, char *));
-               wprintf("</a></li>\n");
-       }
-       va_end (arg_list);
-       
-       wprintf("</a></li>\n");
-       
-       wprintf("</ul>");
-       
-       do_template("endbox", NULL);
-}
-
-
 
 /*
  * Convenience functions to display a page containing only a string
@@ -519,7 +483,6 @@ void seconds_since_last_gexp(void)
 
 void ReadPostData(void)
 {
-       const char *content_end = NULL;
        int body_start = 0;
        wcsession *WCC = WC;
        StrBuf *content = NULL;
@@ -547,18 +510,63 @@ void ReadPostData(void)
                StrBufCutLeft(content, body_start);
                ParseURLParams(content);
        } else if (!strncasecmp(ChrPtr(WCC->Hdr->HR.ContentType), "multipart", 9)) {
-               content_end = ChrPtr(content) + 
-                       WCC->Hdr->HR.ContentLength + 
-                       body_start;
-               mime_parser(ChrPtr(content), content_end, *upload_handler, NULL, NULL, NULL, 0);
+               char *Buf;
+               char *BufEnd;
+               long len;
+
+               len = StrLength(content);
+               Buf = SmashStrBuf(&content);
+               BufEnd = Buf + len;
+               mime_parser(Buf, BufEnd, *upload_handler, NULL, NULL, NULL, 0);
+               free(Buf);
        } else if (WCC->Hdr->HR.ContentLength > 0) {
                WCC->upload = content;
+               WCC->upload_length = StrLength(WCC->upload);
                content = NULL;
        }
        FreeStrBuf(&content);
 }
 
 
+void ParseREST_URL(void)
+{
+       StrBuf *Buf;
+       StrBuf *pFloor = NULL;
+       wcsession *WCC = WC;
+       long i = 0;
+       const char *pCh = NULL;
+       HashList *Floors;
+       void *vFloor;
+
+       WCC->Directory = NewHash(1, Flathash);
+
+       Buf = NewStrBuf();
+       while (StrBufExtract_NextToken(WCC->Hdr->HR.ReqLine, 
+                                      Buf, &pCh,  '/') >= 0)
+       {
+               Put(WCC->Directory, IKEY(i), Buf, HFreeStrBuf);
+               if (i==0)
+                       pFloor = Buf;
+               i++;
+               Buf = NewStrBuf();
+       }
+       if (i == 0)
+               FreeStrBuf(&Buf);
+       else if (pFloor != NULL)
+       {
+               Floors = GetFloorListHash(NULL, NULL);
+               
+               if (Floors != NULL)
+               {
+                       if (GetHash(Floors, SKEY(pFloor), &vFloor))
+                               WCC->CurrentFloor = (floor*) vFloor;
+               }
+       }
+}
+
+
+
+
 /*
  * Entry point for WebCit transaction
  */
@@ -687,6 +695,10 @@ void session_loop(void)
                        display_login(NULL);
                }
                else {
+/*
+                       if ((WCC->Hdr->HR.Handler->Flags & PARSE_REST_URL) != 0)
+                               ParseREST_URL();
+*/
                        if ((WCC->Hdr->HR.Handler->Flags & AJAX) != 0)
                                begin_ajax_response();
                        WCC->Hdr->HR.Handler->F();
@@ -792,9 +804,9 @@ InitModule_WEBCIT
 
        WebcitAddUrlHandler(HKEY("401"), authorization_required, ANONYMOUS|COOKIEUNNEEDED);
        RegisterConditional(HKEY("COND:IMPMSG"), 0, ConditionalImportantMesage, CTX_NONE);
-       RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, CTX_NONE);
-       RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, CTX_NONE);
-       RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, CTX_NONE);
+       RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, NULL, CTX_NONE);
+       RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, NULL, CTX_NONE);
+       RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, NULL, CTX_NONE);
 
        snprintf(dir, SIZ, "%s/webcit.css", static_local_dir);
        if (!access(dir, R_OK)) {
@@ -837,11 +849,11 @@ void
 SessionDetachModule_WEBCIT
 (wcsession *sess)
 {
-       DeleteHash(&sess->Hdr->urlstrings);// TODO?
-       if (sess->upload_length > 0) {
-               FreeStrBuf(&sess->upload);
-               sess->upload_length = 0;
-       }
+       DeleteHash(&sess->Directory);
+
+       FreeStrBuf(&sess->upload);
+       sess->upload_length = 0;
+       
        FreeStrBuf(&sess->trailing_javascript);
 
        if (StrLength(sess->WBuf) > SIZ * 30) /* Bigger than 120K? release. */