forwarding this to the list.

Stipe

[EMAIL PROTECTED]
-------------------------------------------------------------------
Wapme Systems AG

Vogelsanger Weg 80
40470 Düsseldorf

Tel: +49-211-74845-0
Fax: +49-211-74845-299

E-Mail: [EMAIL PROTECTED]
Internet: http://www.wapme-systems.de
-------------------------------------------------------------------
wapme.net - wherever you are
--- Begin Message --- Hi

here you go

nisan
At 07:46 PM 3/27/03 +0100, you wrote:
Nisan,

sorry to be nastly, but could you please resend the "whole" patch in
*one* diff file and at email attachement rather then enbedding in the
email body.

Thanks.

Stipe

[EMAIL PROTECTED]
-------------------------------------------------------------------
Wapme Systems AG

Vogelsanger Weg 80
40470 Düsseldorf

Tel: +49-211-74845-0
Fax: +49-211-74845-299

E-Mail: [EMAIL PROTECTED]
Internet: http://www.wapme-systems.de
-------------------------------------------------------------------
wapme.net - wherever you are
--- ../../cvs/gateway/gw/smsc/smsc_smpp.c       Thu Mar 20 10:23:57 2003
+++ ../../gateway-clickcvs/gw/smsc/smsc_smpp.c  Wed Mar 26 21:59:32 2003
@@ -12,6 +12,10 @@
        either) */
 /* XXX numbering plans and type of number: check spec */

+#if defined(HAVE_LIBSSL) || defined(HAVE_WTLS_OPENSSL)
+#include <openssl/opensslv.h>
+#endif
+
 #include "gwlib/gwlib.h"
 #include "msg.h"
 #include "smsc_p.h"
@@ -31,16 +35,20 @@

 #ifndef DEBUG
 /* This version doesn't dump. */
-static void dump_pdu(const char *msg, Octstr *id, SMPP_PDU *pdu)
+static void dump_pdu(const char *msg, Octstr *id, SMPP_PDU *pdu, int do_dump)
 {
 }
 #else
 /* This version does dump. */
-static void dump_pdu(const char *msg, Octstr *id, SMPP_PDU *pdu)
+static void dump_pdu(const char *msg, Octstr *id, SMPP_PDU *pdu, int do_dump)
 {
     debug("bb.sms.smpp", 0, "SMPP[%s]: %s",
           octstr_get_cstr(id), msg);
+    if (do_dump)
     smpp_pdu_dump(pdu);
+    else
+        debug("bb.sms.smpp", 0, "SMPP[%s]:  type_name: %s",
+            octstr_get_cstr(id), pdu->type_name);
 }
 #endif

@@ -51,6 +59,7 @@

 #define SMPP_ENQUIRE_LINK_INTERVAL  30.0
 #define SMPP_MAX_PENDING_SUBMITS    10
+#define SMPP_RECONNECT_DELAY        10.0
 #define SMPP_DEFAULT_VERSION        0x34
 #define SMPP_DEFAULT_PRIORITY       0
 #define SMPP_THROTTLING_SLEEP_TIME  15
@@ -84,17 +93,22 @@
     List *received_msgs;
     Counter *message_id_counter;
     Octstr *host;
+    int is_ssl;
+    int dump_pdu;
     Octstr *system_type;
     Octstr *username;
     Octstr *password;
     Octstr *address_range;
     Octstr *my_number;
     Octstr *service_type;
+       Octstr *forced_sender;
     int source_addr_ton;
     int source_addr_npi;
     int dest_addr_ton;
     int dest_addr_npi;
     int alt_dcs;
+    int pack_7bit;
+    int reg_dlr_mask;
     int transmit_port;
     int receive_port;
     int quitting;
@@ -102,6 +116,8 @@
     long max_pending_submits;
     int version;
     int priority;       /* set default priority for messages */
+    long throttle_sleep;
+    int throughput;
     time_t throttling_err_time;
     int smpp_msg_id_type;  /* msg id in C string, hex or decimal */
     int autodetect_addr;
@@ -117,16 +133,21 @@
                          int source_addr_ton, int source_addr_npi,
                          int dest_addr_ton, int dest_addr_npi,
                          int alt_dcs, int enquire_link_interval,
-                         int max_pending_submits, int version, int priority,
-                         Octstr *my_number, int smpp_msg_id_type,
-                         int autodetect_addr, Octstr *alt_charset,
-                         Octstr *service_type)
+                         int max_pending_submits,
+                                                int version, int priority, Octstr 
*my_number,
+                                                int smpp_msg_id_type, int 
autodetect_addr,
+                                                Octstr *alt_charset, Octstr 
*service_type,
+                         int is_ssl, int dump_pdu, Octstr *forced_sender,
+                         long throttle_sleep, int throughput, int reg_dlr_mask,
+                         int pack_7bit)
 {
     SMPP *smpp;

     smpp = gw_malloc(sizeof(*smpp));
     smpp->transmitter = -1;
     smpp->receiver = -1;
+    smpp->is_ssl = is_ssl;
+    smpp->dump_pdu = dump_pdu;
     smpp->msgs_to_send = list_create();
     smpp->sent_msgs = dict_create(16, NULL);
     list_add_producer(smpp->msgs_to_send);
@@ -143,7 +164,9 @@
     smpp->dest_addr_ton = dest_addr_ton;
     smpp->dest_addr_npi = dest_addr_npi;
     smpp->alt_dcs = alt_dcs;
+       smpp->pack_7bit = pack_7bit;
     smpp->my_number = octstr_duplicate(my_number);
+       smpp->forced_sender = octstr_duplicate(forced_sender);
     smpp->service_type = octstr_duplicate(service_type);
     smpp->transmit_port = transmit_port;
     smpp->receive_port = receive_port;
@@ -154,6 +177,9 @@
     smpp->priority = priority;
     smpp->conn = conn;
     smpp->throttling_err_time = 0;
+    smpp->throttle_sleep = throttle_sleep;
+    smpp->throughput = throughput;
+    smpp->reg_dlr_mask = reg_dlr_mask;
     smpp->smpp_msg_id_type = smpp_msg_id_type;
     smpp->autodetect_addr = autodetect_addr;
     smpp->alt_charset = octstr_duplicate(alt_charset);
@@ -176,6 +202,7 @@
         octstr_destroy(smpp->service_type);
         octstr_destroy(smpp->address_range);
         octstr_destroy(smpp->my_number);
+               octstr_destroy(smpp->forced_sender);
         octstr_destroy(smpp->alt_charset);
         gw_free(smpp);
     }
@@ -328,6 +355,11 @@
 }


+
+static int smpp_encode8bituncompressed(Octstr *input, unsigned char *encoded);
+static int smpp_encode7bituncompressed(Octstr *input, unsigned char *encoded, int 
offset);
+
+
 static SMPP_PDU *msg_to_pdu(SMPP *smpp, Msg *msg)
 {
     SMPP_PDU *pdu;
@@ -339,7 +371,11 @@
     pdu = smpp_pdu_create(submit_sm,
                          counter_increase(smpp->message_id_counter));

+    if (smpp->forced_sender != NULL)
+        pdu->u.submit_sm.source_addr = octstr_duplicate(smpp->forced_sender);
+    else
     pdu->u.submit_sm.source_addr = octstr_duplicate(msg->sms.sender);
+
     pdu->u.submit_sm.destination_addr = octstr_duplicate(msg->sms.receiver);

     /* Set the service type of the outgoing message */
@@ -354,7 +390,7 @@
               smpp->source_addr_npi);
     } else {
         /* setup default values */
-        pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_NATIONAL; /* national */
+        pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_NATIONAL; /* national */
         pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_E164; /* ISDN number plan */
     }

@@ -375,9 +411,19 @@
                 pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN;
             }
         }
+
+       //check for abbreviated numeric sender
+           if (((pdu->u.submit_sm.source_addr_ton == GSM_ADDR_TON_INTERNATIONAL) ||
+                (pdu->u.submit_sm.source_addr_ton == GSM_ADDR_TON_NATIONAL ))
+               && (octstr_len(pdu->u.submit_sm.source_addr)<8))
+           {
+               pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_ABBREVIATED;
+               pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN;
     }

     /* Check for manual override of destination ton and npi values */
+    }
+
     if (smpp->dest_addr_ton > -1 && smpp->dest_addr_npi > -1) {
         pdu->u.submit_sm.dest_addr_ton = smpp->dest_addr_ton;
         pdu->u.submit_sm.dest_addr_npi = smpp->dest_addr_npi;
@@ -385,7 +431,7 @@
               octstr_get_cstr(smpp->conn->id), smpp->dest_addr_ton,
               smpp->dest_addr_npi);
     } else {
-        pdu->u.submit_sm.dest_addr_ton = GSM_ADDR_TON_NATIONAL; /* national */
+        pdu->u.submit_sm.dest_addr_ton = GSM_ADDR_TON_NATIONAL; /* national */
         pdu->u.submit_sm.dest_addr_npi = GSM_ADDR_NPI_E164; /* ISDN number plan */
     }

@@ -425,6 +471,41 @@
      * set data segments and length
      */

+    if (octstr_len(msg->sms.udhdata)) {
+               //do we need to do 7bit packing?
+        if (smpp->pack_7bit == 1) {
+                       if ((0x0F & pdu->u.submit_sm.data_coding) <2)
+            {
+                char encoded[1024];
+                int offset=0;
+                int pos=0;
+                debug("bb.smpp",0,"USING 7bit");
+                /* if alt-dcs and pack then ignore alt-dcs */
+                pdu->u.submit_sm.data_coding = fields_to_dcs(msg, 0);
+                /* udh */
+                if (octstr_len(msg->sms.udhdata)) {
+                    pos += smpp_encode8bituncompressed(msg->sms.udhdata, 
&encoded[pos]);
+                }
+
+
+                if (octstr_len(msg->sms.udhdata)) { /* Have UDH */
+                    int nbits = octstr_len(msg->sms.udhdata) * 8; /* Includes UDH 
length byte */
+                    offset = (((nbits / 7) + 1) * 7 - nbits) % 7; /* Fill bits */
+                }
+
+                pos += smpp_encode7bituncompressed(msg->sms.msgdata, &encoded[pos], 
offset);
+                encoded[pos]=0x00;
+
+                pdu->u.submit_sm.short_message =
+                    octstr_format("%s",  encoded);
+                octstr_hex_to_binary(pdu->u.submit_sm.short_message);
+            } else
+                pdu->u.submit_sm.short_message =
+                    octstr_format("%S%S", msg->sms.udhdata, msg->sms.msgdata);
+        } else
+               pdu->u.submit_sm.short_message =
+                       octstr_format("%S%S", msg->sms.udhdata, msg->sms.msgdata);
+    } else {
     pdu->u.submit_sm.short_message = octstr_duplicate(msg->sms.msgdata);

     /*
@@ -432,6 +513,7 @@
      * alt-charset in smsc group and if MT is not binary
      */
     if (pdu->u.submit_sm.data_coding == 0) {
+
         /*
          * convert to the given alternative charset
          * otherwise assume to convert to GSM 03.38 7-bit alphabet
@@ -445,6 +527,10 @@
             charset_latin1_to_gsm(pdu->u.submit_sm.short_message);
         }
     }
+    }
+
+    pdu->u.submit_sm.sm_length = octstr_len(pdu->u.submit_sm.short_message);
+

     /* prepend udh if present */
     if (octstr_len(msg->sms.udhdata)) {
@@ -496,6 +582,9 @@
     if (msg->sms.dlr_mask & (DLR_SUCCESS|DLR_FAIL))
         pdu->u.submit_sm.registered_delivery = 1;

+    if (smpp->reg_dlr_mask)
+        pdu->u.submit_sm.registered_delivery |= smpp->reg_dlr_mask;
+
     octstr_destroy(relation_UTC_time);

     /* set priority */
@@ -520,7 +609,7 @@
     *last_sent = date_universal_now();

     pdu = smpp_pdu_create(enquire_link, counter_increase(smpp->message_id_counter));
-    dump_pdu("Sending enquire link:", smpp->conn->id, pdu);
+    dump_pdu("Sending enquire link:", smpp->conn->id, pdu, smpp->dump_pdu);
     os = smpp_pdu_pack(pdu);
     if (os)
        conn_write(conn, os); /* Write errors checked by caller. */
@@ -534,7 +623,7 @@
     SMPP_PDU *pdu;
     Octstr *os;
     pdu = smpp_pdu_create(unbind, counter_increase(smpp->message_id_counter));
-    dump_pdu("Sending unbind:", smpp->conn->id, pdu);
+    dump_pdu("Sending unbind:", smpp->conn->id, pdu, smpp->dump_pdu);
     os = smpp_pdu_pack(pdu);
     conn_write(conn, os);
     octstr_destroy(os);
@@ -542,12 +631,12 @@
 }


-static int send_pdu(Connection *conn, Octstr *id, SMPP_PDU *pdu)
+static int send_pdu(Connection *conn, Octstr *id, SMPP_PDU *pdu, int do_dump)
 {
     Octstr *os;
     int ret;

-    dump_pdu("Sending PDU:", id, pdu);
+    dump_pdu("Sending PDU:", id, pdu, do_dump);
     os = smpp_pdu_pack(pdu);
     if (os)
         ret = conn_write(conn, os);   /* Caller checks for write errors later */
@@ -578,9 +667,13 @@
         os = octstr_format("%ld", pdu->u.submit_sm.sequence_number);
         dict_put(smpp->sent_msgs, os, msg);
         octstr_destroy(os);
-        send_pdu(conn, smpp->conn->id, pdu);
+        send_pdu(conn, smpp->conn->id, pdu, smpp->dump_pdu);
         smpp_pdu_destroy(pdu);

+        if (smpp->throughput) {
+            gwthread_sleep((double)(1.0/(double)smpp->throughput));
+        }
+
         ++(*pending_submits);
     }
 }
@@ -596,6 +689,13 @@
     SMPP_PDU *bind;
     Connection *conn;

+#ifdef HAVE_LIBSSL
+    if (smpp->is_ssl) {
+    debug("bb.smpp", 0, "Transmitter Using SSL");
+    conn = conn_open_ssl(smpp->host, smpp->transmit_port, NULL, smpp->conn->our_host 
);
+    }
+        else
+#endif
     conn = conn_open_tcp(smpp->host, smpp->transmit_port, smpp->conn->our_host );
     if (conn == NULL) {
         error(0, "SMPP[%s]: Couldn't connect to server.",
@@ -615,7 +715,7 @@
     bind->u.bind_transmitter.interface_version = smpp->version;
     bind->u.bind_transmitter.address_range =
        octstr_duplicate(smpp->address_range);
-    send_pdu(conn, smpp->conn->id, bind);
+    send_pdu(conn, smpp->conn->id, bind,  smpp->dump_pdu);
     smpp_pdu_destroy(bind);

     return conn;
@@ -632,6 +732,13 @@
     SMPP_PDU *bind;
     Connection *conn;

+#ifdef HAVE_LIBSSL
+    if (smpp->is_ssl) {
+        debug("bb.smpp", 0, "Transceiver Using SSL");
+        conn = conn_open_ssl(smpp->host, smpp->transmit_port, NULL, 
smpp->conn->our_host );
+    }
+    else
+#endif
     conn = conn_open_tcp(smpp->host, smpp->transmit_port, smpp->conn->our_host );
     if (conn == NULL) {
        error(0, "SMPP[%s]: Couldn't connect to server.",
@@ -649,7 +756,7 @@
         bind->u.bind_transmitter.system_type = octstr_duplicate(smpp->system_type);
     bind->u.bind_transmitter.interface_version = smpp->version;
     bind->u.bind_transmitter.address_range = octstr_duplicate(smpp->address_range);
-    send_pdu(conn, smpp->conn->id, bind);
+    send_pdu(conn, smpp->conn->id, bind,  smpp->dump_pdu);
     smpp_pdu_destroy(bind);

     return conn;
@@ -666,6 +773,14 @@
     SMPP_PDU *bind;
     Connection *conn;

+
+#ifdef HAVE_LIBSSL
+    if (smpp->is_ssl) {
+        debug("bb.smpp", 0, "Receiver Using SSL");
+        conn = conn_open_ssl(smpp->host, smpp->receive_port, NULL, 
smpp->conn->our_host );
+    }
+    else
+#endif
     conn = conn_open_tcp(smpp->host, smpp->receive_port, smpp->conn->our_host );
     if (conn == NULL) {
         error(0, "SMPP[%s]: Couldn't connect to server.",
@@ -685,7 +800,7 @@
     bind->u.bind_receiver.interface_version = smpp->version;
     bind->u.bind_receiver.address_range =
         octstr_duplicate(smpp->address_range);
-    send_pdu(conn, smpp->conn->id, bind);
+    send_pdu(conn, smpp->conn->id, bind,  smpp->dump_pdu);
     smpp_pdu_destroy(bind);

     return conn;
@@ -768,6 +883,11 @@
                 else
                     dlrstat = DLR_FAIL;

+                if (msgid == NULL && smpp->version == 0x34)
+                {
+                    msgid = smpp_pdu_get_opt(pdu, SMPP_receipted_message_id);
+                }
+
                 if (msgid != NULL) {
                     Octstr *tmp;

@@ -828,9 +948,26 @@

             } else /* MO-SMS */
             {
+                               Octstr *msg_payload;
+
+                debug("bb.sms.smpp",0,"SMPP[%s] handle_pdu, got MO",
+                        octstr_get_cstr(smpp->conn->id));
+
                 /* ensure the smsc-id is set */
                 msg = pdu_to_msg(smpp, pdu);

+                //check for optional payload and replace
+
+                if (smpp->version == 0x34)
+                {
+                    msg_payload = smpp_pdu_get_opt(pdu, SMPP_message_payload);
+                    if (msg_payload != NULL)
+                    {
+                        octstr_destroy(msg->sms.msgdata);
+                        msg->sms.msgdata = msg_payload;
+                    }
+                }
+
                 /* Replace MO destination number with my-number */
                 if (octstr_len(smpp->my_number)) {
                     octstr_destroy(msg->sms.receiver);
@@ -1072,7 +1209,7 @@
     }

     if (resp != NULL) {
-       send_pdu(conn, smpp->conn->id, resp);
+       send_pdu(conn, smpp->conn->id, resp,  smpp->dump_pdu);
         smpp_pdu_destroy(resp);
     }
 }
@@ -1150,7 +1287,7 @@
             if (smpp->quitting) {
                 send_unbind(smpp, conn);
                 while ((ret = read_pdu(smpp, conn, &len, &pdu)) == 1) {
-                    dump_pdu("Got PDU:", smpp->conn->id, pdu);
+                    dump_pdu("Got PDU:", smpp->conn->id, pdu, smpp->dump_pdu);
                     handle_pdu(smpp, conn, pdu, &pending_submits);
                     smpp_pdu_destroy(pdu);
                 }
@@ -1165,7 +1302,7 @@

             while ((ret = read_pdu(smpp, conn, &len, &pdu)) == 1) {
                 /* Deal with the PDU we just got */
-                dump_pdu("Got PDU:", smpp->conn->id, pdu);
+                dump_pdu("Got PDU:", smpp->conn->id, pdu, smpp->dump_pdu);
                 handle_pdu(smpp, conn, pdu, &pending_submits);
                 smpp_pdu_destroy(pdu);

@@ -1175,7 +1312,7 @@
                 /* Make sure we send even if we read a lot */
                 if (transmitter &&
                     (!smpp->throttling_err_time ||
-                    ((time(NULL) - smpp->throttling_err_time) > 
SMPP_THROTTLING_SLEEP_TIME
+                    ((time(NULL) - smpp->throttling_err_time) > smpp->throttle_sleep
                         && !(smpp->throttling_err_time = 0)))
                     )
                     send_messages(smpp, conn, &pending_submits);
@@ -1189,7 +1326,7 @@

             if (transmitter &&
                 (!smpp->throttling_err_time ||
-                ((time(NULL) - smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME
+                ((time(NULL) - smpp->throttling_err_time) > smpp->throttle_sleep
                     && !(smpp->throttling_err_time = 0)))
                 )
                 send_messages(smpp, conn, &pending_submits);
@@ -1282,23 +1419,30 @@
     long dest_addr_ton;
     long dest_addr_npi;
     Octstr *my_number;
+       Octstr *forced_sender;
     Octstr *service_type;
     SMPP *smpp;
     int ok;
     int transceiver_mode;
     Octstr *smsc_id;
     int alt_dcs;
+       int pack_7bit;
     long enquire_link_interval;
     long max_pending_submits;
     long version;
     long priority;
+       long throttle_sleep;
+       long reg_dlr_mask;
+       long throughput;
     long smpp_msg_id_type;
     int autodetect_addr;
     Octstr *alt_charset;
+       long is_ssl;
+       long dump_pdu;

     my_number = alt_charset = NULL;
     transceiver_mode = 0;
-    alt_dcs = 0;
+    pack_7bit = alt_dcs = 0;
     autodetect_addr = 1;

     host = cfg_get(grp, octstr_imm("host"));
@@ -1308,11 +1452,13 @@
         receive_port = 0;
     cfg_get_bool(&transceiver_mode, grp, octstr_imm("transceiver-mode"));
     cfg_get_bool(&alt_dcs, grp, octstr_imm("alt-dcs"));
+       cfg_get_bool(&pack_7bit, grp, octstr_imm("pack-7bit"));
     username = cfg_get(grp, octstr_imm("smsc-username"));
     password = cfg_get(grp, octstr_imm("smsc-password"));
     system_type = cfg_get(grp, octstr_imm("system-type"));
     address_range = cfg_get(grp, octstr_imm("address-range"));
     my_number = cfg_get(grp, octstr_imm("my-number"));
+       forced_sender = cfg_get(grp, octstr_imm("forced-sender"));
     service_type = cfg_get(grp, octstr_imm("service-type"));

     system_id = cfg_get(grp, octstr_imm("system-id"));
@@ -1337,6 +1483,19 @@
                         octstr_imm("max-pending-submits")) == -1)
         max_pending_submits = SMPP_MAX_PENDING_SUBMITS;

+    if (cfg_get_integer(&throttle_sleep, grp,
+                        octstr_imm("throttle-sleep")) == -1)
+        throttle_sleep = SMPP_THROTTLING_SLEEP_TIME;
+    if (cfg_get_integer(&throughput, grp,
+                        octstr_imm("throughput")) == -1)
+        throughput = 0;
+
+    if (cfg_get_integer(&reg_dlr_mask, grp,
+                        octstr_imm("reg-dlr-mask")) == -1)
+        reg_dlr_mask = 0;
+
+
+
     /* Check that config is OK */
     ok = 1;
     if (host == NULL) {
@@ -1391,6 +1550,13 @@
     if (cfg_get_integer(&priority, grp, octstr_imm("priority")) == -1)
         priority = SMPP_DEFAULT_PRIORITY;

+    if (cfg_get_integer(&is_ssl, grp, octstr_imm("is-ssl")) == -1)
+        is_ssl = 0;
+
+    if (cfg_get_integer(&dump_pdu, grp, octstr_imm("dump-pdu")) == -1)
+        dump_pdu = 1;
+
+
     /* set the msg_id type variable for this SMSC */
     if (cfg_get_integer(&smpp_msg_id_type, grp, octstr_imm("msg-id-type")) == -1) {
         /*
@@ -1411,7 +1577,8 @@
                        dest_addr_npi, alt_dcs, enquire_link_interval,
                        max_pending_submits, version, priority, my_number,
                        smpp_msg_id_type, autodetect_addr, alt_charset,
-                       service_type);
+                       service_type, is_ssl, dump_pdu, forced_sender,
+                                          throttle_sleep, throughput, reg_dlr_mask, 
pack_7bit);

     conn->data = smpp;
     conn->name = octstr_format("SMPP:%S:%d/%d:%S:%S",
@@ -1430,6 +1597,7 @@
     octstr_destroy(system_type);
     octstr_destroy(address_range);
     octstr_destroy(my_number);
+       octstr_destroy(forced_sender);
     octstr_destroy(smsc_id);
     octstr_destroy(alt_charset);
     octstr_destroy(service_type);
@@ -1470,4 +1638,113 @@

     return 0;
 }
+
+
+static int  numtext(int num)
+{
+    return (num > 9) ? (num + 55) : (num + 48);
+}
+
+static int smpp_encode7bituncompressed(Octstr *input, unsigned char *encoded, int 
offset)
+{
+
+    unsigned char prevoctet, tmpenc;
+    int i;
+    int c = 1;
+    int r = 7;
+    int pos = 0;
+    int len;
+    unsigned char enc7bit[256];
+    int j, encpos = 0;
+    int ermask[8] = { 0, 1, 3, 7, 15, 31, 63, 127 };
+    int elmask[8] = { 0, 64, 96, 112, 120, 124, 126, 127 };
+
+    charset_latin1_to_gsm(input);
+    len = octstr_len(input);
+
+    /*
+     * prevoctet is set to the first character and we'll start the loop
+     * at the following char.
+     */
+    prevoctet = octstr_get_char(input , 0);
+    for (i = 1; i < octstr_len(input); i++) {
+        /*
+         * a byte is encoded with what is left of the previous character
+         * and filled with as much as possible of the current one.
+         */
+        tmpenc = prevoctet + ((octstr_get_char(input, i) & ermask[c]) << r);
+        enc7bit[encpos] = tmpenc;
+        encpos++;
+        c = (c > 6) ? 1 : c + 1;
+        r = (r < 2) ? 7 : r - 1;
+
+        /*
+         * prevoctet becomes the part of the current octet that hasn't
+         * been copied to 'encoded' or the next char if the current has
+         * been completely copied already.
+         */
+        prevoctet = (octstr_get_char(input, i) & elmask[r]) >> (c - 1);
+        if (r == 7) {
+            i++;
+            prevoctet = octstr_get_char(input, i);
+        }
+    }
+
+    /*
+     * if the length of the message is a multiple of 8 then we
+     * are finished. Otherwise prevoctet still contains part of a
+     * character so we add it.
+     */
+    if ((len / 8)*8 != len) {
+        enc7bit[encpos] = prevoctet;
+        encpos++;
+    }
+
+    /* Now shift the buffer by the offset */
+    if (offset > 0) {
+        unsigned char nextdrop, lastdrop;
+
+        nextdrop = lastdrop = 0;
+        for (i = 0; i < encpos; i++) {
+            nextdrop = enc7bit[i] >> (8 - offset); /* This drops off by shifting */
+            if (i == 0)
+                enc7bit[i] = enc7bit[i] << offset; /* This drops off by shifting */
+            else
+                enc7bit[i] = (enc7bit[i] << offset) | lastdrop;
+            lastdrop = nextdrop;
+        }
+
+        if (offset > ((len*7) % 8)) {
+            enc7bit [i] = nextdrop;
+            i++;
+        }
+    } else
+        i = encpos;
+
+    for (j = 0; j < i; j++) {
+        encoded[pos] = numtext((enc7bit [j] & 240) >> 4);
+        pos++;
+        encoded[pos] = numtext(enc7bit [j] & 15);
+        pos++;
+    }
+    return pos;
+
+}
+
+
+
+static int smpp_encode8bituncompressed(Octstr *input, unsigned char *encoded)
+{
+    int len, i;
+
+    len = octstr_len(input);
+
+    for (i = 0; i < len; i++) {
+        /* each character is encoded in its hex representation (2 chars) */
+        encoded[i*2] = numtext((octstr_get_char(input, i) & 240) >> 4);
+        encoded[i*2 + 1] = numtext(octstr_get_char(input, i) & 15);
+    }
+    return len*2;
+}
+

--- ../../cvs/gateway/gw/smsc/smpp_pdu.c        Mon Mar 17 07:29:56 2003
+++ ../../gateway-clickcvs/gw/smsc/smpp_pdu.c   Wed Mar 26 16:48:47 2003
@@ -310,6 +310,50 @@
 }


+Octstr *smpp_pdu_get_opt(SMPP_PDU *pdu, unsigned long opt_tag)
+{
+
+        Octstr *ret=NULL;
+
+    debug("sms.smpp", 0, "SMPP PDU %p get_opt:", (void *) pdu);
+    debug("sms.smpp", 0, "  type_name: %s", pdu->type_name);
+
+    switch (pdu->type) {
+    #define OPTIONAL_BEGIN(num_expected) \
+        if (p->optional_parameters != NULL) { \
+            Octstr *key = NULL, *tag_val = NULL;
+            unsigned long id;
+    #define TLV(tag_id, min_len, max_len) \
+            id = tag_id; \
+                        if (opt_tag == id) \
+                        { \
+            key = octstr_create_from_data((char*)&id, 2); \
+            tag_val = dict_get(p->optional_parameters, key); \
+            if (tag_val != NULL) \
+                                ret = octstr_duplicate(tag_val); \
+                        else \
+                                ret = NULL;     \
+            octstr_destroy(key); \
+                        }
+    #define OPTIONAL_END \
+        }
+    #define INTEGER(name, octets)
+    #define NULTERMINATED(name, max_octets)
+    #define OCTETS(name, field_giving_octets)
+
+    #define PDU(name, id, fields) \
+        case id: { struct name *p = &pdu->u.name; fields } break;
+        #include "smpp_pdu.def"
+        default:
+                break;
+
+        }
+
+    debug("sms.smpp", 0, "SMPP PDU get_opt ends.");
+        return ret;
+
+}
+
 long smpp_pdu_read_len(Connection *conn)
 {
     Octstr *os;

--- ../cvs/gateway/gwlib/cfg.def        Thu Mar 20 10:23:57 2003
+++ ../gateway-clickcvs/gwlib/cfg.def   Tue Mar 25 11:07:50 2003
@@ -228,6 +228,7 @@
     OCTSTR(ussdc)
     OCTSTR(session-length)
     OCTSTR(my-number)
+       OCTSTR(forced-sender)
     OCTSTR(sms-center)
     OCTSTR(source-addr-ton)
     OCTSTR(source-addr-npi)
@@ -238,12 +239,31 @@
     OCTSTR(enquire-link-interval)
     OCTSTR(max-pending-submits)
     OCTSTR(reconnect-delay)
+       OCTSTR(throttle-sleep)
     OCTSTR(transceiver-mode)
     OCTSTR(interface-version)
     OCTSTR(priority)
     OCTSTR(notification-pid)
     OCTSTR(notification-addr)
     OCTSTR(msg-id-type)
+    OCTSTR(smpp-msg-id-type)
+    OCTSTR(dlr-ret)
+    OCTSTR(is-ssl)
+    OCTSTR(ssl-client-certkey-file)
+    OCTSTR(ssl-server-cert-file)
+    OCTSTR(ssl-server-key-file)
+    OCTSTR(ssl-trusted-ca-file)
+    OCTSTR(dump-pdu)
+    OCTSTR(pack-7bit)
+    OCTSTR(reg-dlr-mask)
 )

--- End Message ---

Reply via email to