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

📄 sms.c

📁 mms client
💻 C
字号:
/* * sms.c - features specific to SMS but not particular to any SMSC protocol. * * This file current contains very little, but sms features that are * currently implemented separately in each protocol should be extracted * and placed here. */#include "sms.h"/*  * Encode DCS using sms fields * mode = 0= encode using 00xxx, 1= encode using Fx mode * */int fields_to_dcs(Msg *msg, int mode) {    int dcs=0;    /* Coding defaults to 7BIT or to 8BIT if udh is set */    if (msg->sms.coding == DC_UNDEF) {	if (octstr_len(msg->sms.udhdata))	  msg->sms.coding = DC_8BIT;	else	  msg->sms.coding = DC_7BIT;    }    /* MWI */    if (msg->sms.mwi != MWI_UNDEF) {	dcs = msg->sms.mwi - 1;  /* sets bits 1 and 0 */	if (dcs & 0x04)		    dcs = (dcs & 0x03) | 0xC0; /* MWI Inactive */	else {	    dcs = (dcs & 0x03) | 0x08;	/* MWI Active, sets bit 3 */	    if (! octstr_len(msg->sms.msgdata))		dcs |= 0xC0;	/* Discard */	    else		if (msg->sms.coding == DC_7BIT)		    dcs |= 0xD0;	/* 7bit */		else		    dcs |= 0xE0;	/* UCS2 */	    	/* XXX Shouldn't happen to have mwi and dc=DC_8BIT! */	}    }    /* Non-MWI */    else {	/* mode 0 */	if (mode == 0 || msg->sms.coding == DC_UCS2 || msg->sms.compress) { 	    /* bits 7,6 are 0 */	    if (msg->sms.compress)		dcs |= 0x20; /* sets bit 5 */	    if (msg->sms.mclass)		dcs |= 0x10 | (msg->sms.mclass - 1); /* sets bit 4,1,0 */	    if (msg->sms.coding)		dcs |= ((msg->sms.coding - 1) << 2); /* sets bit 3,2 */	} 		/* mode 1 */	else {	    dcs |= 0xF0; /* sets bits 7-3 */	    dcs |= (msg->sms.coding - 1) << 2; /* only DC_7BIT or DC_8BIT, sets bit 2*/	    if (msg->sms.mclass == 0)		dcs |= 1; /* sets bit 1,0 */	    else		dcs |= (msg->sms.mclass - 1); /* sets bit 1,0 */	}    }    return dcs;}/* * Decode DCS to sms fields */int dcs_to_fields(Msg **msg, int dcs) {    /* Non-MWI Mode 1 */    if ((dcs & 0xF0) == 0xF0) {         dcs &= 0x07;        (*msg)->sms.coding = (dcs & 0x04) ? DC_8BIT : DC_7BIT; /* grab bit 2 */        (*msg)->sms.mclass = 1 + (dcs & 0x03); /* grab bits 1,0 */    }        /* Non-MWI Mode 0 */    else if ((dcs & 0xC0) == 0x00) {         (*msg)->sms.compress = ((dcs & 0x20) == 0x20) ? 1 : 0; /* grab bit 5 */        (*msg)->sms.mclass = ((dcs & 0x10) == 0x10) ? 1 + (dcs & 0x03) : 0; 	    /* grab bit 0,1 if bit 4 is on */        (*msg)->sms.coding = 1 + ((dcs & 0x0C) >> 2); /* grab bit 3,2 */    }    /* MWI */    else if ((dcs & 0xC0) == 0xC0) {         (*msg)->sms.coding = ((dcs & 0x30) == 0x30) ? DC_UCS2 : DC_7BIT;        if (dcs & 0x08)            dcs |= 0x04; /* if bit 3 is active, have mwi += 4 */        dcs &= 0x07;        (*msg)->sms.mwi = 1 + dcs ; /* grab bits 1,0 */    }         else {        return 0;    }    return 1;}/* * Compute length of an Octstr after it will be converted to GSM 03.38  * 7 bit alphabet - escaped characters would be counted as two septets */int sms_msgdata_len(Msg* msg) {	int ret = 0;	Octstr* msgdata = NULL;		/* got a bad input */	if (!msg || !msg->sms.msgdata) 		return -1;	if (msg->sms.coding == DC_7BIT) {		msgdata = octstr_duplicate(msg->sms.msgdata);		charset_latin1_to_gsm(msgdata);		ret = octstr_len(msgdata);		octstr_destroy(msgdata);	} else 		ret = octstr_len(msg->sms.msgdata);	return ret;}List *sms_get_user_data_headers(Octstr *hdrs) {    List *l;    int ielen = 0;    int pos = 0;    Octstr *ie;    l = list_create();    while (pos < octstr_len(hdrs)) {        /* format, see gsm 03.40 section 9.2.3.24 */        ielen = octstr_get_char(hdrs, pos + 1);         ie = octstr_copy(hdrs, pos, ielen + 2);        list_append(l, ie);        pos += (ielen + 2);    }    return l;}

⌨️ 快捷键说明

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