diff --git a/src/sbbs3/writemsg.cpp b/src/sbbs3/writemsg.cpp index f23d137d0d9f0e1e4afad35320664006d8426e2e..784ef5e38b9749581ddbaed8fb19f8c898b2b65f 100644 --- a/src/sbbs3/writemsg.cpp +++ b/src/sbbs3/writemsg.cpp @@ -743,11 +743,8 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, long mode, void sbbs_t::editor_info_to_msg(smbmsg_t* msg, const char* editor, const char* charset) { - if(editor != NULL) - smb_hfield_str(msg, SMB_EDITOR, editor); - - if(charset != NULL) - smb_hfield_str(msg, FIDOCHARSET, charset); + smb_hfield_string(msg, SMB_EDITOR, editor); + smb_hfield_string(msg, FIDOCHARSET, charset); ushort useron_xedit = useron.xedit; @@ -1375,7 +1372,7 @@ bool sbbs_t::forwardmail(smbmsg_t* orgmsg, const char* to, const char* subject, if(subject == NULL) { subject = subj; - SAFECOPY(subj, orgmsg->subj); + SAFEPRINTF(subj, "Fwd: %s", orgmsg->subj); bputs(text[SubjectPrompt]); if(!getstr(subj, sizeof(subj) - 1, K_LINE | K_EDIT | K_AUTODEL | K_TRIM)) return false; @@ -1441,33 +1438,57 @@ bool sbbs_t::forwardmail(smbmsg_t* orgmsg, const char* to, const char* subject, time32_t now32 = time32(NULL); smb_hfield(&msg, FORWARDED, sizeof(now32), &now32); + char* br = NULL; + char* pg = nulstr; + char* lt = "<"; + char* gt = ">"; + if(orgmsg->text_subtype != NULL && stricmp(orgmsg->text_subtype, "html") == 0) { + lt = "<"; + gt = ">"; + br = "<br>"; + pg = "<p>"; + } + if(comment == NULL) { - while(online) { + while(online && !msgabort()) { bputs(text[UeditComment]); if(!getstr(str, 70, K_WRAP)) break; - smb_hfield_str(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, br); + } + if(!online || msgabort()) { + smb_freemsgmem(&msg); + return false; } } else { if(*comment) - smb_hfield_str(&msg, SMB_COMMENT, comment); + smb_hfield_string(&msg, SMB_COMMENT, comment); } - smb_hfield_str(&msg, SMB_COMMENT, "-----Forwarded Message-----"); + if(smb_get_hfield(&msg, SMB_COMMENT, NULL) != NULL) + smb_hfield_string(&msg, SMB_COMMENT, pg); + smb_hfield_string(&msg, SMB_COMMENT, "-----Forwarded Message-----"); + smb_hfield_string(&msg, SMB_COMMENT, br); if(orgmsg->from_net.addr != NULL) - safe_snprintf(str, sizeof(str), "From: %s <%s>",orgmsg->from, smb_netaddrstr(&orgmsg->from_net, tmp)); + safe_snprintf(str, sizeof(str), "From: %s %s%s%s" + ,orgmsg->from, lt, smb_netaddrstr(&orgmsg->from_net, tmp), gt); else safe_snprintf(str, sizeof(str), "From: %s", orgmsg->from); - smb_hfield_str(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, br); safe_snprintf(str, sizeof(str), "Date: %s", msgdate(orgmsg->hdr.when_written, tmp)); - smb_hfield_str(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, br); if(orgmsg->to_net.addr != NULL) - safe_snprintf(str, sizeof(str), "To: %s <%s>", orgmsg->to, smb_netaddrstr(&orgmsg->to_net, tmp)); + safe_snprintf(str, sizeof(str), "To: %s %s%s%s" + ,orgmsg->to, lt, smb_netaddrstr(&orgmsg->to_net, tmp), gt); else safe_snprintf(str, sizeof(str), "To: %s", orgmsg->to); - smb_hfield_str(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, br); safe_snprintf(str, sizeof(str), "Subject: %s", orgmsg->subj); - smb_hfield_str(&msg, SMB_COMMENT, str); - smb_hfield_str(&msg, SMB_COMMENT, nulstr); + smb_hfield_string(&msg, SMB_COMMENT, str); + smb_hfield_string(&msg, SMB_COMMENT, pg); // Re-use the original message's data if((result = smb_open_da(&smb)) != SMB_SUCCESS) { diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index 14b669f878322f53454e96019cdd1d0348318ec2..9f77bbeb88ad2ad8064f2713c76e0545a978001b 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -1218,13 +1218,23 @@ int SMBCALL smb_hfield_add_list(smbmsg_t* msg, hfield_t** hfield_list, void** hf } /****************************************************************************/ -/* Convenience function to add an ASCIIZ string header field */ +/* Convenience function to add an ASCIIZ string header field (or blank) */ /****************************************************************************/ int SMBCALL smb_hfield_add_str(smbmsg_t* msg, uint16_t type, const char* str, BOOL insert) { return smb_hfield_add(msg, type, str==NULL ? 0:strlen(str), (void*)str, insert); } +/****************************************************************************/ +/* Convenience function to add an ASCIIZ string header field (NULL ignored) */ +/****************************************************************************/ +int SMBCALL smb_hfield_string(smbmsg_t* msg, uint16_t type, const char* str) +{ + if(str == NULL) + return SMB_ERR_HDR_FIELD; + return smb_hfield_add(msg, type, strlen(str), (void*)str, /* insert */FALSE); +} + /****************************************************************************/ /* Convenience function to a network address header field to msg */ /* Pass NULL for net_type to have the auto-detected net_type hfield added */ diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index 5c1c55e7a9340843ca0d8c69690c6ec1cd6d6309..fbe37ffbf99c2fc1101c72c210673328e7ba8063 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -160,6 +160,7 @@ SMBEXPORT int SMBCALL smb_hfield_append(smbmsg_t* msg, uint16_t type, size_t le SMBEXPORT int SMBCALL smb_hfield_append_str(smbmsg_t* msg, uint16_t type, const char* data); SMBEXPORT int SMBCALL smb_hfield_add_list(smbmsg_t* msg, hfield_t** hfield_list, void** hfield_dat, BOOL insert); SMBEXPORT int SMBCALL smb_hfield_add_netaddr(smbmsg_t* msg, uint16_t type, const char* str, uint16_t* nettype, BOOL insert); +SMBEXPORT int SMBCALL smb_hfield_string(smbmsg_t*, uint16_t type, const char*); /* Convenience macro: */ #define smb_hfield_bin(msg, type, data) smb_hfield_add(msg, type, sizeof(data), &(data), /* insert: */FALSE) /* Backward compatibility macros: */ diff --git a/src/smblib/smbtxt.c b/src/smblib/smbtxt.c index 4b65c9c4291a3e86ba2a11310c95eb04f34672da..0ffce0d1d5320d54dda792feee3625b5782544da 100644 --- a/src/smblib/smbtxt.c +++ b/src/smblib/smbtxt.c @@ -495,7 +495,6 @@ char* SMBCALL smb_getplaintext(smbmsg_t* msg, char* buf) const char* txt; enum content_transfer_encoding xfer_encoding = CONTENT_TRANFER_ENCODING_NONE; - FREE_AND_NULL(msg->text_subtype); if(msg->mime_version == NULL || msg->content_type == NULL) /* not MIME */ return NULL; txt = mime_getcontent(buf, msg->content_type, "text/plain", 0, &xfer_encoding, &msg->text_charset @@ -505,9 +504,12 @@ char* SMBCALL smb_getplaintext(smbmsg_t* msg, char* buf) ,/* attachment: */NULL, /* attachment_len: */0, /* index: */0); if(txt == NULL) return NULL; + free(msg->text_subtype); msg->text_subtype = strdup("html"); - } else + } else { + free(msg->text_subtype); msg->text_subtype = strdup("plain"); + } memmove(buf, txt, strlen(txt)+1); if(*buf == 0) /* No decoding necessary */