Hi

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;

Reply via email to