X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fctdlproto%2Fserv_messages.c;h=ff03d2a6ea55ec40f7dfe70ecc2142f6742e1617;hb=b95a2e76213ef87c1bf98f8c64e8f13db5bef192;hp=f7ac4575e3d0e1a7162e93c7408400cdbd8b0590;hpb=158e8958500476d1115c7b70f6c81a87bb0ade47;p=citadel.git diff --git a/citadel/modules/ctdlproto/serv_messages.c b/citadel/modules/ctdlproto/serv_messages.c index f7ac4575e..ff03d2a6e 100644 --- a/citadel/modules/ctdlproto/serv_messages.c +++ b/citadel/modules/ctdlproto/serv_messages.c @@ -1,7 +1,7 @@ /* * represent messages to the citadel clients * - * Copyright (c) 1987-2012 by the citadel.org team + * Copyright (c) 1987-2015 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. @@ -20,11 +20,11 @@ #include "internet_addressing.h" #include "user_ops.h" #include "room_ops.h" +#include "config.h" extern char *msgkeys[]; - /* * Back end for the MSGS command: output message number only. */ @@ -34,7 +34,6 @@ void simple_listing(long msgnum, void *userdata) } - /* * Back end for the MSGS command: output header summary. */ @@ -42,7 +41,7 @@ void headers_listing(long msgnum, void *userdata) { struct CtdlMessage *msg; - msg = CtdlFetchMessage(msgnum, 0); + msg = CtdlFetchMessage(msgnum, 0, 1); if (msg == NULL) { cprintf("%ld|0|||||\n", msgnum); return; @@ -59,6 +58,44 @@ void headers_listing(long msgnum, void *userdata) CM_Free(msg); } +typedef struct _msg_filter{ + HashList *Filter; + HashPos *p; + StrBuf *buffer; +}msg_filter; + +void headers_brief_filter(long msgnum, void *userdata) +{ + long i, l; + struct CtdlMessage *msg; + msg_filter *flt = (msg_filter*) userdata; + + l = GetCount(flt->Filter); + msg = CtdlFetchMessage(msgnum, 0, 1); + StrBufPrintf(flt->buffer, "%ld", msgnum); + if (msg == NULL) { + for (i = 0; i < l; i++) { + StrBufAppendBufPlain(flt->buffer, HKEY("|"), 0); + } + } + else { + const char *k; + long len; + void *v; + RewindHashPos(flt->Filter, flt->p, 0); + while (GetNextHashPos(flt->Filter, flt->p, &len, &k, &v)) { + eMsgField f = (eMsgField) v; + + StrBufAppendBufPlain(flt->buffer, HKEY("|"), 0); + if (!CM_IsEmpty(msg, f)) { + StrBufAppendBufPlain(flt->buffer, CM_KEY(msg, f), 0); + } + } + } + StrBufAppendBufPlain(flt->buffer, HKEY("\n"), 0); + cputbuf(flt->buffer); +} + /* * Back end for the MSGS command: output EUID header. */ @@ -66,7 +103,7 @@ void headers_euid(long msgnum, void *userdata) { struct CtdlMessage *msg; - msg = CtdlFetchMessage(msgnum, 0); + msg = CtdlFetchMessage(msgnum, 0, 1); if (msg == NULL) { cprintf("%ld||\n", msgnum); return; @@ -93,9 +130,9 @@ void cmd_msgs(char *cmdbuf) char tfield[256]; char tvalue[256]; int cm_ref = 0; - int i; int with_template = 0; struct CtdlMessage *template = NULL; + msg_filter filt; char search_string[1024]; ForEachMsgCallback CallBack; @@ -117,6 +154,10 @@ void cmd_msgs(char *cmdbuf) case MSG_HDRS_EUID: CallBack = headers_euid; break; + case MSG_HDRS_BRIEFFILTER: + with_template = 2; + CallBack = headers_brief_filter; + break; } strcat(which, " "); @@ -137,13 +178,14 @@ void cmd_msgs(char *cmdbuf) else mode = MSGS_ALL; - if ( (mode == MSGS_SEARCH) && (!config.c_enable_fulltext) ) { + if ( (mode == MSGS_SEARCH) && (!CtdlGetConfigInt("c_enable_fulltext")) ) { cprintf("%d Full text index is not enabled on this server.\n", ERROR + CMD_NOT_SUPPORTED); return; } - if (with_template) { + if (with_template == 1) { + memset(buf, 0, 5); unbuffer_output(); cprintf("%d Send template then receive message list\n", START_CHAT_MODE); @@ -154,29 +196,64 @@ void cmd_msgs(char *cmdbuf) template->cm_anon_type = MES_NORMAL; while(client_getln(buf, sizeof buf) >= 0 && strcmp(buf,"000")) { + eMsgField f; long tValueLen; - extract_token(tfield, buf, 0, '|', sizeof tfield); - tValueLen = extract_token(tvalue, buf, 1, '|', sizeof tvalue); - for (i='A'; i<='Z'; ++i) if (msgkeys[i]!=NULL) { - if (!strcasecmp(tfield, msgkeys[i])) { - CM_SetField(template, i, tvalue, tValueLen); + + tValueLen = extract_token(tfield, buf, 0, '|', sizeof tfield); + if ((tValueLen == 4) && GetFieldFromMnemonic(&f, tfield)) + { + tValueLen = extract_token(tvalue, buf, 1, '|', sizeof tvalue); + if (tValueLen >= 0) { + CM_SetField(template, f, tvalue, tValueLen); } } } buffer_output(); } + else if (with_template == 2) { + long i = 0; + memset(buf, 0, 5); + filt.Filter = NewHash(1, lFlathash); + filt.buffer = NewStrBufPlain(NULL, 1024); + while(client_getln(buf, sizeof buf) >= 0 && strcmp(buf,"000")) { + eMsgField f; + + if (GetFieldFromMnemonic(&f, buf)) + { + Put(filt.Filter, LKEY(i), (void*)f, reference_free_handler); + i++; + } + } + filt.p = GetNewHashPos(filt.Filter, 0); + buffer_output(); + } else { cprintf("%d \n", LISTING_FOLLOWS); } - CtdlForEachMessage(mode, - ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), - ( (mode == MSGS_SEARCH) ? search_string : NULL ), - NULL, - template, - CallBack, - NULL); - if (template != NULL) CM_Free(template); + if (with_template < 2) { + CtdlForEachMessage(mode, + ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), + ( (mode == MSGS_SEARCH) ? search_string : NULL ), + NULL, + template, + CallBack, + NULL); + if (template != NULL) CM_Free(template); + } + else { + CtdlForEachMessage(mode, + ( (mode == MSGS_SEARCH) ? 0 : cm_ref ), + ( (mode == MSGS_SEARCH) ? search_string : NULL ), + NULL, + NULL, + CallBack, + &filt); + DeleteHashPos(&filt.p); + DeleteHash(&filt.Filter); + FreeStrBuf(&filt.buffer); + + } cprintf("000\n"); } @@ -191,7 +268,7 @@ void cmd_msg0(char *cmdbuf) msgid = extract_long(cmdbuf, 0); headers_only = extract_int(cmdbuf, 1); - CtdlOutputMsg(msgid, MT_CITADEL, headers_only, 1, 0, NULL, 0, NULL, NULL); + CtdlOutputMsg(msgid, MT_CITADEL, headers_only, 1, 0, NULL, 0, NULL, NULL, NULL); return; } @@ -207,7 +284,7 @@ void cmd_msg2(char *cmdbuf) msgid = extract_long(cmdbuf, 0); headers_only = extract_int(cmdbuf, 1); - CtdlOutputMsg(msgid, MT_RFC822, headers_only, 1, 1, NULL, 0, NULL, NULL); + CtdlOutputMsg(msgid, MT_RFC822, headers_only, 1, 1, NULL, 0, NULL, NULL, NULL); } @@ -228,7 +305,7 @@ void cmd_msg3(char *cmdbuf) } msgnum = extract_long(cmdbuf, 0); - msg = CtdlFetchMessage(msgnum, 1); + msg = CtdlFetchMessage(msgnum, 1, 1); if (msg == NULL) { cprintf("%d Message %ld not found.\n", ERROR + MESSAGE_NOT_FOUND, msgnum); @@ -261,7 +338,7 @@ void cmd_msg4(char *cmdbuf) msgid = extract_long(cmdbuf, 0); extract_token(section, cmdbuf, 1, '|', sizeof section); - CtdlOutputMsg(msgid, MT_MIME, 0, 1, 0, (section[0] ? section : NULL) , 0, NULL, NULL); + CtdlOutputMsg(msgid, MT_MIME, 0, 1, 0, (section[0] ? section : NULL) , 0, NULL, NULL, NULL); } @@ -294,7 +371,7 @@ void cmd_opna(char *cmdbuf) extract_token(desired_section, cmdbuf, 1, '|', sizeof desired_section); safestrncpy(CC->download_desired_section, desired_section, sizeof CC->download_desired_section); - CtdlOutputMsg(msgid, MT_DOWNLOAD, 0, 1, 1, NULL, 0, NULL, NULL); + CtdlOutputMsg(msgid, MT_DOWNLOAD, 0, 1, 1, NULL, 0, NULL, NULL, NULL); } @@ -310,7 +387,7 @@ void cmd_dlat(char *cmdbuf) extract_token(desired_section, cmdbuf, 1, '|', sizeof desired_section); safestrncpy(CC->download_desired_section, desired_section, sizeof CC->download_desired_section); - CtdlOutputMsg(msgid, MT_SPEW_SECTION, 0, 1, 1, NULL, 0, NULL, NULL); + CtdlOutputMsg(msgid, MT_SPEW_SECTION, 0, 1, 1, NULL, 0, NULL, NULL, NULL); } /* @@ -360,6 +437,7 @@ void cmd_ent0(char *entargs) switch(CC->room.QRdefaultview) { case VIEW_NOTES: case VIEW_WIKI: + case VIEW_WIKIMD: extract_token(supplied_euid, entargs, 9, '|', sizeof supplied_euid); break; default: @@ -598,13 +676,13 @@ void cmd_ent0(char *entargs) } free(all_recps); - if ((valid != NULL) && (valid->num_room == 1)) + if ((valid != NULL) && (valid->num_room == 1) && !IsEmptyStr(valid->recp_orgroom)) { /* posting into an ML room? set the envelope from * to the actual mail address so others get a valid * reply-to-header. */ - msg->cm_fields[eenVelopeTo] = strdup(valid->recp_orgroom); + CM_SetField(msg, eenVelopeTo, valid->recp_orgroom, strlen(valid->recp_orgroom)); } if (msg != NULL) {