Re: user guide
Peter Christensen <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
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)); >>>> } >>>> } >>>> >>> >>> >> >> > >
kannel.smpp.alpha_gsm.3.diff
(text/x-patch, 9.9 KB)
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)
)