* [RFC PATCH 1/3] ssn: remove SSN atom
2011-02-28 16:28 [PATCH 0/3] Voice call SS notifications (2nd version) Andras Domokos
@ 2011-02-28 16:28 ` Andras Domokos
2011-02-28 16:28 ` [RFC PATCH 2/3] ssn: add code and call id to notifications Andras Domokos
` (2 subsequent siblings)
3 siblings, 0 replies; 11+ messages in thread
From: Andras Domokos @ 2011-02-28 16:28 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 12737 bytes --]
---
drivers/atmodem/ssn.c | 6 +---
include/ssn.h | 9 +++----
plugins/calypso.c | 1 -
plugins/g1.c | 1 -
plugins/huawei.c | 1 -
plugins/ifx.c | 1 -
plugins/isiusb.c | 1 -
plugins/linktop.c | 1 -
plugins/n900.c | 1 -
plugins/phonesim.c | 1 -
plugins/ste.c | 1 -
plugins/tc65.c | 1 -
plugins/u8500.c | 1 -
plugins/wavecom.c | 1 -
src/ssn.c | 59 +++++++++++++++----------------------------------
15 files changed, 24 insertions(+), 62 deletions(-)
diff --git a/drivers/atmodem/ssn.c b/drivers/atmodem/ssn.c
index b7a9df4..c927bf1 100644
--- a/drivers/atmodem/ssn.c
+++ b/drivers/atmodem/ssn.c
@@ -56,7 +56,7 @@ static void cssi_notify(GAtResult *result, gpointer user_data)
if (!g_at_result_iter_next_number(&iter, &index))
index = 0;
- ofono_ssn_cssi_notify(ssn, code1, index);
+ ofono_ssn_mo_notify(ssn, code1, index);
}
static void cssu_notify(GAtResult *result, gpointer user_data)
@@ -93,7 +93,7 @@ static void cssu_notify(GAtResult *result, gpointer user_data)
return;
out:
- ofono_ssn_cssu_notify(ssn, code2, index, &ph);
+ ofono_ssn_mt_notify(ssn, code2, index, &ph);
}
static void at_ssn_initialized(gboolean ok, GAtResult *result,
@@ -104,8 +104,6 @@ static void at_ssn_initialized(gboolean ok, GAtResult *result,
g_at_chat_register(chat, "+CSSI:", cssi_notify, FALSE, ssn, NULL);
g_at_chat_register(chat, "+CSSU:", cssu_notify, FALSE, ssn, NULL);
-
- ofono_ssn_register(ssn);
}
static int at_ssn_probe(struct ofono_ssn *ssn, unsigned int vendor,
diff --git a/include/ssn.h b/include/ssn.h
index d640cad..c8f3e0b 100644
--- a/include/ssn.h
+++ b/include/ssn.h
@@ -37,19 +37,18 @@ struct ofono_ssn_driver {
};
/* SSN notifications (CSSI and CSSU). */
-void ofono_ssn_cssi_notify(struct ofono_ssn *ssn, int code, int index);
-void ofono_ssn_cssu_notify(struct ofono_ssn *ssn, int code, int index,
+void ofono_ssn_mo_notify(struct ofono_ssn *ssn, int code, int index);
+void ofono_ssn_mt_notify(struct ofono_ssn *ssn, int code, int index,
const struct ofono_phone_number *number);
int ofono_ssn_driver_register(const struct ofono_ssn_driver *d);
void ofono_ssn_driver_unregister(const struct ofono_ssn_driver *d);
-struct ofono_ssn *ofono_ssn_create(struct ofono_modem *modem,
+struct ofono_ssn *ofono_ssn_new(struct ofono_modem *modem,
unsigned int vendor,
const char *driver, void *data);
-void ofono_ssn_register(struct ofono_ssn *ssn);
-void ofono_ssn_remove(struct ofono_ssn *ssn);
+void ofono_ssn_free(struct ofono_ssn *ssn);
void ofono_ssn_set_data(struct ofono_ssn *ssn, void *data);
void *ofono_ssn_get_data(struct ofono_ssn *ssn);
diff --git a/plugins/calypso.c b/plugins/calypso.c
index 0e29256..9c1b449 100644
--- a/plugins/calypso.c
+++ b/plugins/calypso.c
@@ -534,7 +534,6 @@ static void calypso_post_sim(struct ofono_modem *modem)
data->dlcs[NETREG_DLC]);
ofono_call_meter_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_call_barring_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
- ofono_ssn_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_call_volume_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
mw = ofono_message_waiting_create(modem);
diff --git a/plugins/g1.c b/plugins/g1.c
index 22bacdc..bccde13 100644
--- a/plugins/g1.c
+++ b/plugins/g1.c
@@ -184,7 +184,6 @@ static void g1_post_sim(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "atmodem", chat);
ofono_call_meter_create(modem, 0, "atmodem", chat);
ofono_call_barring_create(modem, 0, "atmodem", chat);
- ofono_ssn_create(modem, 0, "atmodem", chat);
ofono_sms_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem", chat);
ofono_phonebook_create(modem, 0, "atmodem", chat);
diff --git a/plugins/huawei.c b/plugins/huawei.c
index 6f05677..5be5247 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -685,7 +685,6 @@ static void huawei_post_online(struct ofono_modem *modem)
ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
- ofono_ssn_create(modem, 0, "atmodem", data->pcui);
mw = ofono_message_waiting_create(modem);
if (mw)
diff --git a/plugins/ifx.c b/plugins/ifx.c
index 527a8c4..16a2326 100644
--- a/plugins/ifx.c
+++ b/plugins/ifx.c
@@ -717,7 +717,6 @@ static void ifx_post_online(struct ofono_modem *modem)
ofono_cbs_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_ussd_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
- ofono_ssn_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_call_settings_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_call_meter_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
ofono_call_barring_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]);
diff --git a/plugins/isiusb.c b/plugins/isiusb.c
index c036604..a5edf72 100644
--- a/plugins/isiusb.c
+++ b/plugins/isiusb.c
@@ -428,7 +428,6 @@ static void isiusb_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "wgmodem2.5", isi->modem);
ofono_sms_create(modem, 0, "isimodem", isi->modem);
ofono_cbs_create(modem, 0, "isimodem", isi->modem);
- ofono_ssn_create(modem, 0, "isimodem", isi->modem);
ofono_ussd_create(modem, 0, "isimodem", isi->modem);
ofono_call_settings_create(modem, 0, "isimodem", isi->modem);
ofono_call_barring_create(modem, 0, "isimodem", isi->modem);
diff --git a/plugins/linktop.c b/plugins/linktop.c
index 2fb3896..59367d4 100644
--- a/plugins/linktop.c
+++ b/plugins/linktop.c
@@ -313,7 +313,6 @@ static void linktop_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, OFONO_VENDOR_MBM, "atmodem", data->control);
ofono_call_meter_create(modem, 0, "atmodem", data->control);
ofono_call_barring_create(modem, 0, "atmodem", data->control);
- ofono_ssn_create(modem, 0, "atmodem", data->control);
ofono_call_volume_create(modem, 0, "atmodem", data->control);
ofono_cbs_create(modem, 0, "atmodem", data->control);
diff --git a/plugins/n900.c b/plugins/n900.c
index c685266..0c92d8d 100644
--- a/plugins/n900.c
+++ b/plugins/n900.c
@@ -509,7 +509,6 @@ static void n900_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "isimodem", isi->modem);
ofono_sms_create(modem, 0, "isimodem", isi->modem);
ofono_cbs_create(modem, 0, "isimodem", isi->modem);
- ofono_ssn_create(modem, 0, "isimodem", isi->modem);
ofono_ussd_create(modem, 0, "isimodem", isi->modem);
ofono_call_settings_create(modem, 0, "isimodem", isi->modem);
ofono_call_barring_create(modem, 0, "isimodem", isi->modem);
diff --git a/plugins/phonesim.c b/plugins/phonesim.c
index 2b36fe0..9beb04e 100644
--- a/plugins/phonesim.c
+++ b/plugins/phonesim.c
@@ -651,7 +651,6 @@ static void phonesim_post_online(struct ofono_modem *modem)
ofono_call_meter_create(modem, 0, "atmodem", data->chat);
ofono_call_barring_create(modem, 0, "atmodem", data->chat);
- ofono_ssn_create(modem, 0, "atmodem", data->chat);
ofono_call_volume_create(modem, 0, "atmodem", data->chat);
if (!data->calypso)
diff --git a/plugins/ste.c b/plugins/ste.c
index b786571..bcfd33d 100644
--- a/plugins/ste.c
+++ b/plugins/ste.c
@@ -430,7 +430,6 @@ static void ste_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, OFONO_VENDOR_MBM, "atmodem", data->chat);
ofono_call_meter_create(modem, 0, "atmodem", data->chat);
ofono_call_barring_create(modem, 0, "atmodem", data->chat);
- ofono_ssn_create(modem, 0, "atmodem", data->chat);
ofono_call_volume_create(modem, 0, "atmodem", data->chat);
ofono_cbs_create(modem, 0, "atmodem", data->chat);
diff --git a/plugins/tc65.c b/plugins/tc65.c
index f58f33d..e9d6e90 100644
--- a/plugins/tc65.c
+++ b/plugins/tc65.c
@@ -208,7 +208,6 @@ static void tc65_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "atmodem", chat);
ofono_call_meter_create(modem, 0, "atmodem", chat);
ofono_call_barring_create(modem, 0, "atmodem", chat);
- ofono_ssn_create(modem, 0, "atmodem", chat);
gprs = ofono_gprs_create(modem, 0, "atmodem", chat);
gc = ofono_gprs_context_create(modem, 0, "atmodem", chat);
diff --git a/plugins/u8500.c b/plugins/u8500.c
index eb142b4..c46670f 100644
--- a/plugins/u8500.c
+++ b/plugins/u8500.c
@@ -460,7 +460,6 @@ static void u8500_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "wgmodem2.5", isi->modem);
ofono_sms_create(modem, 0, "isimodem", isi->modem);
ofono_cbs_create(modem, 0, "isimodem", isi->modem);
- ofono_ssn_create(modem, 0, "isimodem", isi->modem);
ofono_ussd_create(modem, 0, "isimodem", isi->modem);
ofono_call_settings_create(modem, 0, "isimodem", isi->modem);
ofono_call_barring_create(modem, 0, "isimodem", isi->modem);
diff --git a/plugins/wavecom.c b/plugins/wavecom.c
index cb55f85..cd9c85e 100644
--- a/plugins/wavecom.c
+++ b/plugins/wavecom.c
@@ -156,7 +156,6 @@ static void wavecom_post_sim(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "atmodem", chat);
ofono_call_meter_create(modem, 0, "atmodem", chat);
ofono_call_barring_create(modem, 0, "atmodem", chat);
- ofono_ssn_create(modem, 0, "atmodem", chat);
ofono_sms_create(modem, 0, "atmodem", chat);
ofono_phonebook_create(modem, 0, "atmodem", chat);
diff --git a/src/ssn.c b/src/ssn.c
index 64c94b7..ee48fba 100644
--- a/src/ssn.c
+++ b/src/ssn.c
@@ -45,7 +45,6 @@ struct ofono_ssn {
struct ofono_watchlist *mt_handler_list;
const struct ofono_ssn_driver *driver;
void *driver_data;
- struct ofono_atom *atom;
};
static unsigned int add_ssn_handler(struct ofono_watchlist *watchlist,
@@ -112,7 +111,7 @@ gboolean __ofono_ssn_mt_watch_remove(struct ofono_ssn *ssn, unsigned int id)
return __ofono_watchlist_remove_item(ssn->mt_handler_list, id);
}
-void ofono_ssn_cssi_notify(struct ofono_ssn *ssn, int code1, int index)
+void ofono_ssn_mo_notify(struct ofono_ssn *ssn, int code1, int index)
{
struct ssn_handler *h;
GSList *l;
@@ -127,7 +126,7 @@ void ofono_ssn_cssi_notify(struct ofono_ssn *ssn, int code1, int index)
}
}
-void ofono_ssn_cssu_notify(struct ofono_ssn *ssn, int code2, int index,
+void ofono_ssn_mt_notify(struct ofono_ssn *ssn, int code2, int index,
const struct ofono_phone_number *ph)
{
struct ssn_handler *h;
@@ -162,33 +161,7 @@ void ofono_ssn_driver_unregister(const struct ofono_ssn_driver *d)
g_drivers = g_slist_remove(g_drivers, (void *) d);
}
-static void ssn_unregister(struct ofono_atom *atom)
-{
- struct ofono_ssn *ssn = __ofono_atom_get_data(atom);
-
- __ofono_watchlist_free(ssn->mo_handler_list);
- ssn->mo_handler_list = NULL;
-
- __ofono_watchlist_free(ssn->mt_handler_list);
- ssn->mt_handler_list = NULL;
-}
-
-static void ssn_remove(struct ofono_atom *atom)
-{
- struct ofono_ssn *ssn = __ofono_atom_get_data(atom);
-
- DBG("atom: %p", atom);
-
- if (ssn == NULL)
- return;
-
- if (ssn->driver && ssn->driver->remove)
- ssn->driver->remove(ssn);
-
- g_free(ssn);
-}
-
-struct ofono_ssn *ofono_ssn_create(struct ofono_modem *modem,
+struct ofono_ssn *ofono_ssn_new(struct ofono_modem *modem,
unsigned int vendor,
const char *driver,
void *data)
@@ -204,9 +177,6 @@ struct ofono_ssn *ofono_ssn_create(struct ofono_modem *modem,
if (ssn == NULL)
return NULL;
- ssn->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_SSN,
- ssn_remove, ssn);
-
for (l = g_drivers; l; l = l->next) {
const struct ofono_ssn_driver *drv = l->data;
@@ -220,20 +190,27 @@ struct ofono_ssn *ofono_ssn_create(struct ofono_modem *modem,
break;
}
- return ssn;
-}
-
-void ofono_ssn_register(struct ofono_ssn *ssn)
-{
ssn->mo_handler_list = __ofono_watchlist_new(g_free);
ssn->mt_handler_list = __ofono_watchlist_new(g_free);
- __ofono_atom_register(ssn->atom, ssn_unregister);
+ return ssn;
}
-void ofono_ssn_remove(struct ofono_ssn *ssn)
+void ofono_ssn_free(struct ofono_ssn *ssn)
{
- __ofono_atom_free(ssn->atom);
+ if (ssn == NULL)
+ return;
+
+ if (ssn->driver && ssn->driver->remove)
+ ssn->driver->remove(ssn);
+
+ __ofono_watchlist_free(ssn->mo_handler_list);
+ ssn->mo_handler_list = NULL;
+
+ __ofono_watchlist_free(ssn->mt_handler_list);
+ ssn->mt_handler_list = NULL;
+
+ g_free(ssn);
}
void ofono_ssn_set_data(struct ofono_ssn *ssn, void *data)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 11+ messages in thread* [RFC PATCH 2/3] ssn: add code and call id to notifications
2011-02-28 16:28 [PATCH 0/3] Voice call SS notifications (2nd version) Andras Domokos
2011-02-28 16:28 ` [RFC PATCH 1/3] ssn: remove SSN atom Andras Domokos
@ 2011-02-28 16:28 ` Andras Domokos
2011-02-28 22:19 ` Denis Kenzior
2011-02-28 16:28 ` [RFC PATCH 3/3] voicecall: add SSN notifications handling Andras Domokos
2011-03-10 8:33 ` Setting PDP mode claudio
3 siblings, 1 reply; 11+ messages in thread
From: Andras Domokos @ 2011-02-28 16:28 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3640 bytes --]
---
drivers/atmodem/ssn.c | 4 ++--
include/ssn.h | 7 ++++---
src/ofono.h | 5 +++--
src/ssn.c | 11 ++++++-----
4 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/drivers/atmodem/ssn.c b/drivers/atmodem/ssn.c
index c927bf1..ba8f89a 100644
--- a/drivers/atmodem/ssn.c
+++ b/drivers/atmodem/ssn.c
@@ -56,7 +56,7 @@ static void cssi_notify(GAtResult *result, gpointer user_data)
if (!g_at_result_iter_next_number(&iter, &index))
index = 0;
- ofono_ssn_mo_notify(ssn, code1, index);
+ ofono_ssn_mo_notify(ssn, 0, code1, index);
}
static void cssu_notify(GAtResult *result, gpointer user_data)
@@ -93,7 +93,7 @@ static void cssu_notify(GAtResult *result, gpointer user_data)
return;
out:
- ofono_ssn_mt_notify(ssn, code2, index, &ph);
+ ofono_ssn_mt_notify(ssn, 0, code2, index, &ph);
}
static void at_ssn_initialized(gboolean ok, GAtResult *result,
diff --git a/include/ssn.h b/include/ssn.h
index c8f3e0b..4f41bae 100644
--- a/include/ssn.h
+++ b/include/ssn.h
@@ -37,9 +37,10 @@ struct ofono_ssn_driver {
};
/* SSN notifications (CSSI and CSSU). */
-void ofono_ssn_mo_notify(struct ofono_ssn *ssn, int code, int index);
-void ofono_ssn_mt_notify(struct ofono_ssn *ssn, int code, int index,
- const struct ofono_phone_number *number);
+void ofono_ssn_mo_notify(struct ofono_ssn *ssn, unsigned int id,
+ int code1, int index);
+void ofono_ssn_mt_notify(struct ofono_ssn *ssn, unsigned int id, int code2,
+ int index, const struct ofono_phone_number *number);
int ofono_ssn_driver_register(const struct ofono_ssn_driver *d);
void ofono_ssn_driver_unregister(const struct ofono_ssn_driver *d);
diff --git a/src/ofono.h b/src/ofono.h
index 4e298f1..4af6f86 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -346,8 +346,9 @@ int __ofono_sms_sim_download(struct ofono_stk *stk, const struct sms *msg,
#include <ofono/ssn.h>
-typedef void (*ofono_ssn_mo_notify_cb)(int index, void *user);
-typedef void (*ofono_ssn_mt_notify_cb)(int index,
+typedef void (*ofono_ssn_mo_notify_cb)(unsigned int id, int code1, int index,
+ void *user);
+typedef void (*ofono_ssn_mt_notify_cb)(unsigned int id, int code2, int index,
const struct ofono_phone_number *ph,
void *user);
diff --git a/src/ssn.c b/src/ssn.c
index ee48fba..383114c 100644
--- a/src/ssn.c
+++ b/src/ssn.c
@@ -111,7 +111,8 @@ gboolean __ofono_ssn_mt_watch_remove(struct ofono_ssn *ssn, unsigned int id)
return __ofono_watchlist_remove_item(ssn->mt_handler_list, id);
}
-void ofono_ssn_mo_notify(struct ofono_ssn *ssn, int code1, int index)
+void ofono_ssn_mo_notify(struct ofono_ssn *ssn, unsigned int id,
+ int code1, int index)
{
struct ssn_handler *h;
GSList *l;
@@ -122,12 +123,12 @@ void ofono_ssn_mo_notify(struct ofono_ssn *ssn, int code1, int index)
notify = h->item.notify;
if (h->code == code1)
- notify(index, h->item.notify_data);
+ notify(id, code1, index, h->item.notify_data);
}
}
-void ofono_ssn_mt_notify(struct ofono_ssn *ssn, int code2, int index,
- const struct ofono_phone_number *ph)
+void ofono_ssn_mt_notify(struct ofono_ssn *ssn, unsigned int id, int code2,
+ int index, const struct ofono_phone_number *ph)
{
struct ssn_handler *h;
GSList *l;
@@ -138,7 +139,7 @@ void ofono_ssn_mt_notify(struct ofono_ssn *ssn, int code2, int index,
notify = h->item.notify;
if (h->code == code2)
- notify(index, ph, h->item.notify_data);
+ notify(id, code2, index, ph, h->item.notify_data);
}
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 11+ messages in thread* [RFC PATCH 3/3] voicecall: add SSN notifications handling
2011-02-28 16:28 [PATCH 0/3] Voice call SS notifications (2nd version) Andras Domokos
2011-02-28 16:28 ` [RFC PATCH 1/3] ssn: remove SSN atom Andras Domokos
2011-02-28 16:28 ` [RFC PATCH 2/3] ssn: add code and call id to notifications Andras Domokos
@ 2011-02-28 16:28 ` Andras Domokos
2011-03-10 8:33 ` Setting PDP mode claudio
3 siblings, 0 replies; 11+ messages in thread
From: Andras Domokos @ 2011-02-28 16:28 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 9388 bytes --]
---
include/types.h | 2 +
src/voicecall.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 239 insertions(+), 3 deletions(-)
diff --git a/include/types.h b/include/types.h
index d25f409..b639c8a 100644
--- a/include/types.h
+++ b/include/types.h
@@ -96,6 +96,8 @@ struct ofono_call {
char name[OFONO_MAX_CALLER_NAME_LENGTH + 1];
int clip_validity;
int cnap_validity;
+ ofono_bool_t remote_held;
+ ofono_bool_t remote_multiparty;
};
struct ofono_network_time {
diff --git a/src/voicecall.c b/src/voicecall.c
index d6e8539..1fa9f41 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -53,6 +53,14 @@ struct ofono_voicecall {
struct ofono_sim_context *sim_context;
unsigned int sim_watch;
unsigned int sim_state_watch;
+ struct ofono_ssn *ssn;
+ unsigned int ssn_mt_fwd_watch;
+ unsigned int ssn_mt_hold_watch;
+ unsigned int ssn_mt_unhold_watch;
+ unsigned int ssn_mt_mpty_watch;
+ unsigned int ssn_mo_fwd_watch;
+ unsigned int ssn_mo_local_bar_watch;
+ unsigned int ssn_mo_remote_bar_watch;
const struct ofono_voicecall_driver *driver;
void *driver_data;
struct ofono_atom *atom;
@@ -400,6 +408,12 @@ static void append_voicecall_properties(struct voicecall *v,
ofono_dbus_dict_append(dict, "Multiparty", DBUS_TYPE_BOOLEAN, &mpty);
+ ofono_dbus_dict_append(dict, "RemoteHeld", DBUS_TYPE_BOOLEAN,
+ &call->remote_held);
+
+ ofono_dbus_dict_append(dict, "RemoteMultiparty", DBUS_TYPE_BOOLEAN,
+ &call->remote_multiparty);
+
if (v->message)
ofono_dbus_dict_append(dict, "Information",
DBUS_TYPE_STRING, &v->message);
@@ -1869,9 +1883,11 @@ static GDBusMethodTable manager_methods[] = {
};
static GDBusSignalTable manager_signals[] = {
- { "PropertyChanged", "sv" },
- { "CallAdded", "oa{sv}" },
- { "CallRemoved", "o" },
+ { "Forwarded", "s" },
+ { "BarringActive", "s" },
+ { "PropertyChanged", "sv" },
+ { "CallAdded", "oa{sv}" },
+ { "CallRemoved", "o" },
{ }
};
@@ -2169,6 +2185,46 @@ void ofono_voicecall_driver_unregister(const struct ofono_voicecall_driver *d)
g_drivers = g_slist_remove(g_drivers, (void *) d);
}
+static void voicecall_ssn_watches_remove(struct ofono_voicecall *vc)
+{
+ if (vc->ssn_mt_fwd_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn, vc->ssn_mt_fwd_watch);
+ vc->ssn_mt_fwd_watch = 0;
+ }
+
+ if (vc->ssn_mt_hold_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn, vc->ssn_mt_hold_watch);
+ vc->ssn_mt_hold_watch = 0;
+ }
+
+ if (vc->ssn_mt_unhold_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn, vc->ssn_mt_unhold_watch);
+ vc->ssn_mt_unhold_watch = 0;
+ }
+
+ if (vc->ssn_mt_mpty_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn, vc->ssn_mt_mpty_watch);
+ vc->ssn_mt_mpty_watch = 0;
+ }
+
+ if (vc->ssn_mo_fwd_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn, vc->ssn_mo_fwd_watch);
+ vc->ssn_mo_fwd_watch = 0;
+ }
+
+ if (vc->ssn_mo_local_bar_watch) {
+ __ofono_ssn_mt_watch_remove(vc->ssn,
+ vc->ssn_mo_local_bar_watch);
+ vc->ssn_mo_local_bar_watch = 0;
+ }
+
+ if (vc->ssn_mo_remote_bar_watch) {
+ __ofono_ssn_mo_watch_remove(vc->ssn,
+ vc->ssn_mo_remote_bar_watch);
+ vc->ssn_mo_remote_bar_watch = 0;
+ }
+}
+
static void voicecall_unregister(struct ofono_atom *atom)
{
DBusConnection *conn = ofono_dbus_get_connection();
@@ -2182,6 +2238,9 @@ static void voicecall_unregister(struct ofono_atom *atom)
vc->sim_watch = 0;
}
+ if (vc->ssn)
+ voicecall_ssn_watches_remove(vc);
+
if (vc->dial_req)
dial_request_finish(vc);
@@ -2239,6 +2298,11 @@ static void voicecall_remove(struct ofono_atom *atom)
g_queue_free(vc->toneq);
}
+ if (vc->ssn) {
+ ofono_ssn_free(vc->ssn);
+ vc->ssn = NULL;
+ }
+
g_free(vc);
}
@@ -2258,6 +2322,8 @@ struct ofono_voicecall *ofono_voicecall_create(struct ofono_modem *modem,
if (vc == NULL)
return NULL;
+ vc->ssn = ofono_ssn_new(modem, vendor, driver, data);
+
vc->toneq = g_queue_new();
vc->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_VOICECALL,
@@ -2351,6 +2417,171 @@ static void sim_watch(struct ofono_atom *atom,
sim_state_watch(ofono_sim_get_state(sim), vc);
}
+static void ssn_mt_forwarded_notify(unsigned int id, int code1, int idx,
+ const struct ofono_phone_number *ph,
+ void *data)
+{
+ struct ofono_voicecall *vc = data;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(vc->atom);
+ char *info = "incoming";
+
+ g_dbus_emit_signal(conn, path, OFONO_VOICECALL_MANAGER_INTERFACE,
+ "Forwarded",
+ DBUS_TYPE_STRING, &info,
+ DBUS_TYPE_INVALID);
+}
+
+static struct voicecall *voicecall_select(struct ofono_voicecall *vc,
+ unsigned int id, int code)
+{
+ struct voicecall *v = NULL;
+ GSList *l;
+
+ for (l = vc->call_list; l; l = l->next) {
+ struct voicecall *v1 = l->data;
+
+ if (id == 0 && g_slist_length(vc->call_list) == 1) {
+ if (code == SS_MT_VOICECALL_RETRIEVED &&
+ v1->call->remote_held == TRUE) {
+ v = v1;
+ break;
+ } else if (code == SS_MT_VOICECALL_ON_HOLD &&
+ v1->call->remote_held == FALSE) {
+ v = v1;
+ break;
+ } else if (code == SS_MT_MULTIPARTY_VOICECALL &&
+ v1->call->remote_multiparty == FALSE) {
+ v = v1;
+ break;
+ }
+ } else if (v1->call->id == id) {
+ v = v1;
+ break;
+ }
+ }
+
+ return v;
+}
+
+static void ssn_mt_remote_held_notify(unsigned int id, int code1, int idx,
+ const struct ofono_phone_number *ph,
+ void *data)
+{
+ struct ofono_voicecall *vc = data;
+ struct voicecall *v = voicecall_select(vc, id, code1);
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path;
+
+ if (v == NULL)
+ return;
+
+ if (code1 == SS_MT_VOICECALL_ON_HOLD)
+ v->call->remote_held = TRUE;
+ else
+ v->call->remote_held = FALSE;
+
+ path = voicecall_build_path(vc, v->call);
+
+ ofono_dbus_signal_property_changed(conn, path,
+ OFONO_VOICECALL_INTERFACE,
+ "RemoteHeld", DBUS_TYPE_BOOLEAN,
+ &v->call->remote_held);
+}
+
+static void ssn_mt_remote_multiparty_notify(unsigned int id, int code1, int idx,
+ const struct ofono_phone_number *ph,
+ void *data)
+{
+ struct ofono_voicecall *vc = data;
+ struct voicecall *v = voicecall_select(vc, id, code1);
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path;
+
+ if (v == NULL)
+ return;
+
+ v->call->remote_multiparty = TRUE;
+
+ path = voicecall_build_path(vc, v->call);
+
+ ofono_dbus_signal_property_changed(conn, path,
+ OFONO_VOICECALL_INTERFACE,
+ "RemoteMultiparty", DBUS_TYPE_BOOLEAN,
+ &v->call->remote_multiparty);
+}
+
+static void ssn_mo_call_barred_notify(unsigned int id, int code2,
+ int idx, void *data)
+{
+ struct ofono_voicecall *vc = data;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(vc->atom);
+ const char *info;
+
+ if (code2 == SS_MO_INCOMING_BARRING)
+ info = "remote";
+ else
+ info = "local";
+
+ g_dbus_emit_signal(conn, path, OFONO_VOICECALL_MANAGER_INTERFACE,
+ "BarringActive",
+ DBUS_TYPE_STRING, &info,
+ DBUS_TYPE_INVALID);
+}
+
+static void ssn_mo_forwarded_notify(unsigned int id, int code2,
+ int idx, void *data)
+{
+ struct ofono_voicecall *vc = data;
+ DBusConnection *conn = ofono_dbus_get_connection();
+ const char *path = __ofono_atom_get_path(vc->atom);
+ char *info = "outgoing";
+
+ g_dbus_emit_signal(conn, path, OFONO_VOICECALL_MANAGER_INTERFACE,
+ "Forwarded",
+ DBUS_TYPE_STRING, &info,
+ DBUS_TYPE_INVALID);
+}
+
+static void voicecall_ssn_watches_add(struct ofono_voicecall *vc)
+{
+ vc->ssn_mt_fwd_watch = __ofono_ssn_mt_watch_add(vc->ssn,
+ SS_MT_CALL_FORWARDED,
+ ssn_mt_forwarded_notify,
+ vc, NULL);
+
+ vc->ssn_mt_hold_watch = __ofono_ssn_mt_watch_add(vc->ssn,
+ SS_MT_VOICECALL_ON_HOLD,
+ ssn_mt_remote_held_notify,
+ vc, NULL);
+
+ vc->ssn_mt_unhold_watch = __ofono_ssn_mt_watch_add(vc->ssn,
+ SS_MT_VOICECALL_RETRIEVED,
+ ssn_mt_remote_held_notify,
+ vc, NULL);
+
+ vc->ssn_mt_mpty_watch = __ofono_ssn_mt_watch_add(vc->ssn,
+ SS_MT_MULTIPARTY_VOICECALL,
+ ssn_mt_remote_multiparty_notify,
+ vc, NULL);
+
+ vc->ssn_mo_fwd_watch = __ofono_ssn_mo_watch_add(vc->ssn,
+ SS_MO_CALL_FORWARDED,
+ ssn_mo_forwarded_notify,
+ vc, NULL);
+
+ vc->ssn_mo_local_bar_watch = __ofono_ssn_mo_watch_add(vc->ssn,
+ SS_MO_OUTGOING_BARRING,
+ ssn_mo_call_barred_notify,
+ vc, NULL);
+
+ vc->ssn_mo_remote_bar_watch = __ofono_ssn_mo_watch_add(vc->ssn,
+ SS_MO_INCOMING_BARRING,
+ ssn_mo_call_barred_notify,
+ vc, NULL);
+}
+
void ofono_voicecall_register(struct ofono_voicecall *vc)
{
DBusConnection *conn = ofono_dbus_get_connection();
@@ -2377,6 +2608,9 @@ void ofono_voicecall_register(struct ofono_voicecall *vc)
add_to_en_list(&vc->en_list, default_en_list_no_sim);
add_to_en_list(&vc->en_list, default_en_list);
+ if (vc->ssn != NULL)
+ voicecall_ssn_watches_add(vc);
+
vc->sim_watch = __ofono_modem_add_atom_watch(modem,
OFONO_ATOM_TYPE_SIM,
sim_watch, vc, NULL);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 11+ messages in thread