diff options
Diffstat (limited to 'telephony-binding')
-rw-r--r-- | telephony-binding/gdbus/ofono_voicecallmanager.c | 64 | ||||
-rw-r--r-- | telephony-binding/gdbus/ofono_voicecallmanager.h | 7 | ||||
-rw-r--r-- | telephony-binding/telephony-binding.c | 33 |
3 files changed, 92 insertions, 12 deletions
diff --git a/telephony-binding/gdbus/ofono_voicecallmanager.c b/telephony-binding/gdbus/ofono_voicecallmanager.c index 2beadc0..aab4f69 100644 --- a/telephony-binding/gdbus/ofono_voicecallmanager.c +++ b/telephony-binding/gdbus/ofono_voicecallmanager.c @@ -14,9 +14,10 @@ * limitations under the License. */ +#define _GNU_SOURCE + #include <string.h> -#define _GNU_SOURCE #include <afb/afb-binding.h> #include "ofono_voicecallmanager_interface.h" @@ -30,26 +31,38 @@ static void call_added(OrgOfonoVoiceCallManager *manager, GVariantIter *iter; gchar *key; GVariant *value; - const gchar *state, *clip = NULL; + const gchar *state, *cl = NULL; g_variant_get(properties, "a{sv}", &iter); while (g_variant_iter_loop(iter, "{sv}", &key, &value)) { - if (!strcmp(key, "State")) + if (!strcmp(key, "State")) { state = g_variant_get_string(value, NULL); - else if (!strcmp(key, "LineIdentification")) { - clip = g_variant_get_string(value, NULL); + } else if (!strcmp(key, "LineIdentification")) { + cl = g_variant_get_string(value, NULL); } } if (!strcmp(state, "incoming")) { - g_signal_emit_by_name(manager, "incoming-call", op, clip ? clip : ""); + g_signal_emit_by_name(manager, "incoming-call", op, cl ? cl : ""); + } else if (!strcmp(state, "dialing")) { + g_signal_emit_by_name(manager, "dialing-call", op, cl ? cl : ""); } } +static void call_removed(OrgOfonoVoiceCallManager *manager, + gchar *op, + GVariant *properties) +{ + g_signal_emit_by_name(manager, "terminated-call", op); +} + + const OrgOfonoVoiceCallManager *ofono_voicecallmanager_init(const struct afb_binding_interface *iface, const gchar *op, - void (*incoming_call)(OrgOfonoVoiceCallManager *manager,gchar *)) + void (*incoming_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *), + void (*dialing_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *), + void (*terminated_call)(OrgOfonoVoiceCallManager *manager,gchar *)) { interface = iface; @@ -69,14 +82,49 @@ const OrgOfonoVoiceCallManager G_TYPE_STRING, G_TYPE_STRING); + g_signal_new("dialing-call", + G_TYPE_OBJECT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 2, + G_TYPE_STRING, + G_TYPE_STRING); + + g_signal_new("terminated-call", + G_TYPE_OBJECT, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + if (g_signal_connect(G_OBJECT(manager), "incoming-call", G_CALLBACK(incoming_call), NULL) <= 0) { - ERROR(interface, "Failed to connect to signal call-added\n"); + ERROR(interface, "Failed to connect to signal incoming-call\n"); + } + + if (g_signal_connect(G_OBJECT(manager), "dialing-call", G_CALLBACK(dialing_call), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal dialing-call\n"); + } + + if (g_signal_connect(G_OBJECT(manager), "terminated-call", G_CALLBACK(terminated_call), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal terminated-call\n"); } if (g_signal_connect(manager, "call-added", G_CALLBACK(call_added), NULL) <= 0) { ERROR(interface, "Failed to connect to signal call-added\n"); } + if (g_signal_connect(manager, "call-removed", G_CALLBACK(call_removed), NULL) <= 0) { + ERROR(interface, "Failed to connect to signal call-removed\n"); + } + return manager; } diff --git a/telephony-binding/gdbus/ofono_voicecallmanager.h b/telephony-binding/gdbus/ofono_voicecallmanager.h index a5c3ae1..19ec509 100644 --- a/telephony-binding/gdbus/ofono_voicecallmanager.h +++ b/telephony-binding/gdbus/ofono_voicecallmanager.h @@ -18,6 +18,11 @@ #include "ofono_voicecallmanager_interface.h" -OrgOfonoVoiceCallManager *ofono_voicecallmanager_init(const struct afb_binding_interface *iface, const gchar *, void(*)(OrgOfonoVoiceCallManager *manager, gchar *, gchar *)); +OrgOfonoVoiceCallManager +*ofono_voicecallmanager_init(const struct afb_binding_interface *, + const gchar *, + void(*)(OrgOfonoVoiceCallManager *, gchar *, gchar *), + void(*)(OrgOfonoVoiceCallManager *, gchar *, gchar *), + void(*)(OrgOfonoVoiceCallManager *, gchar *)); gchar *ofono_voicecallmanager_dial(OrgOfonoVoiceCallManager *, gchar *, gchar *); void ofono_hangup_all(OrgOfonoVoiceCallManager *); diff --git a/telephony-binding/telephony-binding.c b/telephony-binding/telephony-binding.c index 6edecd3..bf618ce 100644 --- a/telephony-binding/telephony-binding.c +++ b/telephony-binding/telephony-binding.c @@ -78,11 +78,35 @@ static void hangup(struct afb_req request) } -static void incoming_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *clip) { - WARNING(interface, "Incoming call from %s\n", clip); +static void incoming_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *clip) +{ + struct json_object *call_info; + + call_info = json_object_new_object(); + json_object_object_add(call_info, "clip", json_object_new_string(clip)); + afb_daemon_broadcast_event(interface->daemon, "incomingCall", call_info); incoming_call = strdup(op); } +static void dialing_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op, gchar *colp) +{ + struct json_object *call_info; + + call_info = json_object_new_object(); + json_object_object_add(call_info, "colp", json_object_new_string(colp)); + afb_daemon_broadcast_event(interface->daemon, "dialingCall", call_info); +} + +static void terminated_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op) +{ + if (incoming_call) { + free(incoming_call); + incoming_call = NULL; + } + + afb_daemon_broadcast_event(interface->daemon, "terminatedCall", NULL); +} + static void *main_loop_thread(void *unused) { GMainLoop *loop = g_main_loop_new(NULL, FALSE); @@ -101,7 +125,10 @@ static int ofono_init(void) ofono_manager_init(interface); const gchar *modem_path = ofono_manager_get_default_modem_path(); DEBUG(interface, "modem_path: %s\n", modem_path); - vcm = ofono_voicecallmanager_init(interface, modem_path, incoming_call_cb); + vcm = ofono_voicecallmanager_init(interface, modem_path, + incoming_call_cb, + dialing_call_cb, + terminated_call_cb); if (!vcm) { ERROR(interface, "Failed to initialize voice call manager\n"); ret = -1; |