X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fmessages.c;h=6e30c98d30e2f3f176a2be4df1afdb5cff39ade3;hb=a773f0786e2b7884703bdc4067bef08526881f57;hp=feb665dfaa0b314104018521e11893ba4cc1b3e1;hpb=c06d1f8100fedb4b90c04ab6aefca49262d7a48e;p=citadel.git diff --git a/webcit/messages.c b/webcit/messages.c index feb665dfa..6e30c98d3 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -647,17 +647,40 @@ int load_msg_ptrs(const char *servcmd, - - -void load_seen_flags(void) +/** + * \brief sets FlagToSet for each of ScanMe that appears in MatchMSet + * \param ScanMe List of BasicMsgStruct to be searched it MatchSet + * \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) { - message_summary *Msg; const char *HashKey; long HKLen; HashPos *at; void *vMsg; + message_summary *Msg; + + at = GetNewHashPos(ScanMe, 0); + while (GetNextHashPos(ScanMe, at, &HKLen, &HashKey, &vMsg)) { + /* Are you a new message, or an old message? */ + Msg = (message_summary*) vMsg; + if (Reverse && IsInMSetList(MatchMSet, Msg->msgnum)) { + Msg->Flags = Msg->Flags | FlagToSet; + } + else if (!Reverse && !IsInMSetList(MatchMSet, Msg->msgnum)) { + Msg->Flags = Msg->Flags | FlagToSet; + } + } + DeleteHashPos(&at); +} + + +void load_seen_flags(void) +{ StrBuf *OldMsg; wcsession *WCC = WC; + MSet *MatchMSet; OldMsg = NewStrBuf(); serv_puts("GTSN"); @@ -669,19 +692,13 @@ void load_seen_flags(void) FreeStrBuf(&OldMsg); return; } - at = GetNewHashPos(WCC->summ, 0); - while (GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) { - /* Are you a new message, or an old message? */ - Msg = (message_summary*) vMsg; - if (is_msg_in_mset(ChrPtr(OldMsg), Msg->msgnum)) { - Msg->is_new = 0; - } - else { - Msg->is_new = 1; - } + + if (ParseMSet(&MatchMSet, OldMsg)) + { + SetFlagsFromMSet(WCC->summ, MatchMSet, MSGFLAG_READ, 0); } + DeleteMSet(&MatchMSet); FreeStrBuf(&OldMsg); - DeleteHashPos(&at); } extern readloop_struct rlid[]; @@ -829,7 +846,11 @@ void readloop(long oper, eCustomRoomRenderer ForceRenderer) while ( GetNextHashPos(WCC->summ, at, &HKLen, &HashKey, &vMsg)) { Msg = (message_summary*) vMsg; if ((Msg->msgnum >= Stat.startmsg) && (Stat.num_displayed <= Stat.maxmsgs)) { - ViewMsg->LoadMsgFromServer(&Stat, &ViewSpecific, Msg, Msg->is_new, i); + ViewMsg->LoadMsgFromServer(&Stat, + &ViewSpecific, + Msg, + (Msg->Flags & MSGFLAG_READ) != 0, + i); } i++; } @@ -984,7 +1005,6 @@ void post_message(void) char buf[1024]; StrBuf *encoded_subject = NULL; static long dont_post = (-1L); - wc_mime_attachment *att; int is_anonymous = 0; const StrBuf *display_name = NULL; wcsession *WCC = WC; @@ -1002,96 +1022,13 @@ void post_message(void) } } - if (WCC->upload_length > 0) { - const char *pch; - int n; - const char *newn; - long newnlen; - void *v; - - /* There's an attachment. Save it to this struct... */ - lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length); - att = malloc(sizeof(wc_mime_attachment)); - memset(att, 0, sizeof(wc_mime_attachment )); - att->length = WCC->upload_length; - att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1); - att->FileName = NewStrBufDup(WCC->upload_filename); - - if (WCC->attachments == NULL) { - WCC->attachments = NewHash(1, Flathash); - } - - /* And add it to the list. */ - n = 0; - if ((GetCount(WCC->attachments) > 0) && - GetHashAt(WCC->attachments, - GetCount(WCC->attachments) -1, - &newnlen, &newn, &v)) - n = *((int*) newn) + 1; - Put(WCC->attachments, IKEY(n), att, DestroyMime); - - /* - * Mozilla sends a simple filename, which is what we want, - * but Satan's Browser sends an entire pathname. Reduce - * the path to just a filename if we need to. - */ - pch = strrchr(ChrPtr(att->FileName), '/'); - if (pch != NULL) { - StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1); - } - pch = strrchr(ChrPtr(att->FileName), '\\'); - if (pch != NULL) { - StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1); - } - - /* - * Transfer control of this memory from the upload struct - * to the attachment struct. - */ - att->Data = WCC->upload; - WCC->upload = NULL; - WCC->upload_length = 0; - display_enter(); - return; - } - - if (havebstr("cancel_button")) { + if (!strcasecmp(bstr("submit_action"), "cancel")) { sprintf(WCC->ImportantMessage, _("Cancelled. Message was not posted.")); - } else if (havebstr("attach_button")) { - display_enter(); - return; } else if (lbstr("postseq") == dont_post) { sprintf(WCC->ImportantMessage, _("Automatically cancelled because you have already " "saved this message.")); - } else if (havebstr("remove_attach_button")) { - /* now thats st00pit. need to find it by name. */ - void *vAtt; - StrBuf *WhichAttachment; - HashPos *at; - long len; - const char *key; - - WhichAttachment = NewStrBufDup(sbstr("which_attachment")); - StrBufUnescape(WhichAttachment, 0); - at = GetNewHashPos(WCC->attachments, 0); - do { - GetHashPos(WCC->attachments, at, &len, &key, &vAtt); - - att = (wc_mime_attachment*) vAtt; - if ((att != NULL) && - (strcmp(ChrPtr(WhichAttachment), - ChrPtr(att->FileName) ) == 0)) - { - DeleteEntryFromHash(WCC->attachments, at); - break; - } - } - while (NextHashPos(WCC->attachments, at)); - FreeStrBuf(&WhichAttachment); - display_enter(); - return; } else { const char CMD[] = "ENT0 1|%s|%d|4|%s|%s||%s|%s|%s|%s|%s"; StrBuf *Recp = NULL; @@ -1104,7 +1041,7 @@ void post_message(void) int save_to_drafts; long HeaderLen; - save_to_drafts = havebstr("save_button"); + save_to_drafts = !strcasecmp(bstr("submit_action"), "drafts"); Buf = NewStrBuf(); if (save_to_drafts) { @@ -1235,6 +1172,7 @@ void post_message(void) return; } } + FreeStrBuf(&Recp); FreeStrBuf(&Buf); FreeStrBuf(&Cc); FreeStrBuf(&Bcc); @@ -1265,6 +1203,106 @@ void post_message(void) } +/* + * Client is uploading an attachment + */ +void upload_attachment(void) { + wcsession *WCC = WC; + const char *pch; + int n; + const char *newn; + long newnlen; + void *v; + wc_mime_attachment *att; + + lprintf(9, "upload_attachment()\n"); + wc_printf("upload_attachment()
\n"); + + if (WCC->upload_length <= 0) { + lprintf(9, "ERROR no attachment was uploaded\n"); + wc_printf("ERROR no attachment was uploaded
\n"); + return; + } + + lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length); + wc_printf("Client is uploading %d bytes
\n", WCC->upload_length); + att = malloc(sizeof(wc_mime_attachment)); + memset(att, 0, sizeof(wc_mime_attachment )); + att->length = WCC->upload_length; + att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1); + att->FileName = NewStrBufDup(WCC->upload_filename); + + if (WCC->attachments == NULL) { + WCC->attachments = NewHash(1, Flathash); + } + + /* And add it to the list. */ + n = 0; + if ((GetCount(WCC->attachments) > 0) && + GetHashAt(WCC->attachments, + GetCount(WCC->attachments) -1, + &newnlen, &newn, &v)) + n = *((int*) newn) + 1; + Put(WCC->attachments, IKEY(n), att, DestroyMime); + + /* + * Mozilla sends a simple filename, which is what we want, + * but Satan's Browser sends an entire pathname. Reduce + * the path to just a filename if we need to. + */ + pch = strrchr(ChrPtr(att->FileName), '/'); + if (pch != NULL) { + StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1); + } + pch = strrchr(ChrPtr(att->FileName), '\\'); + if (pch != NULL) { + StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1); + } + + /* + * Transfer control of this memory from the upload struct + * to the attachment struct. + */ + att->Data = WCC->upload; + WCC->upload = NULL; + WCC->upload_length = 0; +} + + +/* + * Remove an attachment from the message currently being composed. + * + * Currently we identify the attachment to be removed by its filename. + * There is probably a better way to do this. + */ +void remove_attachment(void) { + wcsession *WCC = WC; + wc_mime_attachment *att; + void *vAtt; + StrBuf *WhichAttachment; + HashPos *at; + long len; + const char *key; + + WhichAttachment = NewStrBufDup(sbstr("which_attachment")); + StrBufUnescape(WhichAttachment, 0); + at = GetNewHashPos(WCC->attachments, 0); + do { + GetHashPos(WCC->attachments, at, &len, &key, &vAtt); + + att = (wc_mime_attachment*) vAtt; + if ((att != NULL) && + (strcmp(ChrPtr(WhichAttachment), + ChrPtr(att->FileName) ) == 0)) + { + DeleteEntryFromHash(WCC->attachments, at); + break; + } + } + while (NextHashPos(WCC->attachments, at)); + FreeStrBuf(&WhichAttachment); + wc_printf("remove_attachment() completed\n"); +} /* @@ -1659,8 +1697,6 @@ void MimeLoadData(wc_mime_attachment *Mime) } - - void view_mimepart(void) { mimepart(0); } @@ -1695,6 +1731,13 @@ void download_postpart(void) { FreeStrBuf(&partnum); } + + +void show_num_attachments(void) { + wc_printf("%d", GetCount(WC->attachments)); +} + + void h_readnew(void) { readloop(readnew, eUseDefault);} void h_readold(void) { readloop(readold, eUseDefault);} void h_readfwd(void) { readloop(readfwd, eUseDefault);} @@ -1796,6 +1839,9 @@ InitModule_MSG WebcitAddUrlHandler(HKEY("mimepart_download"), "", 0, download_mimepart, NEED_URL); WebcitAddUrlHandler(HKEY("postpart"), "", 0, view_postpart, NEED_URL|PROHIBIT_STARTPAGE); WebcitAddUrlHandler(HKEY("postpart_download"), "", 0, download_postpart, NEED_URL|PROHIBIT_STARTPAGE); + WebcitAddUrlHandler(HKEY("upload_attachment"), "", 0, upload_attachment, AJAX); + WebcitAddUrlHandler(HKEY("remove_attachment"), "", 0, remove_attachment, AJAX); + WebcitAddUrlHandler(HKEY("show_num_attachments"), "", 0, show_num_attachments, AJAX); /* json */ WebcitAddUrlHandler(HKEY("roommsgs"), "", 0, jsonMessageList,0);