X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmessages.c;h=405656eab269ec22794ea6c7c5b5d080fc9726c1;hb=cb828090d054ae1c71447d06ab348b638cc5f938;hp=29fd30559e90dc02a327ae77606403d947b72342;hpb=63e464108af57afa166d59a574479d5309cc4d9c;p=citadel.git diff --git a/webcit/messages.c b/webcit/messages.c index 29fd30559..405656eab 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -18,7 +18,6 @@ #include "calendar.h" HashList *MsgHeaderHandler = NULL; -HashList *MsgEvaluators = NULL; HashList *MimeRenderHandler = NULL; HashList *ReadLoopHandler = NULL; int dbg_analyze_msg = 0; @@ -31,12 +30,6 @@ void jsonMessageListHdr(void); void display_enter(void); -typedef void (*MsgPartEvaluatorFunc)(message_summary *Sum, StrBuf *Buf); - -typedef struct _MsgPartEvaluatorStruct { - MsgPartEvaluatorFunc f; -} MsgPartEvaluatorStruct; - void fixview() { /* workaround for json listview; its not useable directly */ @@ -483,7 +476,7 @@ void display_headers(void) { PACKAGE_STRING); begin_burst(); - serv_printf("MSG2 %ld|3", msgnum); + serv_printf("MSG2 %ld|1", msgnum); serv_getln(buf, sizeof buf); if (buf[0] == '1') { while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { @@ -495,50 +488,6 @@ void display_headers(void) { } -message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSubject, long MsgNum) -{ - void *vEval; - MsgPartEvaluatorStruct *Eval; - message_summary *Msg; - StrBuf *Buf; - const char *buf; - const char *ebuf; - int nBuf; - long len; - - Buf = NewStrBuf(); - - serv_printf("MSG0 %ld|1", MsgNum); /* ask for headers only */ - - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) == 1) { - FreeStrBuf(&Buf); - return NULL; - } - - Msg = (message_summary*)malloc(sizeof(message_summary)); - memset(Msg, 0, sizeof(message_summary)); - while (len = StrBuf_ServGetln(Buf), - (len >= 0) && - ((len != 3) || - strcmp(ChrPtr(Buf), "000"))) - { - buf = ChrPtr(Buf); - ebuf = strchr(ChrPtr(Buf), '='); - nBuf = ebuf - buf; - if (GetHash(MsgEvaluators, buf, nBuf, &vEval) && vEval != NULL) { - Eval = (MsgPartEvaluatorStruct*) vEval; - StrBufCutLeft(Buf, nBuf + 1); - Eval->f(Msg, Buf); - } - else syslog(LOG_INFO, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf)); - } - return Msg; -} - - - - /* * load message pointers from the server for a "read messages" operation @@ -650,10 +599,11 @@ int load_msg_ptrs(const char *servcmd, * \param MatchMSet MSet we want to flag * \param FlagToSet Flag to set on each BasicMsgStruct->Flags if in MSet */ -void SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse) +long SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reverse) { const char *HashKey; long HKLen; + long count = 0; HashPos *at; void *vMsg; message_summary *Msg; @@ -664,17 +614,21 @@ void SetFlagsFromMSet(HashList *ScanMe, MSet *MatchMSet, int FlagToSet, int Reve Msg = (message_summary*) vMsg; if (Reverse && IsInMSetList(MatchMSet, Msg->msgnum)) { Msg->Flags = Msg->Flags | FlagToSet; + count++; } else if (!Reverse && !IsInMSetList(MatchMSet, Msg->msgnum)) { Msg->Flags = Msg->Flags | FlagToSet; + count++; } } DeleteHashPos(&at); + return count; } -void load_seen_flags(void) +long load_seen_flags(void) { + long count = 0; StrBuf *OldMsg; wcsession *WCC = WC; MSet *MatchMSet; @@ -687,15 +641,16 @@ void load_seen_flags(void) } else { FreeStrBuf(&OldMsg); - return; + return 0; } if (ParseMSet(&MatchMSet, OldMsg)) { - SetFlagsFromMSet(WCC->summ, MatchMSet, MSGFLAG_READ, 0); + count = SetFlagsFromMSet(WCC->summ, MatchMSet, MSGFLAG_READ, 0); } DeleteMSet(&MatchMSet); FreeStrBuf(&OldMsg); + return count; } extern readloop_struct rlid[]; @@ -734,7 +689,7 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer) long HKLen; WCTemplputParams SubTP; SharedMessageStatus Stat; - void *ViewSpecific; + void *ViewSpecific = NULL; if (havebstr("is_summary") && (1 == (ibstr("is_summary")))) { WCC->CurRoom.view = VIEW_MAILBOX; @@ -814,7 +769,7 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer) Stat.startmsg = 0; } - if (Stat.load_seen) load_seen_flags(); + if (Stat.load_seen) Stat.numNewmsgs = load_seen_flags(); /* * Print any inforation above the message list... @@ -832,9 +787,13 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer) Foo = NewStrBuf (); StrBufPrintf(Foo, "%ld", Stat.nummsgs); - PutBstr(HKEY("__READLOOP:TOTALMSGS"), NewStrBufDup(Foo)); + PutBstr(HKEY("__READLOOP:TOTALMSGS"), NewStrBufDup(Foo)); // keep Foo! + + StrBufPrintf(Foo, "%ld", Stat.numNewmsgs); + PutBstr(HKEY("__READLOOP:NEWMSGS"), NewStrBufDup(Foo)); // keep Foo! + StrBufPrintf(Foo, "%ld", Stat.startmsg); - PutBstr(HKEY("__READLOOP:STARTMSG"), Foo); + PutBstr(HKEY("__READLOOP:STARTMSG"), Foo); // store Foo elsewhere, descope it here. } /* @@ -1234,6 +1193,7 @@ void upload_attachment(void) { wc_mime_attachment *att; const StrBuf *Tmpl = sbstr("template"); const StrBuf *MimeType = NULL; + const StrBuf *UID; begin_burst(); syslog(LOG_DEBUG, "upload_attachment()\n"); @@ -1248,7 +1208,7 @@ void upload_attachment(void) { } else wc_printf("ERROR no attachment was uploaded
\n"); http_transmit_thing(ChrPtr(MimeType), 0); - + return; } @@ -1261,7 +1221,10 @@ void upload_attachment(void) { att->length = WCC->upload_length; att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1); att->FileName = NewStrBufDup(WCC->upload_filename); - + UID = sbstr("qquuid"); + if (UID) + att->PartNum = NewStrBufDup(UID); + if (WCC->attachments == NULL) { WCC->attachments = NewHash(1, Flathash); } @@ -1315,26 +1278,35 @@ void remove_attachment(void) { StrBuf *WhichAttachment; HashPos *at; long len; + int found=0; const char *key; WhichAttachment = NewStrBufDup(sbstr("which_attachment")); + if (ChrPtr(WhichAttachment)[0] == '/') + StrBufCutLeft(WhichAttachment, 1); StrBufUnescape(WhichAttachment, 0); at = GetNewHashPos(WCC->attachments, 0); do { + vAtt = NULL; GetHashPos(WCC->attachments, at, &len, &key, &vAtt); - + att = (wc_mime_attachment*) vAtt; - if ((att != NULL) && - (strcmp(ChrPtr(WhichAttachment), - ChrPtr(att->FileName) ) == 0)) + if ((att != NULL) && + ( + !strcmp(ChrPtr(WhichAttachment), ChrPtr(att->FileName)) || + ((att->PartNum != NULL) && + !strcmp(ChrPtr(WhichAttachment), ChrPtr(att->PartNum))) + )) { DeleteEntryFromHash(WCC->attachments, at); + found=1; break; } } while (NextHashPos(WCC->attachments, at)); + FreeStrBuf(&WhichAttachment); - wc_printf("remove_attachment() completed\n"); + wc_printf("remove_attachment(%d) completed\n", found); }