X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fgraphics.c;h=8dbad904387810272212b1bcfcc30349dca6646f;hb=HEAD;hp=9922e1dbf0e796aedc394d642321a8d1693c5805;hpb=b3aee261c6e1e1cff68133443412ec9494b036ac;p=citadel.git diff --git a/webcit/graphics.c b/webcit/graphics.c index 9922e1dbf..98b063115 100644 --- a/webcit/graphics.c +++ b/webcit/graphics.c @@ -1,108 +1,196 @@ +// Handles HTTP upload of graphics files into the system. +// +// Copyright (c) 1996-2022 by the citadel.org team +// +// This program is open source software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "webcit.h" -void display_graphics_upload(char *description, char *check_cmd, char *uplurl) -{ - char buf[SIZ]; +extern void output_static(const char* What); + + +// display the picture (icon, photo, whatever) associated with the current room +void display_roompic(void) { + off_t bytes; + StrBuf *Buf = NewStrBuf(); + serv_printf("DLRI"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 6) { + StrBufCutLeft(Buf, 4); + bytes = StrBufExtract_long(Buf, 0, '|'); + StrBuf *content_type = NewStrBuf(); + StrBufExtract_token(content_type, Buf, 3, '|'); + WC->WBuf = NewStrBuf(); + StrBuf_ServGetBLOBBuffered(WC->WBuf, bytes); + http_transmit_thing(ChrPtr(content_type), 0); + FreeStrBuf(&content_type); + } + else { + output_error_pic("", ""); + } + FreeStrBuf(&Buf); +} - serv_puts(check_cmd); - serv_gets(buf); - if (buf[0] != '2') { - display_error(&buf[4]); + +// upload the picture (icon, photo, whatever) associated with the current room +void common_code_for_editroompic_and_editpic(char *servcmd) { + if (havebstr("cancel_button")) { + AppendImportantMessage(_("Graphics upload has been cancelled."), -1); + display_main_menu(); return; } - output_headers(3); - - svprintf("BOXTITLE", WCS_STRING, "Set/change your photo"); - do_template("beginbox"); - - wprintf("
\n"); - - wprintf("
\n", uplurl); - - wprintf("\n"); - - wprintf("You can upload any image directly from your computer,\n"); - wprintf("as long as it is in GIF format (JPEG, PNG, etc. won't\n"); - wprintf("work).

\n"); - - wprintf("Please select a file to upload:

\n"); - wprintf("\n"); - wprintf("

"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("
\n"); - wprintf("
\n"); - do_template("endbox"); - wDumpContent(1); + + if (WC->upload_length == 0) { + AppendImportantMessage(_("You didn't upload a file."), -1); + display_main_menu(); + return; + } + + serv_printf("%s %ld|%s", servcmd, (long)WC->upload_length, GuessMimeType(ChrPtr(WC->upload), WC->upload_length)); + StrBuf *Line = NewStrBuf(); + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 0, 0) == 7) { + serv_write(ChrPtr(WC->upload), WC->upload_length); + display_success(ChrPtr(Line) + 4); + } + else { + AppendImportantMessage((ChrPtr(Line) + 4), -1); + display_main_menu(); + } + FreeStrBuf(&Line); } -void do_graphics_upload(char *upl_cmd) -{ - char buf[SIZ]; + +// upload the picture (icon, photo, whatever) associated with the current room +void editroompic(void) { + common_code_for_editroompic_and_editpic("ULRI"); +} + + +// upload the picture (icon, photo, whatever) associated with the current user +void editpic(void) { + common_code_for_editroompic_and_editpic("ULUI"); +} + + +// display the screen for uploading graphics to the server +void display_graphics_upload(char *filename) { + output_headers(1, 0, 0, 0, 1, 0); + do_template("files_graphicsupload"); + end_burst(); +} + + +void do_graphics_upload(char *filename) { + StrBuf *Line; + const char *MimeType; + wcsession *WCC = WC; int bytes_remaining; int pos = 0; int thisblock; + bytes_remaining = WCC->upload_length; - if (!strcasecmp(bstr("sc"), "Cancel")) { + if (havebstr("cancel_button")) { + AppendImportantMessage(_("Graphics upload has been cancelled."), -1); display_main_menu(); return; } - if (WC->upload_length == 0) { - display_error("You didn't upload a file.\n"); + if (WCC->upload_length == 0) { + AppendImportantMessage(_("You didn't upload a file."), -1); + display_main_menu(); return; } - serv_puts(upl_cmd); - serv_gets(buf); - if (buf[0] != '2') { - display_error(&buf[4]); + + MimeType = GuessMimeType(ChrPtr(WCC->upload), bytes_remaining); + serv_printf("UIMG 1|%s|%s", MimeType, filename); + + Line = NewStrBuf(); + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) { + display_main_menu(); + FreeStrBuf(&Line); return; } - bytes_remaining = WC->upload_length; while (bytes_remaining) { thisblock = ((bytes_remaining > 4096) ? 4096 : bytes_remaining); serv_printf("WRIT %d", thisblock); - serv_gets(buf); - if (buf[0] != '7') { - display_error(&buf[4]); + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 1, 7) != 7) { serv_puts("UCLS 0"); - serv_gets(buf); + StrBuf_ServGetln(Line); + display_main_menu(); + FreeStrBuf(&Line); return; } - thisblock = extract_int(&buf[4], 0); - serv_write(&WC->upload[pos], thisblock); - pos = pos + thisblock; - bytes_remaining = bytes_remaining - thisblock; + thisblock = extract_int(ChrPtr(Line) +4, 0); + serv_write(&ChrPtr(WCC->upload)[pos], thisblock); + pos += thisblock; + bytes_remaining -= thisblock; } serv_puts("UCLS 1"); - serv_gets(buf); - if (buf[0] != 'x') { - display_success(&buf[4]); - return; + StrBuf_ServGetln(Line); + if (*ChrPtr(Line) != 'x') { + display_success(ChrPtr(Line) + 4); + } + FreeStrBuf(&Line); + +} + + +void edithellopic(void) { do_graphics_upload("hello"); } +void editgoodbyepic(void) { do_graphics_upload("UIMG 1|%s|goodbye"); } + +// The user's photo display / upload facility +void display_editpic(void) { + putbstr("__PICDESC", NewStrBufPlain(_("your photo"), -1)); + putbstr("__UPLURL", NewStrBufPlain(HKEY("editpic"))); + display_graphics_upload("editpic"); +} + +// room picture dispay / upload facility +void display_editroompic(void) { + putbstr("__PICDESC", NewStrBufPlain(_("the icon for this room"), -1)); + putbstr("__UPLURL", NewStrBufPlain(HKEY("editroompic"))); + display_graphics_upload("editroompic"); +} + +// the login page graphics +void display_edithello(void) { + putbstr("__WHICHPIC", NewStrBufPlain(HKEY("hello"))); + putbstr("__PICDESC", NewStrBufPlain(_("graphics to be displayed on the login screen"), -1)); + putbstr("__UPLURL", NewStrBufPlain(HKEY("edithellopic"))); + display_graphics_upload("edithellopic"); +} + +// the logoff banner +void display_editgoodbyepic(void) { + putbstr("__WHICHPIC", NewStrBufPlain(HKEY("UIMG 0|%s|goodbye"))); + putbstr("__PICDESC", NewStrBufPlain(_("the Logoff banner picture"), -1)); + putbstr("__UPLURL", NewStrBufPlain(HKEY("editgoodbyepic"))); + display_graphics_upload("editgoodbyepic"); +} + + +void +InitModule_GRAPHICS +(void) +{ + WebcitAddUrlHandler(HKEY("display_editpic"), "", 0, display_editpic, 0); + WebcitAddUrlHandler(HKEY("editpic"), "", 0, editpic, 0); + WebcitAddUrlHandler(HKEY("display_editroompic"), "", 0, display_editroompic, 0); + WebcitAddUrlHandler(HKEY("editroompic"), "", 0, editroompic, 0); + WebcitAddUrlHandler(HKEY("display_edithello"), "", 0, display_edithello, 0); + WebcitAddUrlHandler(HKEY("edithellopic"), "", 0, edithellopic, 0); + WebcitAddUrlHandler(HKEY("display_editgoodbye"), "", 0, display_editgoodbyepic, 0); + WebcitAddUrlHandler(HKEY("editgoodbyepic"), "", 0, editgoodbyepic, 0); + WebcitAddUrlHandler(HKEY("roompic"), "", 0, display_roompic, 0); }