X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fdownloads.c;h=6e6c9b981b5ebf0acf8bc46dc664fc9630956acd;hb=HEAD;hp=5701caeb834041af93c5a8182dfa936eece15752;hpb=f5c1330914acc193f96892efc191a32ee537dfb5;p=citadel.git diff --git a/webcit/downloads.c b/webcit/downloads.c index 5701caeb8..9b7dde993 100644 --- a/webcit/downloads.c +++ b/webcit/downloads.c @@ -1,22 +1,21 @@ /* - * Copyright (c) 1996-2010 by the citadel.org team + * Copyright (c) 1996-2012 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "webcit.h" -#include "webserver.h" + + +CtxType CTX_FILELIST = CTX_NONE; + +extern void output_static(const char* What); extern char* static_dirs[]; @@ -41,22 +40,22 @@ void FreeFiles(void *vFile) /* -------------------------------------------------------------------------------- */ void tmplput_FILE_NAME(StrBuf *Target, WCTemplputParams *TP) { - FileListStruct *F = (FileListStruct*) CTX; + FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST); StrBufAppendTemplate(Target, TP, F->Filename, 0); } void tmplput_FILE_SIZE(StrBuf *Target, WCTemplputParams *TP) { - FileListStruct *F = (FileListStruct*) CTX; + FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST); StrBufAppendPrintf(Target, "%ld", F->FileSize); } void tmplput_FILEMIMETYPE(StrBuf *Target, WCTemplputParams *TP) { - FileListStruct *F = (FileListStruct*) CTX; + FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST); StrBufAppendTemplate(Target, TP, F->MimeType, 0); } void tmplput_FILE_COMMENT(StrBuf *Target, WCTemplputParams *TP) { - FileListStruct *F = (FileListStruct*) CTX; + FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST); StrBufAppendTemplate(Target, TP, F->Comment, 0); } @@ -64,7 +63,7 @@ void tmplput_FILE_COMMENT(StrBuf *Target, WCTemplputParams *TP) int Conditional_FILE_ISPIC(StrBuf *Target, WCTemplputParams *TP) { - FileListStruct *F = (FileListStruct*) CTX; + FileListStruct *F = (FileListStruct*) CTX(CTX_FILELIST); return F->IsPic; } @@ -186,7 +185,7 @@ HashList* LoadFileList(StrBuf *Target, WCTemplputParams *TP) int sequence = 0; char buf[1024]; CompareFunc SortIt; - int HavePic; + int HavePic = 0; WCTemplputParams SubTP; memset(&SubTP, 0, sizeof(WCTemplputParams)); @@ -224,6 +223,8 @@ HashList* LoadFileList(StrBuf *Target, WCTemplputParams *TP) } Put(Files, SKEY(Entry->Filename), Entry, FreeFiles); } + if (HavePic) + putbstr("__HAVE_PIC", NewStrBufPlain(HKEY("1"))); SubTP.Filter.ContextType = CTX_FILELIST; SortIt = RetrieveSort(&SubTP, NULL, 0, HKEY("fileunsorted"), 0); if (SortIt != NULL) @@ -245,7 +246,7 @@ void display_mime_icon(void) FileName = GetIconFilename(MimeType, tlen); if (FileName == NULL) - snprintf (FileBuf, SIZ, "%s%s", static_dirs[0], "/diskette_24x.gif"); + snprintf (FileBuf, SIZ, "%s%s", static_dirs[0], "/webcit_icons/essen/16x16/file.png"); else snprintf (FileBuf, SIZ, "%s%s", static_dirs[3], FileName); output_static(FileBuf); @@ -269,13 +270,15 @@ void download_file(void) if (GetServerStatus(Buf, NULL) == 2) { StrBufCutLeft(Buf, 4); bytes = StrBufExtract_long(Buf, 0, '|'); - if (!force_download) { - StrBufExtract_token(ContentType, Buf, 3, '|'); - } - serv_read_binary(WCC->WBuf, bytes, Buf); + StrBufExtract_token(ContentType, Buf, 3, '|'); + + CheckGZipCompressionAllowed (SKEY(ContentType)); + if (force_download) + FlushStrBuf(ContentType); + + serv_read_binary_to_http(ContentType, bytes, 0, 0); serv_puts("CLOS"); StrBuf_ServGetln(Buf); - http_transmit_thing(ChrPtr(ContentType), 0); } else { StrBufCutLeft(Buf, 4); hprintf("HTTP/1.1 404 %s\n", ChrPtr(Buf)); @@ -294,20 +297,19 @@ void download_file(void) void delete_file(void) { const StrBuf *MimeType; - StrBuf *Buf; + StrBuf *Line; char buf[256]; safestrncpy(buf, bstr("file"), sizeof buf); unescape_input(buf); serv_printf("DELF %s", buf); - Buf = NewStrBuf(); - StrBuf_ServGetln(Buf); - GetServerStatus(Buf, NULL); - StrBufCutLeft(Buf, 4); - strcpy(WC->ImportantMessage, ChrPtr(Buf)); + + StrBuf_ServGetln(Line); + GetServerStatusMsg(Line, NULL, 1, 0); + MimeType = DoTemplate(HKEY("files"), NULL, &NoCtx); http_transmit_thing(ChrPtr(MimeType), 0); - FreeStrBuf(&Buf); + FreeStrBuf(&Line); } @@ -316,7 +318,7 @@ void upload_file(void) { const StrBuf *RetMimeType; const char *MimeType; - char buf[1024]; + StrBuf *Line; long bytes_transmitted = 0; long blocksize; const StrBuf *Desc; @@ -330,13 +332,12 @@ void upload_file(void) ChrPtr(WCC->upload_filename), MimeType, ChrPtr(Desc)); - - serv_getln(buf, sizeof buf); - if (buf[0] != '2') - { - strcpy(WCC->ImportantMessage, &buf[4]); + Line = NewStrBuf(); + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 1, 2) != 2) { RetMimeType = DoTemplate(HKEY("files"), NULL, &NoCtx); http_transmit_thing(ChrPtr(RetMimeType), 0); + FreeStrBuf(&Line); return; } @@ -348,20 +349,22 @@ void upload_file(void) blocksize = (WCC->upload_length - bytes_transmitted); } serv_printf("WRIT %ld", blocksize); - serv_getln(buf, sizeof buf); - if (buf[0] == '7') - { - blocksize = atoi(&buf[4]); + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 0, 0) == 7) { + blocksize = atoi(ChrPtr(Line) + 4); serv_write(&ChrPtr(WCC->upload)[bytes_transmitted], blocksize); bytes_transmitted += blocksize; } + else + break; } serv_puts("UCLS 1"); - serv_getln(buf, sizeof buf); - strcpy(WCC->ImportantMessage, &buf[4]); + StrBuf_ServGetln(Line); + GetServerStatusMsg(Line, NULL, 1, 0); RetMimeType = DoTemplate(HKEY("files"), NULL, &NoCtx); http_transmit_thing(ChrPtr(RetMimeType), 0); + FreeStrBuf(&Line); } @@ -396,21 +399,24 @@ void output_image(void) /** Write it to the browser */ if (!IsEmptyStr(MimeType)) { + CheckGZipCompressionAllowed (MimeType, strlen(MimeType)); http_transmit_thing(MimeType, 0); FreeStrBuf(&Buf); return; } } /* hm... unknown mimetype? fallback to blank gif */ - } + } + else { + syslog(LOG_DEBUG, "OIMG failed: %s", ChrPtr(Buf)); + } /* * Instead of an ugly 404, send a 1x1 transparent GIF - * when there's no such image on the server. + * when there's no such image on the server display blank */ - StrBufPrintf (Buf, "%s%s", static_dirs[0], "/blank.gif"); - output_static(ChrPtr(Buf)); + output_static(NULL); FreeStrBuf(&Buf); } @@ -418,6 +424,7 @@ void InitModule_DOWNLOAD (void) { + RegisterCTX(CTX_FILELIST); RegisterIterator("ROOM:FILES", 0, NULL, LoadFileList, NULL, DeleteHash, CTX_FILELIST, CTX_NONE, @@ -459,7 +466,7 @@ InitModule_DOWNLOAD RegisterNamespace("FILE:MIMETYPE", 0, 2, tmplput_FILEMIMETYPE, NULL, CTX_FILELIST); RegisterNamespace("FILE:COMMENT", 0, 2, tmplput_FILE_COMMENT, NULL, CTX_FILELIST); - RegisterConditional(HKEY("COND:FILE:ISPIC"), 0, Conditional_FILE_ISPIC, CTX_FILELIST); + RegisterConditional("COND:FILE:ISPIC", 0, Conditional_FILE_ISPIC, CTX_FILELIST); WebcitAddUrlHandler(HKEY("image"), "", 0, output_image, ANONYMOUS); WebcitAddUrlHandler(HKEY("display_mime_icon"), "", 0, display_mime_icon , ANONYMOUS);