Hi,
Alexander Malysh wrote:
Hi,
Peter Christensen schrieb:
Hi,
You're right, I probably should check the length before converting
from GSM to latin1 (after all, the 11 char limit is in the GSM
charset, not the latin1).
SMPP_DEFAULT_CHARSET is not defined in alpha_gsm either, do you want
me to define that (to windows-1252) so that you can use alpha_gsm
without the cp1252 patch, or what was your intentions?
Intention was really simply: If you just apply alpa_gsm patch w/o the
other one than it just not compile because define is not defined.
Attached patch defines and uses SMPP_DEFAULT_CHARSET.
As for replacing @, it IS an ugly hack, but it is a necessary hack,
but ONLY on SMPP gateways, and ONLY when using GSM charset in
alphanumeric addresses (since SMPP uses zero-terminated strings.
Although UCP also uses GSM, it is not a problem as it uses
hexadecimals), so I think it is the right place to do it. I ded
consider replacing @ with another printable character such as $
though, just to show that there should have been something. After all
"[EMAIL PROTECTED]" would become "ab.c" and the recipient wouldn't be able to know
where the @ ought to have been.
how about replacing with '?' then? so at least you will see on handset
that there was a char.
Excellent idea. The new patch does exactly that.
Anything else, now we're at it?! :p
Med venlig hilsen / Best regards
Peter Christensen
Developer
------------------
Cool Systems ApS
Tel: +45 2888 1600
@ : [EMAIL PROTECTED]
www: www.coolsystems.dk
Thanks,
Alex
Med venlig hilsen / Best regards
Peter Christensen
Developer
------------------
Cool Systems ApS
Tel: +45 2888 1600
@ : [EMAIL PROTECTED]
www: www.coolsystems.dk
Alexander Malysh wrote:
Hi,
thanks for patches!
Some notes:
- please check addr length before any charset converts. Maybe I'm
wrong there, opinions from others?
- in a patch alpha_gsm patch your use SMPP_CHARSET that is not
defined in this patch. Please rename it to something like
SMPP_DEFAULT_CHARSET.
- don't you think that this is a ugly hack to replace '@'? I don't
think it belongs into smpp module. Opinions from others?
Thanks,
Alex
Peter Christensen schrieb:
Hi again,
I've attached revised versions of the cp1252 patch and the alpha_gsm
patch.
Changes to cp1252 patch:
* Change default character set from ISO-8859-1 to WINDOWS-1252 in
user guide
Changed to alpha_gsm patch:
* Feature is controlled with alt-addr-charset. Possible values are
"gsm" or any iconv charset. Default is windows-1252.
* convert_addr_from_pdu() now converts FROM alt-addr-charset to
windows-1252 and not the other way around (are used for incoming
messages)
* Added documentation of alt-addr-charset to user guide
Just a side note: Kannel rejects messages with alphanumeric
addresses longer than 11 characters, which have its origin in the
GSM charset. Basically, when default assumed charset is windows-1252
(or previously iso-8859-1), the string "test [test]" is actually
still invalid since [ and ] both takes up two septets in the GSM
charset. Anyway, since kannel can now be configured to assume utf-8
or whatever, an alphanumeric address could actually be 44 characters
long and still be valid (11 greek letters).
Med venlig hilsen / Best regards
Peter Christensen
Developer
------------------
Cool Systems ApS
Tel: +45 2888 1600
@ : [EMAIL PROTECTED]
www: www.coolsystems.dk
Hillel wrote:
Hi,
I apologise for not waiting for your response. If you had not
replied I
would have assumed you were not going to submit the patch.
Unfortunately
from previous experience a developer was emailing the list and me
about a
patch, which got people excited, he then never completed it. This
patch is
fortunately exactly at the time I need it and for that I thank you.
I was
hoping you would follow this to completion, but if not then I
needed to
know.
A suggested format:
sender-charset = <charset> (The charset for the sender address)
msg-charset = <charset> (The charset for the message)
With the default current charsets as per Alex's email (sender:
latin1, msg:
gsm)
Maybe others on the Kannel Devel list have better ideas.
Rgds
-----Original Message-----
From: Peter Christensen [mailto:[EMAIL PROTECTED]
Sent: 18 January 2006 15:38
To: [EMAIL PROTECTED]
Cc: Kannel Devel
Subject: Re: user guide
Hi,
Yes, I know that. No need to tell me that three times. But please be
patient, although I WOULD like to have the work done quickly, I don't
have an infinite amount of spare time, and some things are more
urgent.
I hope that I will have revised patches (including user guide
documentation) done within this week, but I cannot promise anything.
Btw., any suggestions to what I should call the alpha_gsm option, and
exactly how it should work? One way would be
addr-charset = <charset>
In this way the user will be able to use practically any charset, but
the consequence is that GSM charset becomes the default, which
might not
be desirable. Alternatively the option could be boolean:
addr-gsm = <boolean>
Med venlig hilsen / Best regards
Peter Christensen
Developer
------------------
Cool Systems ApS
Tel: +45 2888 1600
@ : [EMAIL PROTECTED]
www: www.coolsystems.dk
Hillel wrote:
Hi,
As per email from Alexander Malysh <[EMAIL PROTECTED]>
Date: Fri, 13 Jan 2006 17:24:01 +0100
From: Alexander Malysh <[EMAIL PROTECTED]>
Subject: Re: please reconsider the +0 you gave the patches
Both your patches kannel.smpp.cp1252.diff and
kannel.smpp.alpha_gsm.diff.have been accepted with added
configurable
parameters for the body & source_addr independently.
Please when you submit your patch, which I'd like to start
using, will you
send through some details to the user guide on which char set
corresponds to
which configurable option for the body and source independently
and what
options to set to send the @, pound,Euro and ยก symbols.
Thanks for adding these patches.
Rgds
------------------------------------------------------------------------
diff -Nru gateway.cp1252/doc/userguide/userguide.xml
gateway.alpha_gsm/doc/userguide/userguide.xml
--- gateway.cp1252/doc/userguide/userguide.xml 2006-01-18
17:39:36.000000000 +0100
+++ gateway.alpha_gsm/doc/userguide/userguide.xml 2006-01-18
17:39:50.000000000 +0100
@@ -3177,6 +3177,17 @@
should be presented for this directive.
</entry></row>
+ <row><entry><literal>alt-addr-charset</literal></entry>
+ <entry><literal>string</literal></entry>
+ <entry valign="bottom">
+ Defines which character encoding is used for
alphanumeric addresses.
+ When set to <literal>GSM</literal>, addresses are
converted into the
+ GSM 03.38 charset (Since @ is translated into 0x00
which will break
+ the SMPP PDU, @ are stripped from addresses). If set to
another value,
+ <literal>iconv()</literal> is used.
+ (Defaults to latin1)
+ </entry></row>
+
<row><entry><literal>connection-timeout</literal></entry>
<entry><literal>number (seconds)</literal></entry>
<entry valign="bottom">
diff -Nru gateway.cp1252/gw/smsc/smsc_smpp.c
gateway.alpha_gsm/gw/smsc/smsc_smpp.c
--- gateway.cp1252/gw/smsc/smsc_smpp.c 2006-01-18
17:39:36.000000000 +0100
+++ gateway.alpha_gsm/gw/smsc/smsc_smpp.c 2006-01-18
17:59:47.000000000 +0100
@@ -158,6 +158,7 @@
int smpp_msg_id_type; /* msg id in C string, hex or decimal */
int autodetect_addr;
Octstr *alt_charset;
+ Octstr *alt_addr_charset;
long connection_timeout;
long wait_ack;
int wait_ack_action;
@@ -211,7 +212,7 @@
int enquire_link_interval, int
max_pending_submits, int version, int
priority, int validity,
Octstr *my_number, int smpp_msg_id_type,
- int autodetect_addr, Octstr *alt_charset,
+ int autodetect_addr, Octstr *alt_charset,
Octstr *alt_addr_charset,
Octstr *service_type, long
connection_timeout,
long wait_ack, int wait_ack_action) { @@
-250,6 +251,7 @@
smpp->smpp_msg_id_type = smpp_msg_id_type;
smpp->autodetect_addr = autodetect_addr;
smpp->alt_charset = octstr_duplicate(alt_charset);
+ smpp->alt_addr_charset = octstr_duplicate(alt_addr_charset);
smpp->connection_timeout = connection_timeout;
smpp->wait_ack = wait_ack;
smpp->wait_ack_action = wait_ack_action;
@@ -273,6 +275,7 @@
octstr_destroy(smpp->address_range);
octstr_destroy(smpp->my_number);
octstr_destroy(smpp->alt_charset);
+ octstr_destroy(smpp->alt_addr_charset);
gw_free(smpp); } } @@ -327,7 +330,7 @@
}
-static long convert_addr_from_pdu(Octstr *id, Octstr *addr, long
ton, long npi)
+static long convert_addr_from_pdu(Octstr *id, Octstr *addr, long
ton, long npi, Octstr *alt_addr_charset)
{
long reason = SMPP_ESME_ROK;
@@ -372,6 +375,15 @@
break;
case GSM_ADDR_TON_ALPHANUMERIC:
+ if (alt_addr_charset) {
+ if (octstr_str_case_compare(alt_addr_charset, "gsm") == 0)
+ charset_gsm_to_latin1(addr);
+ else {
+ if (charset_convert(addr,
octstr_get_cstr(alt_addr_charset), SMPP_CHARSET) != 0)
+ error(0, "Failed to convert address from
charset <%s> to <%s>, will send as is.",
+ octstr_get_cstr(alt_addr_charset),
SMPP_CHARSET);
+ }
+ }
if (octstr_len(addr) > 11) {
/* alphanum sender, max. allowed length is 11
(according to GSM specs) */
error(0, "SMPP[%s]: Mallformed addr `%s', alphanum
length greater 11 chars. ",
@@ -416,7 +428,7 @@
ton = pdu->u.deliver_sm.source_addr_ton;
npi = pdu->u.deliver_sm.source_addr_npi;
/* check source addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.deliver_sm.source_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.deliver_sm.source_addr, ton, npi, smpp->alt_addr_charset)) !=
SMPP_ESME_ROK)
goto error;
msg->sms.sender = pdu->u.deliver_sm.source_addr;
pdu->u.deliver_sm.source_addr = NULL;
@@ -437,7 +449,7 @@
ton = pdu->u.deliver_sm.dest_addr_ton;
npi = pdu->u.deliver_sm.dest_addr_npi;
/* check destination addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.deliver_sm.destination_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.deliver_sm.destination_addr, ton, npi,
smpp->alt_addr_charset)) != SMPP_ESME_ROK)
goto error;
msg->sms.receiver = pdu->u.deliver_sm.destination_addr;
pdu->u.deliver_sm.destination_addr = NULL;
@@ -576,7 +588,7 @@
ton = pdu->u.data_sm.source_addr_ton;
npi = pdu->u.data_sm.source_addr_npi;
/* check source addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.data_sm.source_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.data_sm.source_addr, ton, npi, smpp->alt_addr_charset)) !=
SMPP_ESME_ROK)
goto error;
msg->sms.sender = pdu->u.data_sm.source_addr;
pdu->u.data_sm.source_addr = NULL;
@@ -597,7 +609,7 @@
ton = pdu->u.data_sm.dest_addr_ton;
npi = pdu->u.data_sm.dest_addr_npi;
/* check destination addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.data_sm.destination_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id,
pdu->u.data_sm.destination_addr, ton, npi, smpp->alt_addr_charset))
!= SMPP_ESME_ROK)
goto error;
msg->sms.receiver = pdu->u.data_sm.destination_addr;
pdu->u.data_sm.destination_addr = NULL;
@@ -749,6 +761,15 @@
if (!octstr_check_range(pdu->u.submit_sm.source_addr,
1, 256, gw_isdigit)) {
pdu->u.submit_sm.source_addr_ton =
GSM_ADDR_TON_ALPHANUMERIC; /* alphanum */
pdu->u.submit_sm.source_addr_npi =
GSM_ADDR_NPI_UNKNOWN; /* short code */
+ if (smpp->alt_addr_charset) {
+ if
(octstr_str_case_compare(smpp->alt_addr_charset, "gsm") == 0) {
+
octstr_replace(pdu->u.submit_sm.source_addr, octstr_imm("@"),
octstr_imm("")); /* @ would break PDU if converted into GSM*/
+
charset_latin1_to_gsm(pdu->u.submit_sm.source_addr);
+ }
+ else if
(charset_convert(pdu->u.submit_sm.source_addr, SMPP_CHARSET,
octstr_get_cstr(smpp->alt_addr_charset)) != 0)
+ error(0, "Failed to convert source_addr
from charset <%s> to <%s>, will send as is.",
+ SMPP_CHARSET,
octstr_get_cstr(smpp->alt_addr_charset));
+ }
} else {
/* numeric sender address with + in front ->
international (remove the +) */
octstr_delete(pdu->u.submit_sm.source_addr, 0, 1);
@@ -758,6 +779,15 @@
if (!octstr_check_range(pdu->u.submit_sm.source_addr,0,
256, gw_isdigit)) {
pdu->u.submit_sm.source_addr_ton =
GSM_ADDR_TON_ALPHANUMERIC;
pdu->u.submit_sm.source_addr_npi =
GSM_ADDR_NPI_UNKNOWN;
+ if (smpp->alt_addr_charset) {
+ if
(octstr_str_case_compare(smpp->alt_addr_charset, "gsm") == 0) {
+
octstr_replace(pdu->u.submit_sm.source_addr, octstr_imm("@"),
octstr_imm("")); /* @ would break PDU if converted into GSM */
+
charset_latin1_to_gsm(pdu->u.submit_sm.source_addr);
+ }
+ else if
(charset_convert(pdu->u.submit_sm.source_addr, SMPP_CHARSET,
octstr_get_cstr(smpp->alt_addr_charset)) != 0)
+ error(0, "Failed to convert source_addr
from charset <%s> to <%s>, will send as is.",
+ SMPP_CHARSET,
octstr_get_cstr(smpp->alt_addr_charset));
+ }
}
}
}
@@ -1938,9 +1968,10 @@
long smpp_msg_id_type;
int autodetect_addr;
Octstr *alt_charset;
+ Octstr *alt_addr_charset;
long connection_timeout, wait_ack, wait_ack_action;
- my_number = alt_charset = NULL;
+ my_number = alt_addr_charset = alt_charset = NULL;
transceiver_mode = 0;
autodetect_addr = 1;
@@ -2055,6 +2086,7 @@
/* check for an alternative charset */
alt_charset = cfg_get(grp, octstr_imm("alt-charset"));
+ alt_addr_charset = cfg_get(grp, octstr_imm("alt-addr-charset"));
/* check for connection timeout */
if (cfg_get_integer(&connection_timeout, grp,
octstr_imm("connection-timeout")) == -1)
@@ -2075,7 +2107,7 @@
source_addr_ton, source_addr_npi,
dest_addr_ton, dest_addr_npi,
enquire_link_interval, max_pending_submits,
version, priority, validity, my_number, -
smpp_msg_id_type, autodetect_addr, alt_charset,
+ smpp_msg_id_type, autodetect_addr,
alt_charset, alt_addr_charset,
service_type, connection_timeout, wait_ack,
wait_ack_action); conn->data = smpp; @@ -2097,6 +2129,7 @@
octstr_destroy(my_number); octstr_destroy(smsc_id);
octstr_destroy(alt_charset); +
octstr_destroy(alt_addr_charset);
octstr_destroy(service_type);
conn->status = SMSCCONN_CONNECTING; diff -Nru
gateway.cp1252/gwlib/cfg.def gateway.alpha_gsm/gwlib/cfg.def
--- gateway.cp1252/gwlib/cfg.def 2006-01-18 17:39:19.000000000 +0100
+++ gateway.alpha_gsm/gwlib/cfg.def 2006-01-18 17:39:50.000000000
+0100
@@ -365,6 +365,7 @@
OCTSTR(denied-prefix-regex)
OCTSTR(preferred-prefix-regex)
OCTSTR(max-error-count)
+ OCTSTR(alt-addr-charset)
)
------------------------------------------------------------------------
diff -Nru gateway/doc/userguide/userguide.xml
gateway.cp1252/doc/userguide/userguide.xml
--- gateway/doc/userguide/userguide.xml 2005-12-26
21:13:39.000000000 +0100
+++ gateway.cp1252/doc/userguide/userguide.xml 2006-01-18
16:17:16.000000000 +0100
@@ -5183,10 +5183,10 @@
<entry>boolean</entry>
<entry valign="bottom">
If enabled, Kannel will try to convert received messages
with UCS-2 charset
- to ISO-8859-1 or to UTF-8, simplifying external servers jobs.
If Kannel is + to WINDOWS-1252 or to UTF-8, simplifying external
servers jobs. If Kannel is able to recode message, it will also
change <literal>coding</literal> to <literal>7 bits</literal>
and <literal>charset</literal> to - <literal>iso-8859-1</literal>
or to <literal>utf-8</literal>. + <literal>windows-1252</literal>
or to <literal>utf-8</literal>. </entry></row>
<row><entry><literal>http-request-retry</literal></entry>
@@ -5879,7 +5879,7 @@
message charset: for a "normal" message, it will be "GSM"
(coding=0), "binary" (coding=1) or "UTF-16BE" (coding=2). If the
message was successfully
-recoded from Unicode, it will be "ISO-8859-1"
+recoded from Unicode, it will be "WINDOWS-1252"
</entry></row>
<row><entry><literal>%u</literal></entry><entry>
@@ -6912,7 +6912,7 @@
<entry><literal>string</literal></entry>
<entry valign="bottom">
Charset of text message. Used to convert to a format
suitable for
- 7 bits or to UCS-2. Defaults to ISO-8859-1 if coding is 7bits and
+ 7 bits or to UCS-2. Defaults to WINDOWS-1252 if coding is 7bits
and
UTF-16BE if coding is UCS-2.
</entry></row>
diff -Nru gateway/gw/smsbox.c gateway.cp1252/gw/smsbox.c
--- gateway/gw/smsbox.c 2005-12-09 03:14:31.000000000 +0100
+++ gateway.cp1252/gw/smsbox.c 2006-01-18 16:12:23.000000000 +0100
@@ -3654,9 +3654,9 @@
if (coding == DC_7BIT) {
/*
- * For 7 bit, convert to ISO-8859-1
+ * For 7 bit, convert to CP1252
*/
- if (octstr_recode (octstr_imm ("ISO-8859-1"), charset,
body) < 0) {
+ if (charset_convert (body, octstr_get_cstr(charset),
"CP1252") < 0) {
resultcode = -1;
}
} else if (coding == DC_UCS2) {
diff -Nru gateway/gw/smsc/smsc_smpp.c
gateway.cp1252/gw/smsc/smsc_smpp.c
--- gateway/gw/smsc/smsc_smpp.c 2005-12-18 21:21:16.000000000 +0100
+++ gateway.cp1252/gw/smsc/smsc_smpp.c 2006-01-18
16:12:23.000000000 +0100
@@ -78,6 +78,8 @@
#include "sms.h"
#include "dlr.h"
+#define SMPP_CHARSET "CP1252"
+
/*
* Select these based on whether you want to dump SMPP PDUs as they
are
* sent and received or not. Not dumping should be the default in
at least
@@ -490,9 +492,9 @@
* unless it was specified binary, ie. UDH indicator
was detected
*/
if (smpp->alt_charset && msg->sms.coding != DC_8BIT) {
- if (charset_convert(msg->sms.msgdata,
octstr_get_cstr(smpp->alt_charset), "ISO-8859-1") != 0)
+ if (charset_convert(msg->sms.msgdata,
octstr_get_cstr(smpp->alt_charset), SMPP_CHARSET) != 0)
error(0, "Failed to convert msgdata from
charset <%s> to <%s>, will leave as is.",
- octstr_get_cstr(smpp->alt_charset),
"ISO-8859-1");
+ octstr_get_cstr(smpp->alt_charset),
SMPP_CHARSET);
msg->sms.coding = DC_7BIT;
} else { /* assume GSM 03.38 7-bit alphabet */
charset_gsm_to_latin1(msg->sms.msgdata);
@@ -640,9 +642,9 @@
* unless it was specified binary, ie. UDH indicator
was detected
*/
if (smpp->alt_charset && msg->sms.coding != DC_8BIT) {
- if (charset_convert(msg->sms.msgdata,
octstr_get_cstr(smpp->alt_charset), "ISO-8859-1") != 0)
+ if (charset_convert(msg->sms.msgdata,
octstr_get_cstr(smpp->alt_charset), SMPP_CHARSET) != 0)
error(0, "Failed to convert msgdata from
charset <%s> to <%s>, will leave as is.",
- octstr_get_cstr(smpp->alt_charset),
"ISO-8859-1");
+ octstr_get_cstr(smpp->alt_charset),
SMPP_CHARSET);
msg->sms.coding = DC_7BIT;
} else { /* assume GSM 03.38 7-bit alphabet */
charset_gsm_to_latin1(msg->sms.msgdata);
@@ -845,10 +847,10 @@
/*
* convert to the given alternative charset
*/
- if (charset_convert(pdu->u.submit_sm.short_message,
"ISO-8859-1",
+ if (charset_convert(pdu->u.submit_sm.short_message,
SMPP_CHARSET,
octstr_get_cstr(smpp->alt_charset))
!= 0)
error(0, "Failed to convert msgdata from charset
<%s> to <%s>, will send as is.",
- "ISO-8859-1",
octstr_get_cstr(smpp->alt_charset));
+ SMPP_CHARSET,
octstr_get_cstr(smpp->alt_charset));
}
}
diff -Nru gateway/doc/userguide/userguide.xml gateway.alpha_gsm/doc/userguide/userguide.xml
--- gateway/doc/userguide/userguide.xml 2005-12-26 21:13:39.000000000 +0100
+++ gateway.alpha_gsm/doc/userguide/userguide.xml 2006-01-19 14:10:32.000000000 +0100
@@ -3177,6 +3177,17 @@
should be presented for this directive.
</entry></row>
+ <row><entry><literal>alt-addr-charset</literal></entry>
+ <entry><literal>string</literal></entry>
+ <entry valign="bottom">
+ Defines which character encoding is used for alphanumeric addresses.
+ When set to <literal>GSM</literal>, addresses are converted into the
+ GSM 03.38 charset (Since @ is translated into 0x00 which will break
+ the SMPP PDU, @ are stripped from addresses). If set to another value,
+ <literal>iconv()</literal> is used.
+ (Defaults to latin1)
+ </entry></row>
+
<row><entry><literal>connection-timeout</literal></entry>
<entry><literal>number (seconds)</literal></entry>
<entry valign="bottom">
diff -Nru gateway/gw/smsc/smsc_smpp.c gateway.alpha_gsm/gw/smsc/smsc_smpp.c
--- gateway/gw/smsc/smsc_smpp.c 2005-12-18 21:21:16.000000000 +0100
+++ gateway.alpha_gsm/gw/smsc/smsc_smpp.c 2006-01-19 14:11:12.000000000 +0100
@@ -78,6 +78,8 @@
#include "sms.h"
#include "dlr.h"
+#define SMPP_DEFAULT_CHARSET "windows-1252"
+
/*
* Select these based on whether you want to dump SMPP PDUs as they are
* sent and received or not. Not dumping should be the default in at least
@@ -156,6 +158,7 @@
int smpp_msg_id_type; /* msg id in C string, hex or decimal */
int autodetect_addr;
Octstr *alt_charset;
+ Octstr *alt_addr_charset;
long connection_timeout;
long wait_ack;
int wait_ack_action;
@@ -209,7 +212,7 @@
int enquire_link_interval, int max_pending_submits,
int version, int priority, int validity,
Octstr *my_number, int smpp_msg_id_type,
- int autodetect_addr, Octstr *alt_charset,
+ int autodetect_addr, Octstr *alt_charset, Octstr *alt_addr_charset,
Octstr *service_type, long connection_timeout,
long wait_ack, int wait_ack_action)
{
@@ -248,6 +251,7 @@
smpp->smpp_msg_id_type = smpp_msg_id_type;
smpp->autodetect_addr = autodetect_addr;
smpp->alt_charset = octstr_duplicate(alt_charset);
+ smpp->alt_addr_charset = octstr_duplicate(alt_addr_charset);
smpp->connection_timeout = connection_timeout;
smpp->wait_ack = wait_ack;
smpp->wait_ack_action = wait_ack_action;
@@ -271,6 +275,7 @@
octstr_destroy(smpp->address_range);
octstr_destroy(smpp->my_number);
octstr_destroy(smpp->alt_charset);
+ octstr_destroy(smpp->alt_addr_charset);
gw_free(smpp);
}
}
@@ -325,7 +330,7 @@
}
-static long convert_addr_from_pdu(Octstr *id, Octstr *addr, long ton, long npi)
+static long convert_addr_from_pdu(Octstr *id, Octstr *addr, long ton, long npi, Octstr *alt_addr_charset)
{
long reason = SMPP_ESME_ROK;
@@ -370,6 +375,15 @@
break;
case GSM_ADDR_TON_ALPHANUMERIC:
+ if (alt_addr_charset) {
+ if (octstr_str_case_compare(alt_addr_charset, "gsm") == 0)
+ charset_gsm_to_latin1(addr);
+ else {
+ if (charset_convert(addr, octstr_get_cstr(alt_addr_charset), SMPP_DEFAULT_CHARSET) != 0)
+ error(0, "Failed to convert address from charset <%s> to <%s>, will send as is.",
+ octstr_get_cstr(alt_addr_charset), SMPP_DEFAULT_CHARSET);
+ }
+ }
if (octstr_len(addr) > 11) {
/* alphanum sender, max. allowed length is 11 (according to GSM specs) */
error(0, "SMPP[%s]: Mallformed addr `%s', alphanum length greater 11 chars. ",
@@ -414,7 +428,7 @@
ton = pdu->u.deliver_sm.source_addr_ton;
npi = pdu->u.deliver_sm.source_addr_npi;
/* check source addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.deliver_sm.source_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.deliver_sm.source_addr, ton, npi, smpp->alt_addr_charset)) != SMPP_ESME_ROK)
goto error;
msg->sms.sender = pdu->u.deliver_sm.source_addr;
pdu->u.deliver_sm.source_addr = NULL;
@@ -435,7 +449,7 @@
ton = pdu->u.deliver_sm.dest_addr_ton;
npi = pdu->u.deliver_sm.dest_addr_npi;
/* check destination addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.deliver_sm.destination_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.deliver_sm.destination_addr, ton, npi, smpp->alt_addr_charset)) != SMPP_ESME_ROK)
goto error;
msg->sms.receiver = pdu->u.deliver_sm.destination_addr;
pdu->u.deliver_sm.destination_addr = NULL;
@@ -574,7 +588,7 @@
ton = pdu->u.data_sm.source_addr_ton;
npi = pdu->u.data_sm.source_addr_npi;
/* check source addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.data_sm.source_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.data_sm.source_addr, ton, npi, smpp->alt_addr_charset)) != SMPP_ESME_ROK)
goto error;
msg->sms.sender = pdu->u.data_sm.source_addr;
pdu->u.data_sm.source_addr = NULL;
@@ -595,7 +609,7 @@
ton = pdu->u.data_sm.dest_addr_ton;
npi = pdu->u.data_sm.dest_addr_npi;
/* check destination addr */
- if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.data_sm.destination_addr, ton, npi)) != SMPP_ESME_ROK)
+ if ((*reason = convert_addr_from_pdu(smpp->conn->id, pdu->u.data_sm.destination_addr, ton, npi, smpp->alt_addr_charset)) != SMPP_ESME_ROK)
goto error;
msg->sms.receiver = pdu->u.data_sm.destination_addr;
pdu->u.data_sm.destination_addr = NULL;
@@ -747,6 +761,15 @@
if (!octstr_check_range(pdu->u.submit_sm.source_addr, 1, 256, gw_isdigit)) {
pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_ALPHANUMERIC; /* alphanum */
pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN; /* short code */
+ if (smpp->alt_addr_charset) {
+ if (octstr_str_case_compare(smpp->alt_addr_charset, "gsm") == 0) {
+ octstr_replace(pdu->u.submit_sm.source_addr, octstr_imm("@"), octstr_imm("?")); /* @ would break PDU if converted into GSM*/
+ charset_latin1_to_gsm(pdu->u.submit_sm.source_addr);
+ }
+ else if (charset_convert(pdu->u.submit_sm.source_addr, SMPP_DEFAULT_CHARSET, octstr_get_cstr(smpp->alt_addr_charset)) != 0)
+ error(0, "Failed to convert source_addr from charset <%s> to <%s>, will send as is.",
+ SMPP_DEFAULT_CHARSET, octstr_get_cstr(smpp->alt_addr_charset));
+ }
} else {
/* numeric sender address with + in front -> international (remove the +) */
octstr_delete(pdu->u.submit_sm.source_addr, 0, 1);
@@ -756,6 +779,15 @@
if (!octstr_check_range(pdu->u.submit_sm.source_addr,0, 256, gw_isdigit)) {
pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_ALPHANUMERIC;
pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN;
+ if (smpp->alt_addr_charset) {
+ if (octstr_str_case_compare(smpp->alt_addr_charset, "gsm") == 0) {
+ octstr_replace(pdu->u.submit_sm.source_addr, octstr_imm("@"), octstr_imm("?")); /* @ would break PDU if converted into GSM */
+ charset_latin1_to_gsm(pdu->u.submit_sm.source_addr);
+ }
+ else if (charset_convert(pdu->u.submit_sm.source_addr, SMPP_DEFAULT_CHARSET, octstr_get_cstr(smpp->alt_addr_charset)) != 0)
+ error(0, "Failed to convert source_addr from charset <%s> to <%s>, will send as is.",
+ SMPP_DEFAULT_CHARSET, octstr_get_cstr(smpp->alt_addr_charset));
+ }
}
}
}
@@ -1936,9 +1968,10 @@
long smpp_msg_id_type;
int autodetect_addr;
Octstr *alt_charset;
+ Octstr *alt_addr_charset;
long connection_timeout, wait_ack, wait_ack_action;
- my_number = alt_charset = NULL;
+ my_number = alt_addr_charset = alt_charset = NULL;
transceiver_mode = 0;
autodetect_addr = 1;
@@ -2053,6 +2086,7 @@
/* check for an alternative charset */
alt_charset = cfg_get(grp, octstr_imm("alt-charset"));
+ alt_addr_charset = cfg_get(grp, octstr_imm("alt-addr-charset"));
/* check for connection timeout */
if (cfg_get_integer(&connection_timeout, grp, octstr_imm("connection-timeout")) == -1)
@@ -2073,7 +2107,7 @@
source_addr_ton, source_addr_npi, dest_addr_ton,
dest_addr_npi, enquire_link_interval,
max_pending_submits, version, priority, validity, my_number,
- smpp_msg_id_type, autodetect_addr, alt_charset,
+ smpp_msg_id_type, autodetect_addr, alt_charset, alt_addr_charset,
service_type, connection_timeout, wait_ack, wait_ack_action);
conn->data = smpp;
@@ -2095,6 +2129,7 @@
octstr_destroy(my_number);
octstr_destroy(smsc_id);
octstr_destroy(alt_charset);
+ octstr_destroy(alt_addr_charset);
octstr_destroy(service_type);
conn->status = SMSCCONN_CONNECTING;
diff -Nru gateway/gwlib/cfg.def gateway.alpha_gsm/gwlib/cfg.def
--- gateway/gwlib/cfg.def 2005-12-13 01:11:04.000000000 +0100
+++ gateway.alpha_gsm/gwlib/cfg.def 2006-01-19 14:10:32.000000000 +0100
@@ -365,6 +365,7 @@
OCTSTR(denied-prefix-regex)
OCTSTR(preferred-prefix-regex)
OCTSTR(max-error-count)
+ OCTSTR(alt-addr-charset)
)