Attached is a small patch to use the same alt-charset scheme in EMI2 module as is currently used in the SMPP module. The charset patch is for MT encoding only. The patch also fixes a small bug in the INC_TRN macro. It was using EMI2_MAX_TRN instead of PRIVDATA(conn)->window for the window size.
I havent done charset encoding for MO messages. I have also removed the charset_nrc_iso_21_german_to_gsm from the MO code, sure this should be charset_gsm_to_nrc_iso_21_german? These two functions seem to be identical. Can anyone shed some light on this?
Nisan
--- ../../cvs/gateway/gw/smsc/smsc_emi2.c Sat Mar 22 15:47:06 2003 +++ ../../gateway-clickcvs/gw/smsc/smsc_emi2.c Wed Mar 26 21:12:48 2003 @@ -70,7 +70,7 @@ If 0, no idle timeout is in effect */ Octstr *npid; /* Notification PID value */ Octstr *nadc; /* Notification Address */ - int alt_charset; /* Alternative GSM charset, defined via values in gwlib/alt_charsets.h */ + Octstr *alt_charset; /* Alternative GSM charset */ } PrivData;
typedef enum { @@ -434,13 +434,22 @@ else { emimsg->fields[E50_MT] = octstr_create("3"); str = octstr_duplicate(msg->sms.msgdata); - charset_latin1_to_gsm(str); /* - * Check if we have to apply some after GSM transcoding kludges + * convert to the given alternative charset + * otherwise assume to convert to GSM 03.38 7-bit alphabet */ - if (privdata->alt_charset == EMI_NRC_ISO_21) - charset_gsm_to_nrc_iso_21_german(str); + if (privdata->alt_charset) { + if (charset_convert(str, "ISO-8859-1", + octstr_get_cstr(privdata->alt_charset)) != 0) + error(0, "Failed to convert msgdata from charset <%s> to <%s>, will send as is.", + "ISO-8859-1", octstr_get_cstr(privdata->alt_charset)); + } else { + charset_latin1_to_gsm(str); + } + + + /* Could still be too long after truncation if there's an UDH part, * but this is only to notice errors elsewhere (should never happen).*/ @@ -523,10 +532,6 @@ msg->sms.msgdata = emimsg->fields[E01_AMSG]; emimsg->fields[E01_AMSG] = NULL; /* So it's not freed */ - /* obey the NRC (national replacement codes) */ - if (privdata->alt_charset == EMI_NRC_ISO_21) - charset_nrc_iso_21_german_to_gsm(msg->sms.msgdata); - charset_gsm_to_latin1(msg->sms.msgdata); } else { @@ -630,10 +635,6 @@ msg->sms.msgdata = emimsg->fields[E50_AMSG]; emimsg->fields[E50_AMSG] = NULL; /* So it's not freed */ - /* obey the NRC (national replacement codes) */ - if (privdata->alt_charset == EMI_NRC_ISO_21) - charset_nrc_iso_21_german_to_gsm(msg->sms.msgdata); - charset_gsm_to_latin1(msg->sms.msgdata); } else if (octstr_get_char(emimsg->fields[E50_MT], 0) == '4') { @@ -806,7 +807,7 @@ */ static int emi2_next_trn (SMSCConn *conn) { -#define INC_TRN(x) ((x)=((x) + 1) % EMI2_MAX_TRN) +#define INC_TRN(x) ((x)=((x) + 1) % PRIVDATA(conn)->window) int result; while (SLOTBUSY(conn,PRIVDATA(conn)->priv_nexttrn)) @@ -1310,6 +1311,7 @@ octstr_destroy(privdata->password); octstr_destroy(privdata->npid); octstr_destroy(privdata->nadc); + octstr_destroy(privdata->alt_charset); gw_free(privdata); conn->data = NULL; @@ -1523,7 +1525,8 @@ PrivData *privdata; Octstr *allow_ip, *deny_ip, *host, *alt_host; long portno, our_port, keepalive, flowcontrol, waitack, throughput, - idle_timeout, alt_portno, alt_charset, waitack_expire; + idle_timeout, alt_portno, waitack_expire; + Octstr *alt_charset; long window; /* has to be long because of cfg_get_integer */ int i; @@ -1678,10 +1681,7 @@ goto error; } - if (cfg_get_integer(&alt_charset, cfg, octstr_imm("alt-charset")) < 0) - privdata->alt_charset = 0; - else - privdata->alt_charset = alt_charset; + privdata->alt_charset = cfg_get(cfg, octstr_imm("alt-charset")); privdata->allow_ip = allow_ip; privdata->deny_ip = deny_ip;