]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
* tiny 'file'-extract, now we can detect the type of an image. and set the mimetype...
[citadel.git] / webcit / webcit.c
index 580772a803970833ffd070db807567fedc9d171a..67ed35c212eb393005d22acbbead1c5f376c4bfe 100644 (file)
@@ -538,14 +538,15 @@ void output_headers(      int do_httpheaders,     /**< 1 = output HTTP headers
 
                /** check for ImportantMessages (these display in a div overlaying the main screen) */
                if (!IsEmptyStr(WC->ImportantMessage)) {
-                       wprintf("<div id=\"important_message\">\n");
-                       wprintf("<span class=\"imsg\">"
-                               "%s</span><br />\n", WC->ImportantMessage);
-                       wprintf("</div>\n");
-                       wprintf("<script type=\"text/javascript\">\n"
-                               "        setTimeout('hide_imsg_popup()', 3000); \n"
+                       wprintf("<div id=\"important_message\">\n"
+                               "<span class=\"imsg\">");
+                       escputs(WC->ImportantMessage);
+                       wprintf("</span><br />\n"
+                               "</div>\n"
+                               "<script type=\"text/javascript\">\n"
+                               "        setTimeout('hide_imsg_popup()', 5000); \n"
                                "</script>\n");
-                       safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage);
+                       WC->ImportantMessage[0] = 0;
                }
 
                if ( (WC->logged_in) && (!unset_cookies) ) {
@@ -588,7 +589,7 @@ void http_redirect(char *whichpage) {
 /**
  * \brief Output a piece of content to the web browser
  */
-void http_transmit_thing(char *thing, size_t length, char *content_type,
+void http_transmit_thing(char *thing, size_t length, const char *content_type,
                         int is_static) {
 
        output_headers(0, 0, 0, 0, 0, is_static);
@@ -763,6 +764,43 @@ void output_static(char *what)
 }
 
 
+
+typedef struct _MimeGuess {
+       const char *Pattern;
+       size_t PatternLen;
+       long PatternOffset;
+       const char *MimeString;
+} MimeGuess;
+
+MimeGuess MyMimes [] = {
+       {
+               "GIF",
+               3,
+               0,
+               "image/gif"
+       },
+       {
+               "\xff\xd8",
+               2,
+               0,
+               "image/jpeg"
+       },
+       {
+               "\x89PNG",
+               4,
+               0,
+               "image/png"
+       },
+       { // last...
+               "",
+               0,
+               0,
+               ""
+       }
+};
+
+
+
 /**
  * \brief When the browser requests an image file from the Citadel server,
  * this function is called to transmit it.
@@ -772,6 +810,7 @@ void output_image()
        char buf[SIZ];
        char *xferbuf = NULL;
        off_t bytes;
+       int MimeIndex = 0;
 
        serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
        serv_getln(buf, sizeof buf);
@@ -784,22 +823,37 @@ void output_image()
                serv_puts("CLOS");
                serv_getln(buf, sizeof buf);
 
+               while (MyMimes[MimeIndex].PatternLen != 0)
+               {
+                       if (strncmp(MyMimes[MimeIndex].Pattern, 
+                                   &xferbuf[MyMimes[MimeIndex].PatternOffset], 
+                                   MyMimes[MimeIndex].PatternLen) == 0)
+                               break;
+                       MimeIndex ++;
+               }
+
                /** Write it to the browser */
-               http_transmit_thing(xferbuf, (size_t)bytes, "image/gif", 0);
+               if (MyMimes[MimeIndex].PatternLen != 0)
+               {
+                       http_transmit_thing(xferbuf, 
+                                           (size_t)bytes, 
+                                           MyMimes[MimeIndex].MimeString, 
+                                           0);
+                       free(xferbuf);
+                       return;
+               }
+               /* hm... unknown mimetype? fallback to blank gif */
                free(xferbuf);
+       } 
 
-       } else {
-               /**
-                * Instead of an ugly 404, send a 1x1 transparent GIF
-                * when there's no such image on the server.
-                */
-               char blank_gif[SIZ];
-               snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif");
-               output_static(blank_gif);
-       }
-
-
-
+       
+       /**
+        * Instead of an ugly 404, send a 1x1 transparent GIF
+        * when there's no such image on the server.
+        */
+       char blank_gif[SIZ];
+       snprintf (blank_gif, SIZ, "%s%s", static_dirs[0], "/blank.gif");
+       output_static(blank_gif);
 }
 
 /**
@@ -1695,18 +1749,35 @@ void session_loop(struct httprequest *req)
                delete_room();
        } else if (!strcasecmp(action, "validate")) {
                validate();
+               /* The users photo display / upload facility */
        } else if (!strcasecmp(action, "display_editpic")) {
                display_graphics_upload(_("your photo"),
                                        "UIMG 0|_userpic_",
                                        "editpic");
        } else if (!strcasecmp(action, "editpic")) {
                do_graphics_upload("UIMG 1|_userpic_");
+                /* room picture dispay / upload facility */
        } else if (!strcasecmp(action, "display_editroompic")) {
                display_graphics_upload(_("the icon for this room"),
                                        "UIMG 0|_roompic_",
                                        "editroompic");
        } else if (!strcasecmp(action, "editroompic")) {
                do_graphics_upload("UIMG 1|_roompic_");
+               /* the greetingpage hello pic */
+       } else if (!strcasecmp(action, "display_edithello")) {
+               display_graphics_upload(_("the Greetingpicture for the login prompt"),
+                                       "UIMG 0|hello.gif",
+                                       "edithellopic");
+       } else if (!strcasecmp(action, "edithellopic")) {
+               do_graphics_upload("UIMG 1|hello.gif");
+               /* the logoff banner */
+       } else if (!strcasecmp(action, "display_editgoodbyepic")) {
+               display_graphics_upload(_("the Logoff banner picture"),
+                                       "UIMG 0|goodbuye.gif",
+                                       "editgoodbuyepic");
+       } else if (!strcasecmp(action, "editgoodbuyepic")) {
+               do_graphics_upload("UIMG 1|goodbuye.gif");
+
        } else if (!strcasecmp(action, "delete_floor")) {
                delete_floor();
        } else if (!strcasecmp(action, "rename_floor")) {