diff --git a/src/gsm.c b/src/gsm.c index a942968..e1b91e4 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -210,6 +210,7 @@ static struct /* prototypes */ /* conversions */ +static unsigned char _gsm_convert_from_iso(unsigned char c); static unsigned char _gsm_convert_to_iso(unsigned char c); /* events */ @@ -906,13 +907,38 @@ int gsm_reset(GSM * gsm, unsigned int delay) /* gsm_send_message */ int gsm_send_message(GSM * gsm, char const * number, char const * text) { - return gsm_modem_send_message(gsm->modem, number, text); + int ret; + size_t len; + char * p; + size_t i; + + len = strlen(text); + if((p = malloc(len)) == NULL) + return 1; /* XXX report error */ + /* XXX support more alphabets */ + for(i = 0; i < len; i++) + p[i] = _gsm_convert_from_iso(text[i]); + ret = gsm_modem_send_message(gsm->modem, number, text, len); + free(p); + return ret; } /* private */ /* functions */ /* conversions */ +/* gsm_convert_from_iso */ +static unsigned char _gsm_convert_from_iso(unsigned char c) +{ + size_t i; + + for(i = 0; i < sizeof(_gsm_conv) / sizeof(*_gsm_conv); i++) + if(_gsm_conv[i].iso == c) + return _gsm_conv[i].gsm; + return c; +} + + /* gsm_convert_to_iso */ static unsigned char _gsm_convert_to_iso(unsigned char c) { diff --git a/src/modem.c b/src/modem.c index 6f7caf2..1796ee4 100644 --- a/src/modem.c +++ b/src/modem.c @@ -443,10 +443,10 @@ int gsm_modem_reset(GSMModem * gsmm) /* gsm_modem_send_message */ static char * _number_to_address(char const * number); -static char * _text_to_sept(char const * text); +static char * _text_to_sept(char const * text, size_t length); int gsm_modem_send_message(GSMModem * gsmm, char const * number, - char const * text) + char const * text, size_t length) { int ret = 1; char const cmd1[] = "AT+CMGS="; @@ -468,7 +468,7 @@ int gsm_modem_send_message(GSMModem * gsmm, char const * number, return gsm_event(gsmm->gsm, GSM_EVENT_TYPE_ERROR, GSM_ERROR_MESSAGE_SEND_FAILED, NULL); addr = _number_to_address(number); - sept = _text_to_sept(text); + sept = _text_to_sept(text, length); len2 = sizeof(cmd2) + 2 + strlen(addr ? addr : "") + sizeof(pid) + sizeof(dcs) + 2 + strlen(sept ? sept : "") + 1; buf2 = malloc(len2); @@ -545,23 +545,22 @@ static char * _number_to_address(char const * number) } /* this function is heavily inspired from gsmd, (c) 2007 OpenMoko, Inc. */ -static char * _text_to_sept(char const * text) +static char * _text_to_sept(char const * text, size_t length) { char const tab[] = "0123456789ABCDEF"; unsigned char const * t = (unsigned char const *)text; char * buf; - size_t len; char * p; size_t i; unsigned char ch1; unsigned char ch2; int shift = 0; - len = strlen(text); - if((buf = malloc((len * 2) + 1)) == NULL) + length = strlen(text); + if((buf = malloc((length * 2) + 1)) == NULL) return NULL; p = buf; - for(i = 0; i < len; i++) + for(i = 0; i < length; i++) { ch1 = t[i] & 0x7f; ch1 = (ch1 >> shift); diff --git a/src/modem.h b/src/modem.h index 7c97c26..c64e395 100644 --- a/src/modem.h +++ b/src/modem.h @@ -74,7 +74,7 @@ int gsm_modem_is_registered(GSMModem * gsmm); int gsm_modem_reset(GSMModem * gsmm); int gsm_modem_send_message(GSMModem * gsmm, char const * number, - char const * text); + char const * text, size_t len); int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set); int gsm_modem_set_call_waiting_control(GSMModem * gsmm, gboolean unsollicited); diff --git a/src/phone.c b/src/phone.c index f9f9818..e26b963 100644 --- a/src/phone.c +++ b/src/phone.c @@ -1924,6 +1924,7 @@ void phone_write_send(Phone * phone) GtkTextIter start; GtkTextIter end; size_t len; + gchar * p; phone_show_write(phone, TRUE); number = gtk_entry_get_text(GTK_ENTRY(phone->wr_entry)); @@ -1934,6 +1935,12 @@ void phone_write_send(Phone * phone) FALSE); if(number == NULL || number[0] == '\0' || text == NULL) return; + if((p = g_convert(text, -1, "ISO-8859-1", "UTF-8", NULL, NULL, NULL)) + != NULL) + { + g_free(text); + text = p; + } phone->wr_progress = _phone_create_progress(phone->wr_window, _("Sending message...")); _phone_track(phone, PHONE_TRACK_MESSAGE_SENT, TRUE);