X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fextnotify%2Fextnotify_main.c;h=9244a26fa0600b548b3b003a9f1abf49a98ec41e;hb=cf09c5cb779279f9ad24545e68414edc0340d6fa;hp=826704cf45a68d771c0bfba7529d3eaf11b1f5b2;hpb=951fbe7c1ee0b3554af22d6ae0d1d51c1642ae0f;p=citadel.git diff --git a/citadel/modules/extnotify/extnotify_main.c b/citadel/modules/extnotify/extnotify_main.c index 826704cf4..9244a26fa 100644 --- a/citadel/modules/extnotify/extnotify_main.c +++ b/citadel/modules/extnotify/extnotify_main.c @@ -154,6 +154,7 @@ eNotifyType extNotify_getConfigMessage(char *username, int num_msgs = 0; int a; char *configMsg; + long clen; char *pch; // Get the user @@ -183,16 +184,16 @@ eNotifyType extNotify_getConfigMessage(char *username, return eNone; /* No messages at all? No further action. */ } for (a = 0; a < num_msgs; ++a) { - msg = CtdlFetchMessage(msglist[a], 1); + msg = CtdlFetchMessage(msglist[a], 1, 1); if (msg != NULL) { - if ((msg->cm_fields[eMsgSubject] != NULL) && + if (!CM_IsEmpty(msg, eMsgSubject) && (strncasecmp(msg->cm_fields[eMsgSubject], PAGER_CONFIG_MESSAGE, strlen(PAGER_CONFIG_MESSAGE)) == 0)) { break; } - CtdlFreeMessage(msg); + CM_Free(msg); msg = NULL; } } @@ -204,9 +205,8 @@ eNotifyType extNotify_getConfigMessage(char *username, // Do a simple string search to see if 'funambol' is selected as the // type. This string would be at the very top of the message contents. - configMsg = msg->cm_fields[eMesageText]; - msg->cm_fields[eMesageText] = NULL; - CtdlFreeMessage(msg); + CM_GetAsField(msg, eMesageText, &configMsg, &clen); + CM_Free(msg); /* here we would find the pager number... */ pch = strchr(configMsg, '\n'); @@ -279,8 +279,8 @@ void process_notify(long NotifyMsgnum, void *usrdata) Ctx = (NotifyContext*) usrdata; - msg = CtdlFetchMessage(NotifyMsgnum, 1); - if ( msg->cm_fields[eExtnotify] != NULL) + msg = CtdlFetchMessage(NotifyMsgnum, 1, 1); + if (!CM_IsEmpty(msg, eExtnotify)) { Type = extNotify_getConfigMessage( msg->cm_fields[eExtnotify], @@ -351,7 +351,7 @@ void process_notify(long NotifyMsgnum, void *usrdata) commandSiz = sizeof(config.c_pager_program) + strlen(PagerNo) + - strlen(msg->cm_fields[eExtnotify]) + 5; + msg->cm_lengths[eExtnotify] + 5; command = malloc(commandSiz); @@ -372,7 +372,7 @@ void process_notify(long NotifyMsgnum, void *usrdata) } if (FreeMe != NULL) free(FreeMe); - CtdlFreeMessage(msg); + CM_Free(msg); todelete[0] = NotifyMsgnum; CtdlDeleteMessages(FNBL_QUEUE_ROOM, todelete, 1, ""); } @@ -465,12 +465,56 @@ void create_extnotify_queue(void) { } } +int extnotify_after_mbox_save(struct CtdlMessage *msg, + recptypes *recps) + +{ + /* If this is private, local mail, make a copy in the + * recipient's mailbox and bump the reference count. + */ + if (!IsEmptyStr(config.c_funambol_host) || !IsEmptyStr(config.c_pager_program)) + { + /* Generate a instruction message for the Funambol notification + * server, in the same style as the SMTP queue + */ + StrBuf *instr; + struct CtdlMessage *imsg; + + instr = NewStrBufPlain(NULL, 1024); + StrBufPrintf(instr, + "Content-type: "SPOOLMIME"\n" + "\n" + "msgid|%s\n" + "submitted|%ld\n" + "bounceto|%s\n", + msg->cm_fields[eVltMsgNum], + (long)time(NULL), //todo: time() is expensive! + recps->bounce_to + ); + + imsg = malloc(sizeof(struct CtdlMessage)); + memset(imsg, 0, sizeof(struct CtdlMessage)); + imsg->cm_magic = CTDLMESSAGE_MAGIC; + imsg->cm_anon_type = MES_NORMAL; + imsg->cm_format_type = FMT_RFC822; + CM_SetField(imsg, eMsgSubject, HKEY("QMSG")); + CM_SetField(imsg, eAuthor, HKEY("Citadel")); + CM_SetField(imsg, eJournal, HKEY("do not journal")); + CM_SetAsFieldSB(imsg, eMesageText, &instr); + CM_SetField(imsg, eExtnotify, recps->recp_local, strlen(recps->recp_local)); + CtdlSubmitMsg(imsg, NULL, FNBL_QUEUE_ROOM, 0); + CM_Free(imsg); + } + return 0; +} CTDL_MODULE_INIT(extnotify) { if (!threading) { create_extnotify_queue(); + CtdlRegisterMessageHook(extnotify_after_mbox_save, EVT_AFTERUSRMBOXSAVE); + CtdlRegisterSessionHook(do_extnotify_queue, EVT_TIMER, PRIO_SEND + 10); } /* return our module name for the log */