Converting outgoing messages to the GSM alphabet (untested)

This commit is contained in:
Pierre Pronchery 2010-05-30 14:29:36 +00:00
parent f4e90c6ed1
commit 4d7e27abfb
4 changed files with 42 additions and 10 deletions

View File

@ -210,6 +210,7 @@ static struct
/* prototypes */ /* prototypes */
/* conversions */ /* conversions */
static unsigned char _gsm_convert_from_iso(unsigned char c);
static unsigned char _gsm_convert_to_iso(unsigned char c); static unsigned char _gsm_convert_to_iso(unsigned char c);
/* events */ /* events */
@ -906,13 +907,38 @@ int gsm_reset(GSM * gsm, unsigned int delay)
/* gsm_send_message */ /* gsm_send_message */
int gsm_send_message(GSM * gsm, char const * number, char const * text) 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 */ /* private */
/* functions */ /* functions */
/* conversions */ /* 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 */ /* gsm_convert_to_iso */
static unsigned char _gsm_convert_to_iso(unsigned char c) static unsigned char _gsm_convert_to_iso(unsigned char c)
{ {

View File

@ -443,10 +443,10 @@ int gsm_modem_reset(GSMModem * gsmm)
/* gsm_modem_send_message */ /* gsm_modem_send_message */
static char * _number_to_address(char const * number); 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, int gsm_modem_send_message(GSMModem * gsmm, char const * number,
char const * text) char const * text, size_t length)
{ {
int ret = 1; int ret = 1;
char const cmd1[] = "AT+CMGS="; 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, return gsm_event(gsmm->gsm, GSM_EVENT_TYPE_ERROR,
GSM_ERROR_MESSAGE_SEND_FAILED, NULL); GSM_ERROR_MESSAGE_SEND_FAILED, NULL);
addr = _number_to_address(number); 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) len2 = sizeof(cmd2) + 2 + strlen(addr ? addr : "") + sizeof(pid)
+ sizeof(dcs) + 2 + strlen(sept ? sept : "") + 1; + sizeof(dcs) + 2 + strlen(sept ? sept : "") + 1;
buf2 = malloc(len2); 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. */ /* 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"; char const tab[] = "0123456789ABCDEF";
unsigned char const * t = (unsigned char const *)text; unsigned char const * t = (unsigned char const *)text;
char * buf; char * buf;
size_t len;
char * p; char * p;
size_t i; size_t i;
unsigned char ch1; unsigned char ch1;
unsigned char ch2; unsigned char ch2;
int shift = 0; int shift = 0;
len = strlen(text); length = strlen(text);
if((buf = malloc((len * 2) + 1)) == NULL) if((buf = malloc((length * 2) + 1)) == NULL)
return NULL; return NULL;
p = buf; p = buf;
for(i = 0; i < len; i++) for(i = 0; i < length; i++)
{ {
ch1 = t[i] & 0x7f; ch1 = t[i] & 0x7f;
ch1 = (ch1 >> shift); ch1 = (ch1 >> shift);

View File

@ -74,7 +74,7 @@ int gsm_modem_is_registered(GSMModem * gsmm);
int gsm_modem_reset(GSMModem * gsmm); int gsm_modem_reset(GSMModem * gsmm);
int gsm_modem_send_message(GSMModem * gsmm, char const * number, 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_presentation(GSMModem * gsmm, gboolean set);
int gsm_modem_set_call_waiting_control(GSMModem * gsmm, gboolean unsollicited); int gsm_modem_set_call_waiting_control(GSMModem * gsmm, gboolean unsollicited);

View File

@ -1924,6 +1924,7 @@ void phone_write_send(Phone * phone)
GtkTextIter start; GtkTextIter start;
GtkTextIter end; GtkTextIter end;
size_t len; size_t len;
gchar * p;
phone_show_write(phone, TRUE); phone_show_write(phone, TRUE);
number = gtk_entry_get_text(GTK_ENTRY(phone->wr_entry)); number = gtk_entry_get_text(GTK_ENTRY(phone->wr_entry));
@ -1934,6 +1935,12 @@ void phone_write_send(Phone * phone)
FALSE); FALSE);
if(number == NULL || number[0] == '\0' || text == NULL) if(number == NULL || number[0] == '\0' || text == NULL)
return; 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, phone->wr_progress = _phone_create_progress(phone->wr_window,
_("Sending message...")); _("Sending message..."));
_phone_track(phone, PHONE_TRACK_MESSAGE_SENT, TRUE); _phone_track(phone, PHONE_TRACK_MESSAGE_SENT, TRUE);