📄 mms_msg.c
字号:
if (!isforward) {
m->message_type = MMS_MSGTYPE_SEND_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-send-conf");
} else {
m->message_type = MMS_MSGTYPE_FORWARD_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-forward-conf");
}
http_header_add(m->headers, "X-Mms-Transaction-ID", transid);
if (menc >= MS_1_2)
http_header_add(m->headers, "X-Mms-MMS-Version", "1.2");
else
http_header_add(m->headers, "X-Mms-MMS-Version", MMS_DEFAULT_VERSION);
http_header_add(m->headers, "X-Mms-Response-Status", errstr);
if (msgid)
http_header_add(m->headers, "Message-ID", msgid);
return m;
}
int mms_make_sendreq(MmsMsg *retrieveconf)
{
gw_assert(retrieveconf);
if (retrieveconf->message_type == MMS_MSGTYPE_SEND_REQ)
return 0;
gw_assert(retrieveconf->message_type == MMS_MSGTYPE_RETRIEVE_CONF);
retrieveconf->message_type = MMS_MSGTYPE_SEND_REQ;
mms_replace_header_value(retrieveconf, "X-Mms-Message-Type",
(char *)mms_message_type_to_cstr(MMS_MSGTYPE_SEND_REQ));
return 0;
}
int mms_replace_header_value(MmsMsg *msg, char *hname, char *value)
{
gw_assert(msg);
http_header_remove_all(msg->headers, hname);
http_header_add(msg->headers, hname, value);
return 0;
}
int mms_add_missing_headers(MmsMsg *msg, List *headers)
{
List *h;
gw_assert(msg);
h = http_header_duplicate(headers);
http_header_combine(h, msg->headers);
http_destroy_headers(msg->headers);
msg->headers = h;
return 0;
}
int mms_replace_header_values(MmsMsg *msg, char *hname, List *value)
{
int i;
gw_assert(msg);
http_header_remove_all(msg->headers, hname);
for (i = 0; i < gwlist_len(value); i++) {
Octstr *x = gwlist_get(value, i);
http_header_add(msg->headers, hname, octstr_get_cstr(x));
}
return 0;
}
Octstr *mms_get_header_value(MmsMsg *msg, Octstr *header)
{
gw_assert(msg);
return http_header_value(msg->headers, header);
}
List *mms_get_header_values(MmsMsg *msg, Octstr *header)
{
List *h;
List *l;
int i;
gw_assert(msg);
l = gwlist_create();
h = http_header_find_all(msg->headers, octstr_get_cstr(header));
for (i = 0; i < gwlist_len(h); i++) {
Octstr *hname, *value;
http_header_get(h, i, &hname, &value);
gwlist_append(l, value);
octstr_destroy(hname);
}
http_destroy_headers(h);
return l;
}
int mms_convert_readrec2readorig(MmsMsg *msg)
{
Octstr *s;
gw_assert(msg);
if (msg->message_type != MMS_MSGTYPE_READ_REC_IND)
return -1;
mms_replace_header_value(msg, "X-Mms-Message-Type", "m-read-orig-ind");
msg->message_type = MMS_MSGTYPE_READ_ORIG_IND;
if ((s = mms_get_header_value(msg, octstr_imm("Date"))) == NULL) {
time_t t = time(NULL);
s = date_format_http(t);
mms_replace_header_value(msg, "Date", octstr_get_cstr(s));
}
if (s)
octstr_destroy(s);
return 0;
}
MmsMsg *mms_storeconf(char *errstr, char *transid, Octstr *msgloc, int isupload, int menc)
{
MmsMsg *m = gw_malloc(sizeof *m);
m->ismultipart = 0;
m->msgId = NULL;
m->body.s = NULL;
m->headers = http_create_empty_headers();
if (!isupload) {
m->message_type = MMS_MSGTYPE_MBOX_STORE_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-mbox-store-conf");
} else {
m->message_type = MMS_MSGTYPE_MBOX_UPLOAD_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-mbox-upload-conf");
}
http_header_add(m->headers, "X-Mms-Transaction-ID", transid);
http_header_add(m->headers, "X-Mms-MMS-Version", "1.2"); /* ignore menc for now. */
http_header_add(m->headers, "X-Mms-Store-Status", errstr);
if (msgloc)
http_header_add(m->headers, "X-Mms-Content-Location", octstr_get_cstr(msgloc));
return m;
}
MmsMsg *mms_deleteconf(int menc, char *transid)
{
MmsMsg *m = gw_malloc(sizeof *m);
m->ismultipart = 0;
m->msgId = NULL;
m->body.s = NULL;
m->headers = http_create_empty_headers();
m->message_type = MMS_MSGTYPE_MBOX_DELETE_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-mbox-delete-conf");
http_header_add(m->headers, "X-Mms-Transaction-ID", transid);
http_header_add(m->headers, "X-Mms-MMS-Version", "1.2"); /* ignore menc for now. */
return m;
}
static int mms_msgsize(MmsMsg *m)
{
Octstr *s;
int n;
gw_assert(m);
s = mms_tobinary(m); /* Dirty, but works... */
n = octstr_len(s);
octstr_destroy(s);
return n;
}
static int mms_convert_to_mboxdescr(MmsMsg *mm, Octstr *cloc, List *reqhdrs,
unsigned long msize)
{
int i, n;
List *mh, *xh;
Octstr *xstate;
int addcontent = 0, hasmsgid = 0;
if (!mm)
return -1;
mh = http_create_empty_headers();
mm->message_type = MMS_MSGTYPE_MBOX_DESCR;
http_header_add(mh, "X-Mms-Message-Type", "m-mbox-descr");
http_header_add(mh, "X-Mms-MMS-Version", "1.2");
http_header_add(mh, "X-Mms-Content-Location", octstr_get_cstr(cloc));
/* Add only those headers requested. */
for (i = 0, n = gwlist_len(reqhdrs); i < n; i++) {
Octstr *header = gwlist_get(reqhdrs,i);
List *h = http_header_find_all(mm->headers, octstr_get_cstr(header));
int j;
if (octstr_case_compare(header, octstr_imm("Content")) == 0) {
addcontent = 1;
goto loop;
} else if (octstr_case_compare(header, octstr_imm("X-Mms-Message-Size")) == 0) {
char yy[64];
sprintf(yy, "%lu", msize);
http_header_add(mh, "X-Mms-Message-Size", yy);
goto loop;
} else if (octstr_case_compare(header, octstr_imm("Message-ID")) == 0)
hasmsgid = 1;
for (j = 0; j < gwlist_len(h); j++) {
Octstr *hname, *value;
http_header_get(h, j, &hname, &value);
octstr_destroy(hname);
http_header_add(mh, octstr_get_cstr(header), octstr_get_cstr(value));
octstr_destroy(value);
}
loop:
http_destroy_headers(h);
/* We ignore the extra attributes request. */
}
if (!hasmsgid) {
Octstr *v = http_header_value(mm->headers, octstr_imm("Message-ID"));
if (v) {
http_header_add(mh, "Message-ID",
octstr_get_cstr(v));
octstr_destroy(v);
}
}
/* Copy over the MM-State and MM-flags headers. */
xh = http_header_find_all(mm->headers, "X-Mms-MM-Flags");
if (xh) {
http_header_combine(mh,xh);
http_destroy_headers(xh);
}
xstate = http_header_value(mm->headers, octstr_imm("X-Mms-MM-State"));
if (xstate) {
http_header_remove_all(mh, "X-Mms-MM-State");
http_header_add(mh, "X-Mms-MM-State", octstr_get_cstr(xstate));
octstr_destroy(xstate);
}
if (!addcontent) {
if (mm->ismultipart)
gwlist_destroy(mm->body.l, (gwlist_item_destructor_t *)mime_entity_destroy);
else if (mm->body.s)
octstr_destroy(mm->body.s);
mm->body.s = NULL;
} else {
/* copy over content type. */
Octstr *ctype = http_header_value(mm->headers, octstr_imm("Content-Type"));
if (ctype) {
http_header_add(mh, "Content-Type", octstr_get_cstr(ctype));
octstr_destroy(ctype);
}
}
http_destroy_headers(mm->headers);
mm->headers = mh;
return 0;
}
MmsMsg *mms_viewconf(char *transid,
List *msgrefs,
List *msglocs,
char *err,
List *required_headers,
MmsMsgGetFunc_t *getmsg,
void *p1, void *p2,
int maxsize, int menc,
List *otherhdrs)
{
MmsMsg *m = gw_malloc(sizeof *m);
int msize, i, n;
int msgcount;
err = err ? err : "Ok";
m->ismultipart = 0;
m->msgId = NULL;
m->body.s = NULL;
m->headers = http_create_empty_headers();
m->message_type = MMS_MSGTYPE_MBOX_VIEW_CONF;
http_header_add(m->headers, "X-Mms-Message-Type", "m-mbox-view-conf");
http_header_add(m->headers, "X-Mms-Transaction-ID", transid);
http_header_add(m->headers, "X-Mms-MMS-Version", "1.2"); /* ignore menc for now. */
/* Put in some dummy headers so count works fine ... */
http_header_add(m->headers, "X-Mms-Message-Count", "0");
http_header_add(m->headers, "Content-Type", "*/*"); /* we'll change this later. */
http_header_combine(m->headers, otherhdrs); /* add any other hdrs passed. */
if (msgrefs == NULL ||
strcasecmp(err, "ok") != 0) { /* We got an error. */
http_header_add(m->headers, "X-Mms-Response-Status",
err ? err : "Error-unspecified");
return m;
} else
http_header_add(m->headers, "X-Mms-Response-Status", "Ok");
msize = mms_msgsize(m);
n = gwlist_len(msgrefs);
msgcount = 0;
m->ismultipart = 1;
m->body.l = gwlist_create();
for (i = 0; i < n; i++) {
unsigned long tmsize;
Octstr *msgref = gwlist_get(msgrefs,i);
Octstr *msgloc = gwlist_get(msglocs, i);
MmsMsg *mm = getmsg(p1, p2, msgref, &tmsize);
Octstr *ms;
if (mms_convert_to_mboxdescr(mm,
msgloc,
required_headers, tmsize) != 0)
goto loop;
ms = mms_tobinary(mm);
if (octstr_len(ms) + msize <= maxsize) {
MIMEEntity *mtmp = mime_entity_create();
List *h = mime_entity_headers(mtmp);
http_header_add(h, "Content-Type",
"application/vnd.wap.mms-message");
mime_replace_headers(mtmp, h);
mime_entity_set_body(mtmp, ms);
http_destroy_headers(h);
gwlist_append(m->body.l, mtmp);
msgcount++;
msize += octstr_len(ms);
} else {
i = n; /* force end. */
octstr_destroy(ms);
}
mms_destroy(mm);
loop:(void)0;
}
if (gwlist_len(m->body.l) > 0) {
char x[32];
sprintf(x, "%d", (int)gwlist_len(m->body.l));
mms_replace_header_value(m, "X-Mms-Message-Count", x);
mms_replace_header_value(m, "Content-Type", "application/vnd.wap.multipart.mixed");
} else {
gwlist_destroy(m->body.l,NULL);
m->body.s = NULL;
m->ismultipart = 0;
}
return m;
}
void *mms_msgbody(MmsMsg *msg)
{
if (!msg)
return NULL;
if (msg->ismultipart) {
List *l = gwlist_create();
int i;
for (i = 0; i < gwlist_len(msg->body.l); i++)
gwlist_append(l, mime_entity_duplicate(gwlist_get(msg->body.l,i)));
return l;
} else
return octstr_duplicate(msg->body.s);
}
int mms_clearbody(MmsMsg *msg)
{
if (!msg)
return -1;
if (msg->ismultipart)
gwlist_destroy(msg->body.l, (gwlist_item_destructor_t *)mime_entity_destroy);
else if (msg->body.s)
octstr_destroy(msg->body.s);
msg->body.s = NULL;
msg->ismultipart = 0;
http_header_remove_all(msg->headers, "Content-Type");
return 0;
}
int mms_putbody(MmsMsg *msg, void *body, int ismultipart)
{
gw_assert(msg);
mms_clearbody(msg);
msg->ismultipart = ismultipart;
msg->body.s = body;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -