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

📄 messagefactory.cpp

📁 mms message builder (part)
💻 CPP
字号:
#include "stdafx.h"
#include "MessageFactory.h"
#include "MmsParser.h"
#include "mmscontent.h"
#include "mmsstring.h"

#define CONTENT_LENGTH_MARK "%{LENGTH}%"

char *str_replace(char *src, char *ori_str, char *new_str)
{
	char *p, *p1, *p2;
	char *tmp_str;
	int len;

	tmp_str = (char *)malloc(strlen(src) + strlen(new_str));
	if (tmp_str == NULL)
		return NULL;

	p1 = strstr(src, ori_str);
	p2 = p1 + strlen(ori_str);

	p = tmp_str;
	len = p1 - src;
	memcpy(p, src, len);
	p += len;

	len = strlen(new_str);
	memcpy(p, new_str, len);
	p += len;

	len = strlen(p2);
	memcpy(p, p2, len);
	p += len;

	*p = 0;

	memcpy(src, tmp_str, p - tmp_str);

	return p1;
}

/******
 * Build ppg response message.
 *********/
int MessageBuilder::buildPpgRes(char *res, int nbytes)
{
    char s[] = "HTTP/1.1 202 Foo\r\n" \
        "Server: UTStarCom WAPGW PPG/3.1.0.5" \
        "Content-Length: 440\r\n" \
        "Content-Type: application/xml\r\n\r\n" \
        "<?xml version=\"1.0\"?>" \
        "<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.0//EN\" \"http://www.wapforum.org/DTD/pap_2.0.dtd\">" \
        "<pap><push-response push-id=\"061813405191000100001immc.utstar.com.cn\"" \
        " sender-name=\"blade1; WAP/1.3 (UTStarCom WAPGW PPG/3.1.0.5)\"" \
        " reply-time=\"2004-06-18T05:40:52Z\" sender-address=\"/cgi-bin/wap-push.cgi\">" \
        "<response-result code =\"1001\" desc=\"The request has been accepted for processing\">" \
        "</response-result></push-response></pap>";

    memcpy (res, s, strlen(s));
    return strlen(s);
}

/******
 * Build mms_retrive message.
 *********/
int MessageBuilder::buildRetrieveReq(char *svr_ip, int svr_port, char * msg_id, char * msisdn, char *req)
{
	char buf[PKG_MAX_LEN];
    sprintf(buf, "GET /%s HTTP/1.1\r\nHost: %s:%d\r\n" \
		"User-Agent: ACS-NF/3.0 NEC-c616/001.00\r\n" \
		"X-Up-Calling-Line-Id: %s \r\n\r\n", msg_id, svr_ip, svr_port, msisdn);
    
	strcpy(req, buf);

    return strlen(buf);
}

void generate_address(char *adr, char *dst_buf)
{
	if (strchr(adr, '/')) 
	{
		strcpy(dst_buf, adr);
		return;
	}

	if (strchr(adr, '@') == NULL)
		sprintf(dst_buf, "%s/type=plmn", adr);
	else
		sprintf(dst_buf, "%s/type=email", adr);
}

/******
 * Build motification response message.
 *********/
int MessageBuilder::buildNotificationRes(char * transaction_id, char * msisdn, int status, char *res)
{
    char *p;
    char s1[] = "POST / HTTP/1.0\r\n" \
        "Host: 172.28.17.134:9090\r\n" \
        "User-Agent: ACS-NF/3.0 NEC-c616/001.00\r\n" \
        "Content-Type: application/vnd.wap.mms-message\r\n" \
        "Content-Length: %{LENGTH}%\r\n" \
        "X-Up-Calling-Line-Id: ";
	int len;

	p = res;

    memcpy(p, s1, strlen(s1));
    p += strlen(s1);

    memcpy(p, "86", 2);
    p += 2;

    memcpy(p, msisdn, strlen(msisdn));
    p += strlen(msisdn);

    memcpy(p, "\r\n\r\n", 4);
    p += 4;

    // message_type token;   transaction token
	unsigned char s2[] = {MMS_HEAD_MSG_TYPE, 0x83, MMS_HEAD_TRANS_ID};
    memcpy(p, s2, 3);
    p += 3;

    memcpy(p, transaction_id, strlen(transaction_id) + 1);
    p += strlen(transaction_id) + 1;

	// version token; mms_status token
	unsigned char s3[] = {MMS_HEAD_VERSION, 0x90, 
		MMS_HEAD_RPT_ALLOW,	0x80, 
		MMS_HEAD_STATUS, 0x81};

	s3[5] = status;
    memcpy(p, s3, 6);

	p += 6;

	len = p - res;

	char len_str[20];
	sprintf(len_str, "%d", len);
	str_replace(res, CONTENT_LENGTH_MARK, len_str);

    return len;
}

/******
 * Build read_reply report
 *********/
int MessageBuilder::buildReadReplyMsg(char * msg_id, char *from_msisdn, char * to_msisdn, int status, char *res)
{
    char *p, tmp_str[MAX_SIZE_MSISDN], *msg_head_point;

    char s1[] = "POST / HTTP/1.0\r\n" \
        "Host: 172.28.17.134:9090\r\n" \
        "User-Agent: ACS-NF/3.0 NEC-c616/001.00\r\n" \
        "Content-Type: application/vnd.wap.mms-message\r\n" \
        "Content-Length: %{LENGTH}%\r\n" \
        "X-Up-Calling-Line-Id: ";

	int len;

	p = res;
	msg_head_point = p;

    memcpy(p, s1, strlen(s1));
    p += strlen(s1);

    memcpy(p, "86", 2);
    p += 2;

    memcpy(p, to_msisdn, strlen(to_msisdn));
    p += strlen(to_msisdn);

    memcpy(p, "\r\n\r\n", 4);
    p += 4;

	// message_type token;   msg_id token
	unsigned char s2[] = {MMS_HEAD_MSG_TYPE, 0x83, MMS_HEAD_MSG_ID};
    memcpy(p, s2, 3);
    p += 3;

	// fill msg_id string(zero terminated)
    memcpy(p, msg_id, strlen(msg_id) + 1);
    p += strlen(msg_id) + 1;

	*p ++ = (char) MMS_HEAD_TO;
	// fill to address string(zero terminated)
	generate_address(to_msisdn, tmp_str);
	memcpy(p, tmp_str, strlen(tmp_str) + 1);
    p += strlen(tmp_str) + 1;

	*p ++ = (char) MMS_HEAD_FROM;
	// fill from address string(zero terminated)
	generate_address(from_msisdn, tmp_str);
	memcpy(p, tmp_str, strlen(tmp_str) + 1);
    p += strlen(tmp_str) + 1;

	// version token; read_status token
	unsigned char s3[] = {MMS_HEAD_VERSION, 0x90, MMS_HEAD_READ_STAT, 0x81};

	// set the msg status
	s3[3] = status;
    memcpy(p, s3, 4);

	p += 4;

	len = p - msg_head_point;

	char len_str[20];
	sprintf(len_str, "%d", len);
	str_replace(res, CONTENT_LENGTH_MARK, len_str);

	char fn[MAX_SIZE_FILENAME];
	sprintf(fn, "%s\\%s\\%s", ROOT_DIR, LOG_DIR, 
		get_mms_type_name(MMS_MSGTYPE_READ_REC_IND));

	MmsContent::creat_file(fn, res, len);

    return len;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -