* [PATCH v2 1/2] gatserver: add command finished functions
@ 2011-08-04 14:29 =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-04 14:29 ` [PATCH v2 2/2] emulator: fix indicator notification =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis @ 2011-08-04 14:29 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3407 bytes --]
---
gatchat/gatserver.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
gatchat/gatserver.h | 7 +++++++
2 files changed, 51 insertions(+), 0 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index ab785f7..8e92071 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -115,6 +115,9 @@ struct _GAtServer {
gpointer user_disconnect_data; /* User disconnect data */
GAtDebugFunc debugf; /* Debugging output function */
gpointer debug_data; /* Data to pass to debug func */
+ GAtServerFinishFunc finishf; /* Command finish function */
+ gpointer finish_data; /* Finish func data */
+ guint finish_source;
GHashTable *command_list; /* List of AT commands */
GQueue *write_queue; /* Write buffer queue */
guint max_read_attempts; /* Max reads per select */
@@ -1177,12 +1180,27 @@ static void server_wakeup_writer(GAtServer *server)
g_at_io_set_write_handler(server->io, can_write_data, server);
}
+static gboolean notify_finish(void *user_data)
+{
+ GAtServer *server = user_data;
+
+ server->finishf(server, server->finish_data);
+ server->finish_source = 0;
+
+ return FALSE;
+}
+
static void server_resume(GAtServer *server)
{
if (server->suspended == FALSE)
return;
server->suspended = FALSE;
+
+ if (server->finishf)
+ server->finish_source = g_timeout_add_seconds(0, notify_finish,
+ server);
+
g_at_io_set_read_handler(server->io, new_bytes, server);
}
@@ -1336,6 +1354,11 @@ void g_at_server_unref(GAtServer *server)
if (server == NULL)
return;
+ if (server->finish_source) {
+ g_source_remove(server->finish_source);
+ server->finish_source = 0;
+ }
+
is_zero = g_atomic_int_dec_and_test(&server->ref_count);
if (is_zero == FALSE)
@@ -1455,3 +1478,24 @@ gboolean g_at_server_unregister(GAtServer *server, const char *prefix)
return TRUE;
}
+
+gboolean g_at_server_set_finish_callback(GAtServer *server,
+ GAtServerFinishFunc finish,
+ gpointer user_data)
+{
+ if (server == NULL)
+ return FALSE;
+
+ server->finishf = finish;
+ server->finish_data = user_data;
+
+ return TRUE;
+}
+
+gboolean g_at_server_command_pending(GAtServer *server)
+{
+ if (server == NULL)
+ return FALSE;
+
+ return server->suspended;
+}
diff --git a/gatchat/gatserver.h b/gatchat/gatserver.h
index bb0ae84..599c992 100644
--- a/gatchat/gatserver.h
+++ b/gatchat/gatserver.h
@@ -69,6 +69,8 @@ typedef void (*GAtServerNotifyFunc)(GAtServer *server,
GAtServerRequestType type,
GAtResult *result, gpointer user_data);
+typedef void (*GAtServerFinishFunc)(GAtServer *server, gpointer user_data);
+
GAtServer *g_at_server_new(GIOChannel *io);
GIOChannel *g_at_server_get_channel(GAtServer *server);
GAtIO *g_at_server_get_io(GAtServer *server);
@@ -94,6 +96,11 @@ gboolean g_at_server_register(GAtServer *server, const char *prefix,
GDestroyNotify destroy_notify);
gboolean g_at_server_unregister(GAtServer *server, const char *prefix);
+gboolean g_at_server_set_finish_callback(GAtServer *server,
+ GAtServerFinishFunc finish,
+ gpointer user_data);
+gboolean g_at_server_command_pending(GAtServer *server);
+
/* Send a final result code. E.g. G_AT_SERVER_RESULT_NO_DIALTONE */
void g_at_server_send_final(GAtServer *server, GAtServerResult result);
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] emulator: fix indicator notification
2011-08-04 14:29 [PATCH v2 1/2] gatserver: add command finished functions =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
@ 2011-08-04 14:29 ` =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-15 5:24 ` Denis Kenzior
2011-08-12 7:00 ` [PATCH v2 1/2] gatserver: add command finished functions Denis Kenzior
2011-08-15 5:32 ` Denis Kenzior
2 siblings, 1 reply; 5+ messages in thread
From: =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis @ 2011-08-04 14:29 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3508 bytes --]
---
src/emulator.c | 33 +++++++++++++++++++++++++++++++--
src/voicecall.c | 11 -----------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/src/emulator.c b/src/emulator.c
index deb4780..06ec06c 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -59,6 +59,7 @@ struct indicator {
int value;
int min;
int max;
+ gboolean deferred;
};
static void emulator_debug(const char *str, void *data)
@@ -345,6 +346,29 @@ static struct ofono_call *find_call_with_status(struct ofono_emulator *em,
return __ofono_voicecall_find_call_with_status(vc, status);
}
+static void notify_deferred_indicators(GAtServer *server, void *user_data)
+{
+ struct ofono_emulator *em = user_data;
+ int i;
+ char buf[20];
+ GSList *l;
+ struct indicator *ind;
+
+ for (i = 1, l = em->indicators; l; l = l->next, i++) {
+ ind = l->data;
+
+ if (!ind->deferred)
+ continue;
+
+ if (em->events_mode == 3 && em->events_ind && em->slc) {
+ sprintf(buf, "+CIEV: %d,%d", i, ind->value);
+ g_at_server_send_unsolicited(em->server, buf);
+ }
+
+ ind->deferred = FALSE;
+ }
+}
+
static gboolean notify_ccwa(void *user_data)
{
struct ofono_emulator *em = user_data;
@@ -832,6 +856,8 @@ void ofono_emulator_register(struct ofono_emulator *em, int fd)
g_at_server_set_debug(em->server, emulator_debug, "Server");
g_at_server_set_disconnect_function(em->server,
emulator_disconnect, em);
+ g_at_server_set_finish_callback(em->server, notify_deferred_indicators,
+ em);
if (em->type == OFONO_EMULATOR_TYPE_HFP) {
emulator_add_indicator(em, OFONO_EMULATOR_IND_SERVICE, 0, 1, 0);
@@ -1124,8 +1150,11 @@ void ofono_emulator_set_indicator(struct ofono_emulator *em,
notify_ccwa(em);
if (em->events_mode == 3 && em->events_ind && em->slc) {
- sprintf(buf, "+CIEV: %d,%d", i, ind->value);
- g_at_server_send_unsolicited(em->server, buf);
+ if (!g_at_server_command_pending(em->server)) {
+ sprintf(buf, "+CIEV: %d,%d", i, ind->value);
+ g_at_server_send_unsolicited(em->server, buf);
+ } else
+ ind->deferred = TRUE;
}
/*
diff --git a/src/voicecall.c b/src/voicecall.c
index 23976af..168ce96 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -700,9 +700,6 @@ static void emulator_call_status_cb(struct ofono_atom *atom, void *data)
struct ofono_emulator *em = __ofono_atom_get_data(atom);
struct emulator_status *s = data;
- if (em == s->vc->pending_em)
- return;
-
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_CALL, s->status);
}
@@ -711,9 +708,6 @@ static void emulator_callsetup_status_cb(struct ofono_atom *atom, void *data)
struct ofono_emulator *em = __ofono_atom_get_data(atom);
struct emulator_status *s = data;
- if (em == s->vc->pending_em)
- return;
-
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_CALLSETUP,
s->status);
}
@@ -723,9 +717,6 @@ static void emulator_callheld_status_cb(struct ofono_atom *atom, void *data)
struct ofono_emulator *em = __ofono_atom_get_data(atom);
struct emulator_status *s = data;
- if (em == s->vc->pending_em)
- return;
-
ofono_emulator_set_indicator(em, OFONO_EMULATOR_IND_CALLHELD,
s->status);
}
@@ -3210,8 +3201,6 @@ static void emulator_dial_callback(const struct ofono_error *error, void *data)
vc->pending_em = NULL;
- notify_emulator_call_status(vc);
-
if (need_to_emit)
voicecalls_emit_call_added(vc, v);
}
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] gatserver: add command finished functions
2011-08-04 14:29 [PATCH v2 1/2] gatserver: add command finished functions =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-04 14:29 ` [PATCH v2 2/2] emulator: fix indicator notification =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
@ 2011-08-12 7:00 ` Denis Kenzior
2011-08-15 5:32 ` Denis Kenzior
2 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2011-08-12 7:00 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2003 bytes --]
Hi Frédéric,
On 08/04/2011 09:29 AM, Frédéric Danis wrote:
> ---
> gatchat/gatserver.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> gatchat/gatserver.h | 7 +++++++
> 2 files changed, 51 insertions(+), 0 deletions(-)
>
I haven't forgotten about this patch, but I found a nasty corner case in
GAtServer that breaks the current implementation. I'm still looking for
a nice solution.
> diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
> index ab785f7..8e92071 100644
> --- a/gatchat/gatserver.c
> +++ b/gatchat/gatserver.c
> @@ -115,6 +115,9 @@ struct _GAtServer {
> gpointer user_disconnect_data; /* User disconnect data */
> GAtDebugFunc debugf; /* Debugging output function */
> gpointer debug_data; /* Data to pass to debug func */
> + GAtServerFinishFunc finishf; /* Command finish function */
> + gpointer finish_data; /* Finish func data */
> + guint finish_source;
> GHashTable *command_list; /* List of AT commands */
> GQueue *write_queue; /* Write buffer queue */
> guint max_read_attempts; /* Max reads per select */
> @@ -1177,12 +1180,27 @@ static void server_wakeup_writer(GAtServer *server)
> g_at_io_set_write_handler(server->io, can_write_data, server);
> }
>
> +static gboolean notify_finish(void *user_data)
> +{
> + GAtServer *server = user_data;
> +
> + server->finishf(server, server->finish_data);
> + server->finish_source = 0;
> +
> + return FALSE;
> +}
> +
> static void server_resume(GAtServer *server)
> {
> if (server->suspended == FALSE)
> return;
>
> server->suspended = FALSE;
> +
> + if (server->finishf)
> + server->finish_source = g_timeout_add_seconds(0, notify_finish,
> + server);
> +
> g_at_io_set_read_handler(server->io, new_bytes, server);
> }
>
<snip>
Can you brainstorm some ideas of a way not to use a g_timeout_add and do
the finish notify synchronously? I suspect there is a nice(r) solution.
Regards,
-Denis
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] emulator: fix indicator notification
2011-08-04 14:29 ` [PATCH v2 2/2] emulator: fix indicator notification =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
@ 2011-08-15 5:24 ` Denis Kenzior
0 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2011-08-15 5:24 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 288 bytes --]
Hi Frédéric,
On 08/04/2011 09:29 AM, Frédéric Danis wrote:
> ---
> src/emulator.c | 33 +++++++++++++++++++++++++++++++--
> src/voicecall.c | 11 -----------
> 2 files changed, 31 insertions(+), 13 deletions(-)
>
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] gatserver: add command finished functions
2011-08-04 14:29 [PATCH v2 1/2] gatserver: add command finished functions =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-04 14:29 ` [PATCH v2 2/2] emulator: fix indicator notification =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-12 7:00 ` [PATCH v2 1/2] gatserver: add command finished functions Denis Kenzior
@ 2011-08-15 5:32 ` Denis Kenzior
2 siblings, 0 replies; 5+ messages in thread
From: Denis Kenzior @ 2011-08-15 5:32 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 548 bytes --]
Hi Frédéric,
On 08/04/2011 09:29 AM, Frédéric Danis wrote:
> ---
> gatchat/gatserver.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> gatchat/gatserver.h | 7 +++++++
> 2 files changed, 51 insertions(+), 0 deletions(-)
>
I pushed my own version of this patch. I have performed basic testing
here on my end and it seems to be working out quite nicely. However, I
have not tested the HFP emulator proper, so could you please double
check my logic and make sure that I haven't done anything silly?
Thanks,
-Denis
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-08-15 5:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-04 14:29 [PATCH v2 1/2] gatserver: add command finished functions =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-04 14:29 ` [PATCH v2 2/2] emulator: fix indicator notification =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Danis
2011-08-15 5:24 ` Denis Kenzior
2011-08-12 7:00 ` [PATCH v2 1/2] gatserver: add command finished functions Denis Kenzior
2011-08-15 5:32 ` Denis Kenzior
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.