mirror of git://git.sysmocom.de/ofono
isi/voicecall: add call id to queued requests
This commit is contained in:
parent
fe28e6cd05
commit
eb3af79700
|
@ -80,41 +80,62 @@ enum {
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* Request context for voicecall cb */
|
/* Request context for voicecall cb */
|
||||||
|
|
||||||
struct isi_call_req_context;
|
typedef void isi_call_req_step(struct isi_call_req_context *,
|
||||||
|
int id, int status);
|
||||||
typedef void isi_call_req_step(struct isi_call_req_context *, int reason);
|
|
||||||
|
|
||||||
struct isi_call_req_context {
|
struct isi_call_req_context {
|
||||||
struct isi_call_req_context *next, **prev;
|
struct isi_call_req_context *next;
|
||||||
|
struct isi_call_req_context **prev;
|
||||||
isi_call_req_step *step;
|
isi_call_req_step *step;
|
||||||
|
int id;
|
||||||
struct ofono_voicecall *ovc;
|
struct ofono_voicecall *ovc;
|
||||||
ofono_voicecall_cb_t cb;
|
ofono_voicecall_cb_t cb;
|
||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct isi_call_req_context *
|
static struct isi_call_req_context *isi_call_req_new(
|
||||||
isi_call_req(struct ofono_voicecall *ovc,
|
struct ofono_voicecall *ovc,
|
||||||
void const *restrict req,
|
ofono_voicecall_cb_t cb,
|
||||||
size_t len,
|
void *data)
|
||||||
GIsiResponse *handler,
|
|
||||||
ofono_voicecall_cb_t cb, void *data)
|
|
||||||
{
|
{
|
||||||
struct isi_voicecall *ivc;
|
|
||||||
struct isi_call_req_context *irc;
|
struct isi_call_req_context *irc;
|
||||||
|
|
||||||
ivc = ofono_voicecall_get_data(ovc);
|
|
||||||
|
|
||||||
irc = g_try_new0(struct isi_call_req_context, 1);
|
irc = g_try_new0(struct isi_call_req_context, 1);
|
||||||
|
if (irc == NULL)
|
||||||
|
goto failed;
|
||||||
|
|
||||||
if (irc) {
|
|
||||||
irc->ovc = ovc;
|
irc->ovc = ovc;
|
||||||
irc->cb = cb;
|
irc->cb = cb;
|
||||||
irc->data = data;
|
irc->data = data;
|
||||||
|
|
||||||
if (g_isi_request_make(ivc->client, req, len,
|
|
||||||
ISI_CALL_TIMEOUT, handler, irc))
|
|
||||||
return irc;
|
return irc;
|
||||||
}
|
|
||||||
|
failed:
|
||||||
|
if (cb)
|
||||||
|
CALLBACK_WITH_FAILURE(cb, data);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct isi_call_req_context *isi_call_req(struct ofono_voicecall *ovc,
|
||||||
|
void const *restrict req,
|
||||||
|
size_t len,
|
||||||
|
GIsiResponse *handler,
|
||||||
|
ofono_voicecall_cb_t cb,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct isi_voicecall *ivc;
|
||||||
|
struct isi_call_req_context *irc;
|
||||||
|
|
||||||
|
irc = isi_call_req_new(ovc, cb, data);
|
||||||
|
if (irc == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ivc = ofono_voicecall_get_data(ovc);
|
||||||
|
|
||||||
|
if (g_isi_send(ivc->client, req, len,
|
||||||
|
ISI_CALL_TIMEOUT, handler, irc, NULL))
|
||||||
|
return irc;
|
||||||
|
|
||||||
g_free(irc);
|
g_free(irc);
|
||||||
|
|
||||||
|
@ -125,7 +146,8 @@ isi_call_req(struct ofono_voicecall *ovc,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void isi_ctx_queue(struct isi_call_req_context *irc,
|
static void isi_ctx_queue(struct isi_call_req_context *irc,
|
||||||
isi_call_req_step *next)
|
isi_call_req_step *next,
|
||||||
|
int id)
|
||||||
{
|
{
|
||||||
if (irc->prev == NULL) {
|
if (irc->prev == NULL) {
|
||||||
struct isi_voicecall *ivc = ofono_voicecall_get_data(irc->ovc);
|
struct isi_voicecall *ivc = ofono_voicecall_get_data(irc->ovc);
|
||||||
|
@ -139,6 +161,7 @@ static void isi_ctx_queue(struct isi_call_req_context *irc,
|
||||||
}
|
}
|
||||||
|
|
||||||
irc->step = next;
|
irc->step = next;
|
||||||
|
irc->id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void isi_ctx_remove(struct isi_call_req_context *irc)
|
static void isi_ctx_remove(struct isi_call_req_context *irc)
|
||||||
|
@ -187,7 +210,7 @@ static gboolean isi_ctx_return_failure(struct isi_call_req_context *irc)
|
||||||
static gboolean isi_ctx_return_success(struct isi_call_req_context *irc)
|
static gboolean isi_ctx_return_success(struct isi_call_req_context *irc)
|
||||||
{
|
{
|
||||||
if (irc && irc->step) {
|
if (irc && irc->step) {
|
||||||
irc->step(irc, 0);
|
irc->step(irc, 0, 0);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,7 +333,7 @@ static void isi_call_notify(struct ofono_voicecall *ovc,
|
||||||
call_status_name(call->status), call->status);
|
call_status_name(call->status), call->status);
|
||||||
|
|
||||||
for (queue = &ivc->queue; (irc = *queue);) {
|
for (queue = &ivc->queue; (irc = *queue);) {
|
||||||
irc->step(irc, call->status);
|
irc->step(irc, call->id, call->status);
|
||||||
|
|
||||||
if (*queue == irc)
|
if (*queue == irc)
|
||||||
queue = &irc->next;
|
queue = &irc->next;
|
||||||
|
@ -1063,18 +1086,19 @@ static void isi_release_all_active(struct ofono_voicecall *ovc,
|
||||||
if (irc == NULL)
|
if (irc == NULL)
|
||||||
;
|
;
|
||||||
else if (waiting)
|
else if (waiting)
|
||||||
isi_ctx_queue(irc, isi_wait_and_answer);
|
isi_ctx_queue(irc, isi_wait_and_answer, 0);
|
||||||
else if (hold)
|
else if (hold)
|
||||||
isi_ctx_queue(irc, isi_wait_and_retrieve);
|
isi_ctx_queue(irc, isi_wait_and_retrieve, 0);
|
||||||
} else
|
} else
|
||||||
CALLBACK_WITH_FAILURE(cb, data);
|
CALLBACK_WITH_FAILURE(cb, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void isi_wait_and_answer(struct isi_call_req_context *irc,
|
static void isi_wait_and_answer(struct isi_call_req_context *irc,
|
||||||
int event)
|
int id, int status)
|
||||||
{
|
{
|
||||||
DBG("irc=%p event=%u", (void *)irc, event);
|
DBG("irc=%p id=%d status=%d", (void *)irc, id, status);
|
||||||
switch (event) {
|
|
||||||
|
switch (status) {
|
||||||
case CALL_STATUS_TERMINATED:
|
case CALL_STATUS_TERMINATED:
|
||||||
isi_answer(irc->ovc, irc->cb, irc->data);
|
isi_answer(irc->ovc, irc->cb, irc->data);
|
||||||
isi_ctx_free(irc);
|
isi_ctx_free(irc);
|
||||||
|
@ -1083,10 +1107,11 @@ static void isi_wait_and_answer(struct isi_call_req_context *irc,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void isi_wait_and_retrieve(struct isi_call_req_context *irc,
|
static void isi_wait_and_retrieve(struct isi_call_req_context *irc,
|
||||||
int event)
|
int id, int status)
|
||||||
{
|
{
|
||||||
DBG("irc=%p event=%u", (void *)irc, event);
|
DBG("irc=%p id=%u status=%u", (void *)irc, id, status);
|
||||||
switch (event) {
|
|
||||||
|
switch (status) {
|
||||||
case CALL_STATUS_TERMINATED:
|
case CALL_STATUS_TERMINATED:
|
||||||
isi_retrieve(irc->ovc, irc->cb, irc->data);
|
isi_retrieve(irc->ovc, irc->cb, irc->data);
|
||||||
isi_ctx_free(irc);
|
isi_ctx_free(irc);
|
||||||
|
|
Loading…
Reference in New Issue