Converting outgoing messages to the GSM alphabet (untested)
This commit is contained in:
parent
f4e90c6ed1
commit
4d7e27abfb
28
src/gsm.c
28
src/gsm.c
@ -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)
|
||||||
{
|
{
|
||||||
|
15
src/modem.c
15
src/modem.c
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user