⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mms_msg.c

📁 手机端彩信的编解码、以及接收和发送。非常有用。
💻 C
📖 第 1 页 / 共 5 页
字号:
     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 + -