Implemented call presentation (partly tested)
This commit is contained in:
parent
7568bb814e
commit
b9197def55
34
src/gsm.c
34
src/gsm.c
@ -163,6 +163,7 @@ static int _gsm_trigger_busy(GSM * gsm, char const * result,
|
|||||||
gboolean * answered);
|
gboolean * answered);
|
||||||
static int _gsm_trigger_cfun(GSM * gsm, char const * result);
|
static int _gsm_trigger_cfun(GSM * gsm, char const * result);
|
||||||
static int _gsm_trigger_cgmm(GSM * gsm, char const * result);
|
static int _gsm_trigger_cgmm(GSM * gsm, char const * result);
|
||||||
|
static int _gsm_trigger_clip(GSM * gsm, char const * result);
|
||||||
static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
|
static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
|
||||||
gboolean * answered);
|
gboolean * answered);
|
||||||
static int _gsm_trigger_cms_error(GSM * gsm, char const * result);
|
static int _gsm_trigger_cms_error(GSM * gsm, char const * result);
|
||||||
@ -192,6 +193,7 @@ static GSMTrigger _gsm_triggers[] =
|
|||||||
GSM_TRIGGER("BUSY", busy),
|
GSM_TRIGGER("BUSY", busy),
|
||||||
GSM_TRIGGER("+CFUN: ", cfun),
|
GSM_TRIGGER("+CFUN: ", cfun),
|
||||||
GSM_TRIGGER("+CGMM: ", cgmm),
|
GSM_TRIGGER("+CGMM: ", cgmm),
|
||||||
|
GSM_TRIGGER("+CLIP: ", clip),
|
||||||
GSM_TRIGGER("+CME ERROR: ", cme_error),
|
GSM_TRIGGER("+CME ERROR: ", cme_error),
|
||||||
GSM_TRIGGER("+CMS ERROR: ", cms_error),
|
GSM_TRIGGER("+CMS ERROR: ", cms_error),
|
||||||
GSM_TRIGGER("+CMGL: ", cmgl),
|
GSM_TRIGGER("+CMGL: ", cmgl),
|
||||||
@ -456,12 +458,18 @@ int gsm_event(GSM * gsm, GSMEventType type, ...)
|
|||||||
{
|
{
|
||||||
case GSM_EVENT_TYPE_ERROR:
|
case GSM_EVENT_TYPE_ERROR:
|
||||||
event->error.error = va_arg(ap, GSMError);
|
event->error.error = va_arg(ap, GSMError);
|
||||||
event->error.message = va_arg(ap, char *);
|
event->error.message = va_arg(ap, char const *);
|
||||||
|
break;
|
||||||
|
case GSM_EVENT_TYPE_CALL_PRESENTATION:
|
||||||
|
event->call_presentation.number = va_arg(ap,
|
||||||
|
char const *);
|
||||||
|
event->call_presentation.format = va_arg(ap,
|
||||||
|
unsigned int);
|
||||||
break;
|
break;
|
||||||
case GSM_EVENT_TYPE_CONTACT:
|
case GSM_EVENT_TYPE_CONTACT:
|
||||||
event->contact.index = va_arg(ap, unsigned int);
|
event->contact.index = va_arg(ap, unsigned int);
|
||||||
event->contact.name = va_arg(ap, char *);
|
event->contact.name = va_arg(ap, char const *);
|
||||||
event->contact.number = va_arg(ap, char *);
|
event->contact.number = va_arg(ap, char const *);
|
||||||
break;
|
break;
|
||||||
case GSM_EVENT_TYPE_CONTACT_LIST:
|
case GSM_EVENT_TYPE_CONTACT_LIST:
|
||||||
event->contact_list.start = va_arg(ap, unsigned int);
|
event->contact_list.start = va_arg(ap, unsigned int);
|
||||||
@ -484,7 +492,7 @@ int gsm_event(GSM * gsm, GSMEventType type, ...)
|
|||||||
case GSM_EVENT_TYPE_OPERATOR:
|
case GSM_EVENT_TYPE_OPERATOR:
|
||||||
event->operator.mode = va_arg(ap, GSMOperatorMode);
|
event->operator.mode = va_arg(ap, GSMOperatorMode);
|
||||||
event->operator.format = va_arg(ap, GSMOperatorFormat);
|
event->operator.format = va_arg(ap, GSMOperatorFormat);
|
||||||
event->operator.operator = va_arg(ap, char *);
|
event->operator.operator = va_arg(ap, char const *);
|
||||||
event->operator.lai = va_arg(ap, unsigned int);
|
event->operator.lai = va_arg(ap, unsigned int);
|
||||||
break;
|
break;
|
||||||
case GSM_EVENT_TYPE_REGISTRATION:
|
case GSM_EVENT_TYPE_REGISTRATION:
|
||||||
@ -804,6 +812,7 @@ static int _parse_do(GSM * gsm, size_t * i)
|
|||||||
/* XXX should probably not be set by us */
|
/* XXX should probably not be set by us */
|
||||||
gsm_modem_set_extended_errors(gsm->modem, TRUE);
|
gsm_modem_set_extended_errors(gsm->modem, TRUE);
|
||||||
gsm_modem_set_extended_ring_reports(gsm->modem, TRUE);
|
gsm_modem_set_extended_ring_reports(gsm->modem, TRUE);
|
||||||
|
gsm_modem_set_call_presentation(gsm->modem, TRUE);
|
||||||
gsm_modem_get_model(gsm->modem);
|
gsm_modem_get_model(gsm->modem);
|
||||||
_gsm_event_set_status(gsm, GSM_STATUS_INITIALIZED);
|
_gsm_event_set_status(gsm, GSM_STATUS_INITIALIZED);
|
||||||
_gsm_queue_push(gsm);
|
_gsm_queue_push(gsm);
|
||||||
@ -1021,6 +1030,22 @@ static int _gsm_trigger_cgmm(GSM * gsm, char const * result)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* gsm_trigger_clip */
|
||||||
|
static int _gsm_trigger_clip(GSM * gsm, char const * result)
|
||||||
|
{
|
||||||
|
char number[32];
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result);
|
||||||
|
#endif
|
||||||
|
if(sscanf(result, "\"%31[^\"]\", %u", number,
|
||||||
|
&gsm->event.call_presentation.format) != 2)
|
||||||
|
return 1; /* XXX report error? */
|
||||||
|
gsm->event.call_presentation.number = number;
|
||||||
|
return _gsm_event_send(gsm, GSM_EVENT_TYPE_CALL_PRESENTATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* gsm_trigger_cme_error */
|
/* gsm_trigger_cme_error */
|
||||||
static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
|
static int _gsm_trigger_cme_error(GSM * gsm, char const * result,
|
||||||
gboolean * answered)
|
gboolean * answered)
|
||||||
@ -1165,6 +1190,7 @@ static int _gsm_trigger_cpbr(GSM * gsm, char const * result)
|
|||||||
snprintf(name, sizeof(name), "%s", p);
|
snprintf(name, sizeof(name), "%s", p);
|
||||||
g_free(p);
|
g_free(p);
|
||||||
}
|
}
|
||||||
|
/* XXX convert to _gsm_event_send() */
|
||||||
return gsm_event(gsm, GSM_EVENT_TYPE_CONTACT, index, name, number);
|
return gsm_event(gsm, GSM_EVENT_TYPE_CONTACT, index, name, number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ typedef void (*GSMCommandCallback)(GSM * gsm);
|
|||||||
typedef enum _GSMEventType
|
typedef enum _GSMEventType
|
||||||
{
|
{
|
||||||
GSM_EVENT_TYPE_ERROR = 0,
|
GSM_EVENT_TYPE_ERROR = 0,
|
||||||
|
GSM_EVENT_TYPE_CALL_PRESENTATION,
|
||||||
GSM_EVENT_TYPE_CONTACT,
|
GSM_EVENT_TYPE_CONTACT,
|
||||||
GSM_EVENT_TYPE_CONTACT_LIST,
|
GSM_EVENT_TYPE_CONTACT_LIST,
|
||||||
GSM_EVENT_TYPE_FUNCTIONAL,
|
GSM_EVENT_TYPE_FUNCTIONAL,
|
||||||
@ -147,6 +148,14 @@ typedef union _GSMEvent
|
|||||||
char const * message;
|
char const * message;
|
||||||
} error;
|
} error;
|
||||||
|
|
||||||
|
/* GSM_EVENT_TYPE_CALL_PRESENTATION */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
GSMEventType type;
|
||||||
|
char const * number;
|
||||||
|
unsigned int format;
|
||||||
|
} call_presentation;
|
||||||
|
|
||||||
/* GSM_EVENT_TYPE_CONTACT */
|
/* GSM_EVENT_TYPE_CONTACT */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
10
src/modem.c
10
src/modem.c
@ -477,6 +477,16 @@ char * _text_to_sept(char const * text)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* gsm_modem_set_call_presentation */
|
||||||
|
int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set)
|
||||||
|
{
|
||||||
|
char cmd[] = "AT+CLIP=X";
|
||||||
|
|
||||||
|
cmd[8] = set ? '1' : '0';
|
||||||
|
return (gsm_queue(gsmm->gsm, cmd) != NULL) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* gsm_modem_set_echo */
|
/* gsm_modem_set_echo */
|
||||||
int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo)
|
int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo)
|
||||||
{
|
{
|
||||||
|
@ -68,6 +68,7 @@ int gsm_modem_reset(GSMModem * gsmm);
|
|||||||
|
|
||||||
int gsm_modem_send_message(GSMModem * gsmm, char const * number, char const * text);
|
int gsm_modem_send_message(GSMModem * gsmm, char const * number, char const * text);
|
||||||
|
|
||||||
|
int gsm_modem_set_call_presentation(GSMModem * gsmm, gboolean set);
|
||||||
int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo);
|
int gsm_modem_set_echo(GSMModem * gsmm, gboolean echo);
|
||||||
int gsm_modem_set_extended_errors(GSMModem * gsmm, gboolean extended);
|
int gsm_modem_set_extended_errors(GSMModem * gsmm, gboolean extended);
|
||||||
int gsm_modem_set_extended_ring_reports(GSMModem * gsmm, gboolean extended);
|
int gsm_modem_set_extended_ring_reports(GSMModem * gsmm, gboolean extended);
|
||||||
|
44
src/phone.c
44
src/phone.c
@ -73,6 +73,8 @@ struct _Phone
|
|||||||
|
|
||||||
/* call */
|
/* call */
|
||||||
GtkWidget * ca_window;
|
GtkWidget * ca_window;
|
||||||
|
GtkWidget * ca_name;
|
||||||
|
GtkWidget * ca_number;
|
||||||
GtkWidget * ca_answer;
|
GtkWidget * ca_answer;
|
||||||
GtkWidget * ca_hangup;
|
GtkWidget * ca_hangup;
|
||||||
GtkWidget * ca_image;
|
GtkWidget * ca_image;
|
||||||
@ -427,7 +429,7 @@ int phone_dialer_append(Phone * phone, char character)
|
|||||||
if((character < '0' || character > '9') && character != '*'
|
if((character < '0' || character > '9') && character != '*'
|
||||||
&& character != '+' && character != '#')
|
&& character != '+' && character != '#')
|
||||||
return 1; /* ignore the error */
|
return 1; /* ignore the error */
|
||||||
/* FIXME ask GSM if in a call; if yes, send DTMF */
|
/* FIXME if in a call send DTMF instead */
|
||||||
text = gtk_entry_get_text(GTK_ENTRY(phone->di_entry));
|
text = gtk_entry_get_text(GTK_ENTRY(phone->di_entry));
|
||||||
len = strlen(text);
|
len = strlen(text);
|
||||||
if((p = malloc(len + 2)) == NULL)
|
if((p = malloc(len + 2)) == NULL)
|
||||||
@ -442,12 +444,13 @@ int phone_dialer_append(Phone * phone, char character)
|
|||||||
/* phone_dialer_call */
|
/* phone_dialer_call */
|
||||||
void phone_dialer_call(Phone * phone, char const * number)
|
void phone_dialer_call(Phone * phone, char const * number)
|
||||||
{
|
{
|
||||||
|
/* FIXME check if it's either a name or number */
|
||||||
if(number == NULL)
|
if(number == NULL)
|
||||||
number = gtk_entry_get_text(GTK_ENTRY(phone->di_entry));
|
number = gtk_entry_get_text(GTK_ENTRY(phone->di_entry));
|
||||||
if(number[0] == '\0')
|
if(number[0] == '\0')
|
||||||
number = NULL; /* call the last number dialled */
|
number = NULL; /* call the last number dialled */
|
||||||
gsm_call(phone->gsm, GSM_CALL_TYPE_VOICE, number);
|
gsm_call(phone->gsm, GSM_CALL_TYPE_VOICE, number);
|
||||||
phone_show_call(phone, TRUE, PHONE_CALL_OUTGOING);
|
phone_show_call(phone, TRUE, PHONE_CALL_OUTGOING, " ", number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -483,6 +486,8 @@ void phone_show_call(Phone * phone, gboolean show, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
PhoneCall call;
|
PhoneCall call;
|
||||||
|
char const * name = NULL;
|
||||||
|
char const * number = NULL;
|
||||||
GtkWidget * vbox;
|
GtkWidget * vbox;
|
||||||
GtkWidget * hbox;
|
GtkWidget * hbox;
|
||||||
|
|
||||||
@ -494,6 +499,11 @@ void phone_show_call(Phone * phone, gboolean show, ...)
|
|||||||
}
|
}
|
||||||
va_start(ap, show);
|
va_start(ap, show);
|
||||||
call = va_arg(ap, PhoneCall);
|
call = va_arg(ap, PhoneCall);
|
||||||
|
if(call == PHONE_CALL_INCOMING || call == PHONE_CALL_OUTGOING)
|
||||||
|
{
|
||||||
|
name = va_arg(ap, char const *);
|
||||||
|
number = va_arg(ap, char const *);
|
||||||
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
if(phone->ca_window == NULL)
|
if(phone->ca_window == NULL)
|
||||||
{
|
{
|
||||||
@ -506,6 +516,14 @@ void phone_show_call(Phone * phone, gboolean show, ...)
|
|||||||
#endif
|
#endif
|
||||||
vbox = gtk_vbox_new(FALSE, 4);
|
vbox = gtk_vbox_new(FALSE, 4);
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
|
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
|
||||||
|
/* party */
|
||||||
|
phone->ca_name = gtk_label_new(NULL);
|
||||||
|
gtk_widget_modify_font(phone->ca_name, phone->bold);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), phone->ca_name, FALSE, TRUE,
|
||||||
|
0);
|
||||||
|
phone->ca_number = gtk_label_new(NULL);
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), phone->ca_number, FALSE, TRUE,
|
||||||
|
0);
|
||||||
/* buttons */
|
/* buttons */
|
||||||
/* answer */
|
/* answer */
|
||||||
phone->ca_answer = _phone_create_button("call-start",
|
phone->ca_answer = _phone_create_button("call-start",
|
||||||
@ -564,6 +582,20 @@ void phone_show_call(Phone * phone, gboolean show, ...)
|
|||||||
gtk_container_add(GTK_CONTAINER(phone->ca_window), vbox);
|
gtk_container_add(GTK_CONTAINER(phone->ca_window), vbox);
|
||||||
}
|
}
|
||||||
phone_show_dialer(phone, FALSE);
|
phone_show_dialer(phone, FALSE);
|
||||||
|
if(name != NULL)
|
||||||
|
{
|
||||||
|
if(name[0] == '\0')
|
||||||
|
/* XXX look it up if we have the number */
|
||||||
|
name = _("Unknown contact");
|
||||||
|
gtk_label_set_text(GTK_LABEL(phone->ca_name), name);
|
||||||
|
}
|
||||||
|
if(number != NULL)
|
||||||
|
{
|
||||||
|
if(number[0] == '\0')
|
||||||
|
/* XXX look it up if we have the name */
|
||||||
|
number = _("Unknown number");
|
||||||
|
gtk_label_set_text(GTK_LABEL(phone->ca_number), number);
|
||||||
|
}
|
||||||
gtk_widget_show_all(phone->ca_window);
|
gtk_widget_show_all(phone->ca_window);
|
||||||
switch(call)
|
switch(call)
|
||||||
{
|
{
|
||||||
@ -1382,6 +1414,11 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data)
|
|||||||
{
|
{
|
||||||
case GSM_EVENT_TYPE_ERROR:
|
case GSM_EVENT_TYPE_ERROR:
|
||||||
return _gsm_event_error(phone, event);
|
return _gsm_event_error(phone, event);
|
||||||
|
case GSM_EVENT_TYPE_CALL_PRESENTATION:
|
||||||
|
/* FIXME convert number, the contact is automatic */
|
||||||
|
phone_show_call(phone, TRUE, PHONE_CALL_INCOMING, "",
|
||||||
|
event->call_presentation.number);
|
||||||
|
return 0;
|
||||||
case GSM_EVENT_TYPE_CONTACT:
|
case GSM_EVENT_TYPE_CONTACT:
|
||||||
phone_contacts_add(phone, event->contact.index,
|
phone_contacts_add(phone, event->contact.index,
|
||||||
event->contact.name,
|
event->contact.name,
|
||||||
@ -1404,7 +1441,8 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data)
|
|||||||
_phone_track(phone, PHONE_TRACK_MESSAGE_LIST, TRUE);
|
_phone_track(phone, PHONE_TRACK_MESSAGE_LIST, TRUE);
|
||||||
return 0;
|
return 0;
|
||||||
case GSM_EVENT_TYPE_INCOMING_CALL:
|
case GSM_EVENT_TYPE_INCOMING_CALL:
|
||||||
phone_show_call(phone, TRUE, PHONE_CALL_INCOMING);
|
phone_show_call(phone, TRUE, PHONE_CALL_INCOMING, "",
|
||||||
|
"");
|
||||||
return 0;
|
return 0;
|
||||||
case GSM_EVENT_TYPE_MESSAGE_LIST:
|
case GSM_EVENT_TYPE_MESSAGE_LIST:
|
||||||
_phone_fetch_messages(phone, event->message_list.start,
|
_phone_fetch_messages(phone, event->message_list.start,
|
||||||
|
Loading…
Reference in New Issue
Block a user