/** start msg buttons */
+ char Urlsep = '?';
+
if (!printable_view) {
wprintf("<p id=\"msg%ld\" class=\"msgbuttons\" >\n",msgnum);
if ( (WC->wc_view == VIEW_MAILBOX) || (WC->wc_view == VIEW_BBS) ) {
wprintf("<a href=\"display_enter");
if (WC->is_mailbox) {
- wprintf("?replyquote=%ld", msgnum);
+ wprintf("%creplyquote=%ld", Urlsep, msgnum);
+ Urlsep = '&';
}
- wprintf("?recp=");
+ wprintf("%crecp=", Urlsep);
+ Urlsep = '&';
urlescputs(reply_to);
if (!IsEmptyStr(m_subject)) {
- wprintf("?subject=");
+ wprintf("%csubject=", Urlsep);
if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%%20");
urlescputs(m_subject);
}
- wprintf("?references=");
+ wprintf("%creferences=", Urlsep);
if (!IsEmptyStr(reply_references)) {
urlescputs(reply_references);
urlescputs("|");
if (!WC->is_mailbox) {
wprintf("<a href=\"display_enter");
wprintf("?replyquote=%ld", msgnum);
- wprintf("?recp=");
+ wprintf("&recp=");
urlescputs(reply_to);
if (!IsEmptyStr(m_subject)) {
- wprintf("?subject=");
+ wprintf("&subject=");
if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%%20");
urlescputs(m_subject);
}
- wprintf("?references=");
+ wprintf("&references=");
if (!IsEmptyStr(reply_references)) {
urlescputs(reply_references);
urlescputs("|");
if (WC->wc_view == VIEW_MAILBOX) {
wprintf("<a href=\"display_enter");
wprintf("?replyquote=%ld", msgnum);
- wprintf("?recp=");
+ wprintf("&recp=");
urlescputs(reply_to);
- wprintf("?cc=");
+ wprintf("&cc=");
urlescputs(reply_all);
if (!IsEmptyStr(m_subject)) {
- wprintf("?subject=");
+ wprintf("&subject=");
if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%%20");
urlescputs(m_subject);
}
- wprintf("?references=");
+ wprintf("&references=");
if (!IsEmptyStr(reply_references)) {
urlescputs(reply_references);
urlescputs("|");
/* Forward */
if (WC->wc_view == VIEW_MAILBOX) {
- wprintf("<a href=\"display_enter?fwdquote=%ld?subject=", msgnum);
+ wprintf("<a href=\"display_enter?fwdquote=%ld&subject=", msgnum);
if (strncasecmp(m_subject, "Fwd:", 4)) wprintf("Fwd:%%20");
urlescputs(m_subject);
wprintf("\"><span>[</span>%s<span>]</span></a> ", _("Forward"));
|| (!strcasecmp(&WC->wc_roomname[11], USERCONFIGROOM))
|| (WC->wc_view == VIEW_ADDRESSBOOK)
) {
- wprintf("<a href=\"edit_vcard?msgnum=%ld?partnum=%s\">",
+ wprintf("<a href=\"edit_vcard?msgnum=%ld&partnum=%s\">",
msgnum, vcard_partnum);
wprintf("[%s]</a>", _("edit"));
}
msgnum = StrTol(WC->UrlFragment1);
output_headers(0, 0, 0, 0, 0, 0);
- wprintf("Content-type: text/html\r\n"
+ hprintf("Content-type: text/html\r\n"
"Server: %s\r\n"
"Connection: close\r\n",
PACKAGE_STRING);
begin_burst();
- wprintf("\r\n\r\n<html>\n<head><title>");
+ wprintf("\r\n<html>\n<head><title>");
escputs(WC->wc_fullname);
wprintf("</title></head>\n"
"<body onLoad=\" window.print(); window.close(); \">\n"
wDumpContent(0);
}
-
+/*
+ * Mobile browser view of message
+ *
+ * @param msg_num_as_string Message number as a string instead of as a long int
+ */
+void mobile_message_view(void) {
+ long msgnum = 0L;
+ msgnum = StrTol(WC->UrlFragment1);
+ output_headers(1, 0, 0, 0, 0, 1);
+ begin_burst();
+ do_template("msgcontrols", NULL);
+ read_message(msgnum,1, "");
+ wDumpContent(0);
+}
/**
* \brief Display a message's headers
msgnum = StrTol(WC->UrlFragment1);
output_headers(0, 0, 0, 0, 0, 0);
- wprintf("Content-type: text/plain\r\n"
+ hprintf("Content-type: text/plain\r\n"
"Server: %s\r\n"
"Connection: close\r\n",
PACKAGE_STRING);
wprintf("<tr id=\"m%ld\" style=\"font-weight:%s;\" "
"onMouseDown=\"CtdlMoveMsgMouseDown(event,%ld)\">",
WC->summ[num].msgnum,
- (WC->summ[num].is_new ? "bold" : "normal"),
+ ((WC->summ[num].is_new) ? "bold" : "normal"),
WC->summ[num].msgnum
);
(WC->summ[num].is_new ? "bold" : "normal"),
WC->summ[num].msgnum
);
- wprintf("<span>%s</span>",WC->summ[num].from);
+ wprintf("<span class=\"from\">%s</span>",WC->summ[num].from);
wprintf("<span style=\"float: right;\">");
webcit_fmt_date(datebuf, WC->summ[num].date, 1); /* brief */
- escputs(datebuf);
+ escputs(datebuf);
wprintf("</span><br/><span class=\"subject\">");
- wprintf(WC->summ[num].subj);
+ escputs(WC->summ[num].subj);
wprintf("</span></div><div id=\"m_%ld\" class=\"msgview\" onMouseDown=\"\"></div></div>",WC->summ[num].msgnum);
}
|| (WC->wc_view == VIEW_ADDRESSBOOK)
) {
wprintf("<a href=\"edit_vcard?"
- "msgnum=%ld?partnum=%s\">",
+ "msgnum=%ld&partnum=%s\">",
msgnum, vcard_partnum);
wprintf("[%s]</a>", _("edit"));
}
wprintf("<a href=\"readfwd?startmsg=%ld&is_singlecard=1",
addrbook[i].ab_msgnum);
- wprintf("?maxmsgs=1?is_summary=0?alpha=%s\">", bstr("alpha"));
+ wprintf("?maxmsgs=1&is_summary=0&alpha=%s\">", bstr("alpha"));
vcard_n_prettyize(addrbook[i].ab_name);
escputs(addrbook[i].ab_name);
wprintf("</a></td>\n");
++displayed;
}
+ /* Placeholders for empty columns at end */
+ if ((num_ab % 4) != 0) {
+ for (i=0; i<(4-(num_ab % 4)); ++i) {
+ wprintf("<td> </td>");
+ }
+ }
+
wprintf("</tr></table>\n");
end_tab((num_pages-1), num_pages);
+ begin_tab(num_pages, num_pages);
+ /* FIXME there ought to be something here */
+ end_tab(num_pages, num_pages);
+
for (i=0; i<num_pages; ++i) {
free(tablabels[i]);
}
-/**
- * \brief load message pointers from the server
- * \param servcmd the citadel command to send to the citserver
- * \param with_headers what headers???
+/*
+ * load message pointers from the server for a "read messages" operation
+ *
+ * servcmd: the citadel command to send to the citserver
+ * with_headers: also include some of the headers with the message numbers (more expensive)
*/
int load_msg_ptrs(char *servcmd, int with_headers)
{
typedef int (*QSortFunction) (const void*, const void*);
-/**
- * \brief qsort() compatible function to compare two longs in descending order.
- *
- * \param s1 first number to compare
- * \param s2 second number to compare
+
+/*
+ * qsort() compatible function to compare two longs in descending order.
*/
int longcmp_r(const void *s1, const void *s2) {
long l1;
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by ascending subject.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by ascending subject.
*/
int summcmp_subj(const void *s1, const void *s2) {
struct message_summary *summ1;
return strcasecmp(summ1->subj, summ2->subj);
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by descending subject.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by descending subject.
*/
int summcmp_rsubj(const void *s1, const void *s2) {
struct message_summary *summ1;
return strcasecmp(summ2->subj, summ1->subj);
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by ascending sender.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by ascending sender.
*/
int summcmp_sender(const void *s1, const void *s2) {
struct message_summary *summ1;
return strcasecmp(summ1->from, summ2->from);
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by descending sender.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by descending sender.
*/
int summcmp_rsender(const void *s1, const void *s2) {
struct message_summary *summ1;
return strcasecmp(summ2->from, summ1->from);
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by ascending date.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by ascending date.
*/
int summcmp_date(const void *s1, const void *s2) {
struct message_summary *summ1;
else return 0;
}
-/**
- * \brief qsort() compatible function to compare two message summary structs by descending date.
- *
- * \param s1 first item to compare
- * \param s2 second item to compare
+/*
+ * qsort() compatible function to compare two message summary structs by descending date.
*/
int summcmp_rdate(const void *s1, const void *s2) {
struct message_summary *summ1;
eUnSet
};
-/** SortEnum to plain string representation */
+/* SortEnum to plain string representation */
static const char* SortByStrings[] = {
"date",
"rdate",
"unset"
};
-/** SortEnum to sort-Function Table */
+/* SortEnum to sort-Function Table */
const QSortFunction SortFuncs[eUnSet] = {
summcmp_date,
summcmp_rdate,
summcmp_rdate
};
-/** given a SortEnum, which icon should we choose? */
+/* given a SortEnum, which icon should we choose? */
const int SortDateToIcon[eUnSet] = { eUp, eDown, eNone, eNone, eNone, eNone, eNone};
const int SortSubjectToIcon[eUnSet] = { eNone, eNone, eUp, eDown, eNone, eNone, eNone};
const int SortSenderToIcon[eUnSet] = { eNone, eNone, eNone, eNone, eUp, eDown, eNone};
-/** given a SortEnum, which would be the "opposite" search option? */
+/* given a SortEnum, which would be the "opposite" search option? */
const int DateInvertSortString[eUnSet] = { eRDate, eDate, eDate, eDate, eDate, eDate, eDate};
const int SubjectInvertSortString[eUnSet] = { eSubject, eSubject, eRSubject, eUnSet, eSubject, eSubject, eSubject};
const int SenderInvertSortString[eUnSet] = { eSender, eSender, eSender, eSender, eRSender, eUnSet, eSender};
-/**
- * \Brief Translates sortoption String to its SortEnum representation
- * \param SortBy string to translate
- * \return the enum matching the string; defaults to RDate
+/*
+ * Translates sortoption String to its SortEnum representation
+ * returns the enum matching the string; defaults to RDate
*/
//SortByEnum
-int StrToESort (StrBuf *sortby)
+int StrToESort (const StrBuf *sortby)
{
int result = eDate;
-/**
- * \brief command loop for reading messages
+/*
+ * command loop for reading messages
*
- * \param oper Set to "readnew" or "readold" or "readfwd" or "headers"
+ * Set oper to "readnew" or "readold" or "readfwd" or "headers"
*/
void readloop(char *oper)
{
int highest_displayed = 0;
struct addrbookent *addrbook = NULL;
int num_ab = 0;
- StrBuf *sortby = NULL;
+ const StrBuf *sortby = NULL;
//SortByEnum
int SortBy = eRDate;
- StrBuf *sortpref_name;
- StrBuf *sortpref_value;
+ const StrBuf *sortpref_value;
int bbs_reverse = 0;
struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */
if (WCC->wc_view == VIEW_WIKI) {
- sprintf(buf, "wiki?room=%s?page=home", WCC->wc_roomname);
+ sprintf(buf, "wiki?room=%s&page=home", WCC->wc_roomname);
http_redirect(buf);
return;
}
is_summary = (ibstr("is_summary") && !WCC->is_mobile);
if (maxmsgs == 0) maxmsgs = DEFAULT_MAXMSGS;
- sortpref_name = NewStrBuf ();
- StrBufPrintf(sortpref_name, "sort %s", WCC->wc_roomname);
- get_pref(sortpref_name, &sortpref_value);
+ sortpref_value = get_room_pref("sort");
- sortby = NewStrBufPlain(bstr("sortby"), -1);
+ sortby = sbstr("sortby");
if ( (!IsEmptyStr(ChrPtr(sortby))) &&
(strcasecmp(ChrPtr(sortby), ChrPtr(sortpref_value)) != 0)) {
- set_pref(sortpref_name, sortby, 1);
+ set_room_pref("sort", NewStrBufDup(sortby), 1);
sortpref_value = NULL;
sortpref_value = sortby;
}
-
- FreeStrBuf(&sortpref_name);
+
SortBy = StrToESort(sortpref_value);
- /** message board sort */
+ /* message board sort */
if (SortBy == eReverse) {
bbs_reverse = 1;
}
output_headers(1, 1, 1, 0, 0, 0);
- /**
+ /*
* When in summary mode, always show ALL messages instead of just
* new or old. Otherwise, show what the user asked for.
*/
maxmsgs = 9999999;
}
- if (is_summary || WCC->is_mobile) { /**< fetch header summary */
+ if (is_summary) { /**< fetch header summary */
snprintf(cmd, sizeof(cmd), "MSGS %s|%s||1",
(!strcmp(oper, "do_search") ? "SEARCH" : "ALL"),
(!strcmp(oper, "do_search") ? bstr("query") : "")
}
if (WCC->is_mobile) {
maxmsgs = 20;
+ snprintf(cmd, sizeof(cmd), "MSGS %s|%s||1",
+ (!strcmp(oper, "do_search") ? "SEARCH" : "ALL"),
+ (!strcmp(oper, "do_search") ? bstr("query") : "")
+ );
SortBy = eRDate;
}
- /**
+ /*
* Are we doing a summary view? If so, we need to know old messages
* and new messages, so we can do that pretty boldface thing for the
* new messages.
"<table cellspacing=0 style=\"width:100%%\">"
"<tr>"
);
- wprintf("<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
- "<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
- "<th width=%d%%>%s <a href=\"readfwd?startmsg=1?maxmsgs=9999999?is_summary=1?sortby=%s\"><img border=\"0\" src=\"%s\" /></a> \n"
+ wprintf("<th width=%d%%>%s <a href=\"readfwd?startmsg=1&maxmsgs=9999999&is_summary=1&sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
+ "<th width=%d%%>%s <a href=\"readfwd?startmsg=1&maxmsgs=9999999&is_summary=1&sortby=%s\"><img border=\"0\" src=\"%s\" /></a> </th>\n"
+ "<th width=%d%%>%s <a href=\"readfwd?startmsg=1&maxmsgs=9999999&is_summary=1&sortby=%s\"><img border=\"0\" src=\"%s\" /></a> \n"
" "
"<input type=\"submit\" name=\"delete_button\" id=\"delbutton\" "
" onClick=\"CtdlDeleteSelectedMessages(event)\" "
if (lo < 1) lo = 1;
wprintf("<option %s value="
"\"%s"
- "?startmsg=%ld"
- "?maxmsgs=%d"
- "?is_summary=%d\">"
+ "&startmsg=%ld"
+ "&maxmsgs=%d"
+ "&is_summary=%d\">"
"%d-%d</option> \n",
((WCC->msgarr[lo-1] == startmsg) ? "selected" : ""),
oper,
if (hi > nummsgs) hi = nummsgs;
wprintf("<option %s value="
"\"%s"
- "?startmsg=%ld"
- "?maxmsgs=%d"
- "?is_summary=%d\">"
+ "&startmsg=%ld"
+ "&maxmsgs=%d"
+ "&is_summary=%d\">"
"%d-%d</option> \n",
((WCC->msgarr[b] == startmsg) ? "selected" : ""),
oper,
}
wprintf("<option value=\"%s?startmsg=%ld"
- "?maxmsgs=9999999?is_summary=%d\">",
+ "&maxmsgs=9999999&is_summary=%d\">",
oper,
WCC->msgarr[0], is_summary);
wprintf(_("All"));
if (lo < 1) lo = 1;
wprintf("<option %s value="
"\"%s"
- "?startmsg=%ld"
- "?maxmsgs=%d"
- "?is_summary=%d\">"
+ "&startmsg=%ld"
+ "&maxmsgs=%d"
+ "&is_summary=%d\">"
"%d-%d</option> \n",
((WCC->msgarr[lo-1] == startmsg) ? "selected" : ""),
oper,
if (hi > nummsgs) hi = nummsgs;
wprintf("<option %s value="
"\"%s"
- "?startmsg=%ld"
- "?maxmsgs=%d"
- "?is_summary=%d\">"
+ "&startmsg=%ld"
+ "&maxmsgs=%d"
+ "&is_summary=%d\">"
"%d-%d</option> \n",
((WCC->msgarr[b] == startmsg) ? "selected" : ""),
oper,
}
}
- wprintf("<option value=\"%s?startmsg=%ld"
- "?maxmsgs=9999999?is_summary=%d\">",
+ wprintf("<option value=\"%s&startmsg=%ld"
+ "&maxmsgs=9999999&is_summary=%d\">",
oper,
WCC->msgarr[0], is_summary);
wprintf(_("All"));
/** forward/reverse */
wprintf("<input type=\"radio\" %s name=\"direction\" value=\"\""
- "OnChange=\"location.href='%s?sortby=forward'\"",
+ "OnChange=\"location.href='%s&sortby=forward'\"",
(bbs_reverse ? "" : "checked"),
oper
);
wprintf(_("oldest to newest"));
wprintf(" ");
wprintf("<input type=\"radio\" %s name=\"direction\" value=\"\""
- "OnChange=\"location.href='%s?sortby=reverse'\"",
+ "OnChange=\"location.href='%s&sortby=reverse'\"",
(bbs_reverse ? "checked" : ""),
oper
);
*/
void post_message(void)
{
- urlcontent *u;
- void *U;
char buf[1024];
- char *encoded_subject = NULL;
+ StrBuf *encoded_subject = NULL;
static long dont_post = (-1L);
struct wc_attachment *att, *aptr;
int is_anonymous = 0;
- const char *display_name;
- long dpLen = 0;
+ const StrBuf *display_name = NULL;
struct wcsession *WCC = WC;
- char *ptr = NULL;
-
+
if (havebstr("force_room")) {
gotoroom(bstr("force_room"));
}
- if (GetHash(WC->urlstrings, HKEY("display_name"), &U)) {
- u = (urlcontent*) U;
- display_name = u->url_data;
- dpLen = u->url_data_size;
- }
- else {
- display_name="";
- }
- if (!strcmp(display_name, "__ANONYMOUS__")) {
- display_name = "";
- is_anonymous = 1;
+ if (havebstr("display_name")) {
+ display_name = sbstr("display_name");
+ if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) {
+ display_name = NULL;
+ is_anonymous = 1;
+ }
}
if (WCC->upload_length > 0) {
"saved this message."));
} else {
const char CMD[] = "ENT0 1|%s|%d|4|%s|%s||%s|%s|%s|%s|%s";
- const char *Recp = "";
- const char *Cc = "";
- const char *Bcc = "";
- const char *Wikipage = "";
- const char *my_email_addr = "";
- char *CmdBuf = NULL;;
- long len = 0;
- size_t nLen;
- char references[SIZ] = "";
- size_t references_len = 0;
-
- safestrncpy(references, bstr("references"), sizeof references);
- lprintf(9, "Converting: %s\n", references);
- for (ptr=references; *ptr != 0; ++ptr) {
- if (*ptr == '|') *ptr = '!';
- ++references_len;
- }
- lprintf(9, "Converted: %s\n", references);
-
+ const StrBuf *Recp = NULL;
+ const StrBuf *Cc = NULL;
+ const StrBuf *Bcc = NULL;
+ const StrBuf *Wikipage = NULL;
+ const StrBuf *my_email_addr = NULL;
+ StrBuf *CmdBuf = NULL;;
+ StrBuf *references = NULL;
+
+ if (havebstr("references"))
+ {
+ const StrBuf *ref = sbstr("references");
+ references = NewStrBufPlain(ChrPtr(ref), StrLength(ref));
+ lprintf(9, "Converting: %s\n", ChrPtr(references));
+ StrBufReplaceChars(references, '|', '!');
+ lprintf(9, "Converted: %s\n", ChrPtr(references));
+ }
if (havebstr("subject")) {
- char *Subj;
- size_t SLen;
+ const StrBuf *Subj;
/*
* make enough room for the encoded string;
* plus the QP header
*/
- Subj = xbstr("subject", &SLen);
- len = SLen * 3 + 32;
- encoded_subject = malloc (len);
- len = webcit_rfc2047encode(encoded_subject, len, Subj, SLen);
- if (len < 0) {
- free (encoded_subject);
- return;
- }
- }
- len += sizeof (CMD) + dpLen;
- Recp = xbstr("recp", &nLen);
- len += nLen;
- Cc = xbstr("cc", &nLen);
- len += nLen;
- Bcc = xbstr("bcc", &nLen);
- len += nLen;
- Wikipage = xbstr("wikipage", &nLen);
- len += nLen;
- my_email_addr = xbstr("my_email_addr", &nLen);
- len += nLen;
- len += references_len;
-
- CmdBuf = (char*) malloc (len + 11);
-
- snprintf(CmdBuf, len + 1, CMD,
- Recp,
- is_anonymous,
- (encoded_subject ? encoded_subject : ""),
- display_name,
- Cc,
- Bcc,
- Wikipage,
- my_email_addr,
- references);
+ Subj = sbstr("subject");
+
+ StrBufRFC2047encode(&encoded_subject, Subj);
+ }
+ Recp = sbstr("recp");
+ Cc = sbstr("cc");
+ Bcc = sbstr("bcc");
+ Wikipage = sbstr("wikipage");
+ my_email_addr = sbstr("my_email_addr");
+
+ CmdBuf = NewStrBufPlain(NULL,
+ sizeof (CMD) +
+ StrLength(Recp) +
+ StrLength(encoded_subject) +
+ StrLength(Cc) +
+ StrLength(Bcc) +
+ StrLength(Wikipage) +
+ StrLength(my_email_addr) +
+ StrLength(references));
+
+ StrBufPrintf(CmdBuf,
+ CMD,
+ ChrPtr(Recp),
+ is_anonymous,
+ ChrPtr(encoded_subject),
+ ChrPtr(display_name),
+ ChrPtr(Cc),
+ ChrPtr(Bcc),
+ ChrPtr(Wikipage),
+ ChrPtr(my_email_addr),
+ ChrPtr(references));
+ FreeStrBuf(&references);
+
lprintf(9, "%s\n", CmdBuf);
- serv_puts(CmdBuf);
+ serv_puts(ChrPtr(CmdBuf));
serv_getln(buf, sizeof buf);
- free (CmdBuf);
- if (encoded_subject) free(encoded_subject);
+ FreeStrBuf(&CmdBuf);
+ FreeStrBuf(&encoded_subject);
if (buf[0] == '4') {
post_mime_to_server();
if ( (havebstr("recp"))
char buf[SIZ];
StrBuf *ebuf;
long now;
- char *display_name;
+ const StrBuf *display_name = NULL;
struct wc_attachment *att;
int recipient_required = 0;
int subject_required = 0;
int recipient_bad = 0;
int is_anonymous = 0;
long existing_page = (-1L);
- size_t dplen;
struct wcsession *WCC = WC;
now = time(NULL);
gotoroom(bstr("force_room"));
}
- display_name = xbstr("display_name", &dplen);
- if (!strcmp(display_name, "__ANONYMOUS__")) {
- display_name = "";
- dplen = 0;
+ display_name = sbstr("display_name");
+ if (!strcmp(ChrPtr(display_name), "__ANONYMOUS__")) {
+ display_name = NULL;
is_anonymous = 1;
}
/* Now check our actual recipients if there are any */
if (recipient_required) {
- const char *Recp = "";
- const char *Cc = "";
- const char *Bcc = "";
- const char *Wikipage = "";
- char *CmdBuf = NULL;;
- size_t len = 0;
- size_t nLen;
+ const StrBuf *Recp = NULL;
+ const StrBuf *Cc = NULL;
+ const StrBuf *Bcc = NULL;
+ const StrBuf *Wikipage = NULL;
+ StrBuf *CmdBuf = NULL;;
const char CMD[] = "ENT0 0|%s|%d|0||%s||%s|%s|%s";
- len = sizeof(CMD) + dplen;
- Recp = xbstr("recp", &nLen);
- len += nLen;
- Cc = xbstr("cc", &nLen);
- len += nLen;
- Bcc = xbstr("bcc", &nLen);
- len += nLen;
- Wikipage = xbstr("wikipage", &nLen);
- len += nLen;
+ Recp = sbstr("recp");
+ Cc = sbstr("cc");
+ Bcc = sbstr("bcc");
+ Wikipage = sbstr("wikipage");
-
- CmdBuf = (char*) malloc (len + 1);
-
- snprintf(CmdBuf, len, CMD,
- Recp, is_anonymous,
- display_name,
- Cc, Bcc, Wikipage);
- serv_puts(CmdBuf);
+ CmdBuf = NewStrBufPlain(NULL,
+ sizeof (CMD) +
+ StrLength(Recp) +
+ StrLength(display_name) +
+ StrLength(Cc) +
+ StrLength(Bcc) +
+ StrLength(Wikipage));
+
+ StrBufPrintf(CmdBuf,
+ CMD,
+ ChrPtr(Recp),
+ is_anonymous,
+ ChrPtr(display_name),
+ ChrPtr(Cc),
+ ChrPtr(Bcc),
+ ChrPtr(Wikipage));
+ serv_puts(ChrPtr(CmdBuf));
serv_getln(buf, sizeof buf);
+ FreeStrBuf(&CmdBuf);
if (!strncmp(buf, "570", 3)) { /** 570 means we have an invalid recipient listed */
if (havebstr("recp") &&
}
sig ++;
}
+ FreeStrBuf(&Sig);
}
}
* The following template embeds the TinyMCE richedit control, and automatically
* transforms the textarea into a richedit textarea.
*/
- do_template("richedit");
+ do_template("richedit", NULL);
/** Enumerate any attachments which are already in place... */
wprintf("<div class=\"attachment buttons\"><img src=\"static/diskette_24x.gif\" class=\"imgedit\" > ");
WebcitAddUrlHandler(HKEY("confirm_move_msg"), confirm_move_msg, 0);
WebcitAddUrlHandler(HKEY("msg"), embed_message, NEED_URL|AJAX);
WebcitAddUrlHandler(HKEY("printmsg"), print_message, NEED_URL);
+ WebcitAddUrlHandler(HKEY("mobilemsg"), mobile_message_view, NEED_URL);
WebcitAddUrlHandler(HKEY("msgheaders"), display_headers, NEED_URL);
return ;
}