Re: user guide
Alexander Malysh <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi, patch in slightly modified version commited to cvs. Thanks, Alex Peter Christensen schrieb: > 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) > ) > >