diff options
author | Matt Ranostay <matt.ranostay@konsulko.com> | 2018-09-18 12:46:07 -0700 |
---|---|---|
committer | Matt Ranostay <matt.ranostay@konsulko.com> | 2018-09-27 15:03:37 +0800 |
commit | 0431f094462535d01fce3279f71c86d7786d0b17 (patch) | |
tree | 3e3834d0d3f9264fa2d70bfe8e2d81b0b5159895 /telephony-binding/telephony-binding.c | |
parent | 82eaa8b3bc8a50fe1639b3c880679ee0aad5711f (diff) |
phone: remove telephony binding from package
Telephony binding needs to be split into own package, and this requires
it to be removed from the phone application
Bug-AGL: SPEC-1757
Change-Id: Ida29d47abbe254a531d69cce33433cce877e1cf2
Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'telephony-binding/telephony-binding.c')
-rw-r--r-- | telephony-binding/telephony-binding.c | 370 |
1 files changed, 0 insertions, 370 deletions
diff --git a/telephony-binding/telephony-binding.c b/telephony-binding/telephony-binding.c deleted file mode 100644 index f6db061..0000000 --- a/telephony-binding/telephony-binding.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) 2017-2018 Konsulko Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define _GNU_SOURCE - -#include <glib.h> -#include <json-c/json.h> -#include <string.h> - -#define AFB_BINDING_VERSION 2 -#include <afb/afb-binding.h> - -#include "ofono_manager.h" -#include "ofono_voicecallmanager.h" -#include "ofono_voicecall.h" - -static OrgOfonoVoiceCallManager *vcm; -static OrgOfonoVoiceCall *incoming_call, *voice_call; -static struct afb_event call_state_changed_event; -static struct afb_event dialing_call_event; -static struct afb_event incoming_call_event; -static struct afb_event terminated_call_event; - -static void dial(struct afb_req request) -{ - struct json_object *query, *val; - const char *number; - - query = afb_req_json(request); - json_object_object_get_ex(query, "value", &val); - if (json_object_is_type(val, json_type_string)) { - number = json_object_get_string(val); - if (voice_call) { - AFB_ERROR("dial: cannot dial with active call"); - afb_req_fail(request, "active call", NULL); - } else { - AFB_DEBUG("dial: %s...\n", number); - if (ofono_voicecallmanager_dial(vcm, (gchar *)number, "")) { - afb_req_success(request, NULL, NULL); - } else { - AFB_ERROR("dial: failed to dial number\n"); - afb_req_fail(request, "failed dial", NULL); - } - } - } else { - AFB_ERROR("dial: no phone number parameter\n"); - afb_req_fail(request, "no number", NULL); - } -} - -static void hangup(struct afb_req request) -{ - if (voice_call) { - AFB_DEBUG("Hangup voice call\n"); - ofono_voicecall_hangup(voice_call); - afb_req_success(request, NULL, NULL); - } else if (incoming_call) { - AFB_DEBUG("Reject incoming call\n"); - ofono_voicecall_hangup(incoming_call); - afb_req_success(request, NULL, NULL); - } else { - AFB_ERROR("Hangup: no active call"); - afb_req_fail(request, "failed hangup", NULL); - } -} - -static void answer(struct afb_req request) -{ - if (incoming_call) { - AFB_DEBUG("Answer voice call\n"); - voice_call = incoming_call; - ofono_voicecall_answer(voice_call); - } else { - AFB_ERROR("Answer: no incoming call"); - } -} - -static void subscribe(struct afb_req request) -{ - const char *value = afb_req_value(request, "value"); - if(value) { - if (!strcasecmp(value, "callStateChanged")) { - afb_req_subscribe(request, call_state_changed_event); - } else if (!strcasecmp(value, "dialingCall")) { - afb_req_subscribe(request, dialing_call_event); - } else if (!strcasecmp(value, "incomingCall")) { - afb_req_subscribe(request, incoming_call_event); - } else if (!strcasecmp(value, "terminatedCall")) { - afb_req_subscribe(request, terminated_call_event); - } else { - afb_req_fail(request, "failed", "Invalid event"); - return; - } - } - - afb_req_success(request, NULL, NULL); -} - -static void unsubscribe(struct afb_req request) -{ - const char *value = afb_req_value(request, "value"); - if(value) { - if (!strcasecmp(value, "callStateChanged")) { - afb_req_unsubscribe(request, call_state_changed_event); - } else if (!strcasecmp(value, "dialingCall")) { - afb_req_unsubscribe(request, dialing_call_event); - } else if (!strcasecmp(value, "incomingCall")) { - afb_req_unsubscribe(request, incoming_call_event); - } else if (!strcasecmp(value, "terminatedCall")) { - afb_req_unsubscribe(request, terminated_call_event); - } else { - afb_req_fail(request, "failed", "Invalid event"); - return; - } - } - - afb_req_success(request, NULL, NULL); -} - -static void call_state_changed_cb(OrgOfonoVoiceCall *vc, gchar *state) -{ - struct json_object *call_state; - call_state = json_object_new_object(); - json_object_object_add(call_state, "state", json_object_new_string(state)); - afb_event_push(call_state_changed_event, call_state); -} - -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_event_push(incoming_call_event, call_info); - incoming_call = ofono_voicecall_new(op, call_state_changed_cb); -} - -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_event_push(dialing_call_event, call_info); - voice_call = ofono_voicecall_new(op, call_state_changed_cb); -} - -static void terminated_call_cb(OrgOfonoVoiceCallManager *manager, gchar *op) -{ - if (incoming_call) { - ofono_voicecall_free(incoming_call); - incoming_call = NULL; - } else if (voice_call) { - ofono_voicecall_free(voice_call); - } - voice_call = NULL; - afb_event_push(terminated_call_event, NULL); -} - -static void *main_loop_thread(void *unused) -{ - GMainLoop *loop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(loop); - return NULL; -} - -static int ofono_init_default_modem(void) -{ - int ret = 0; - const gchar *modem_path = ofono_manager_get_default_modem_path(); - - if (modem_path) { - vcm = ofono_voicecallmanager_init(modem_path, - incoming_call_cb, - dialing_call_cb, - terminated_call_cb); - if (!vcm) { - AFB_ERROR("failed to initialize voice call manager\n"); - ret = -1; - } - } else { - AFB_ERROR("default modem not set\n"); - ret = -1; - } - - return ret; -} - -static gboolean is_hfp_dev_and_init(struct json_object *dev) -{ - int ret; - gboolean hfp = FALSE; - struct json_object *name, *address, *hfp_connected; - json_object_object_get_ex(dev, "Name", &name); - json_object_object_get_ex(dev, "Address", &address); - json_object_object_get_ex(dev, "HFPConnected", &hfp_connected); - if (!strcmp(json_object_get_string(hfp_connected), "True")) { - ret = ofono_manager_set_default_modem(json_object_get_string(address)); - if (ret == 0) { - ofono_init_default_modem(); - hfp = TRUE; - } - } - - return hfp; -} - -static void discovery_result_cb(void *closure, int status, struct json_object *result) -{ - enum json_type type; - struct json_object *devs, *dev; - int i; - - json_object_object_foreach(result, key, val) { - type = json_object_get_type(val); - switch (type) { - case json_type_array: - json_object_object_get_ex(result, key, &devs); - for (i = 0; i < json_object_array_length(devs); i++) { - dev = json_object_array_get_idx(devs, i); - if (is_hfp_dev_and_init(dev)) - break; - } - break; - case json_type_string: - case json_type_boolean: - case json_type_double: - case json_type_int: - case json_type_object: - case json_type_null: - default: - break; - } - } -} - -static void ofono_hfp_init(void) -{ - struct json_object *args, *response; - - args = json_object_new_object(); - json_object_object_add(args , "value", json_object_new_string("connection")); - afb_service_call_sync("Bluetooth-Manager", "subscribe", args, &response); - - args = json_object_new_object(); - afb_service_call("Bluetooth-Manager", "discovery_result", args, discovery_result_cb, &response); -} - -static int ofono_init(void) -{ - pthread_t tid; - int ret = 0; - - call_state_changed_event = afb_daemon_make_event("callStateChanged"); - dialing_call_event = afb_daemon_make_event("dialingCall"); - incoming_call_event = afb_daemon_make_event("incomingCall"); - terminated_call_event = afb_daemon_make_event("terminatedCall"); - - ret = afb_daemon_require_api("Bluetooth-Manager", 1); - if (ret) { - AFB_ERROR("unable to initialize bluetooth binding"); - return -1; - } - - /* Start the main loop thread */ - pthread_create(&tid, NULL, main_loop_thread, NULL); - - ret = ofono_manager_init(); - if (ret == 0) { - ofono_manager_invalidate_default_modem(); - ofono_hfp_init(); - } else { - AFB_ERROR("failed to initialize ofono manager"); - } - - return ret; -} - -static const struct afb_verb_v2 verbs[]= { - { - .verb = "dial", - .callback = dial, - .auth = NULL, - .session = AFB_SESSION_NONE, - }, - { - .verb = "hangup", - .callback = hangup, - .auth = NULL, - .session = AFB_SESSION_NONE, - }, - { - .verb = "answer", - .callback = answer, - .auth = NULL, - .session = AFB_SESSION_NONE, - }, - { - .verb = "subscribe", - .callback = subscribe, - .auth = NULL, - .session = AFB_SESSION_NONE, - }, - { - .verb = "unsubscribe", - .callback = unsubscribe, - .auth = NULL, - .session = AFB_SESSION_NONE, - }, - {NULL} -}; - -static int init() -{ - AFB_NOTICE("Initializing telephony service"); - - return ofono_init(); -} - -static void process_connection_event(struct json_object *object) -{ - struct json_object *args, *response, *status_obj, *address_obj; - const char *status, *address; - - json_object_object_get_ex(object, "Status", &status_obj); - status = json_object_get_string(status_obj); - - if (!g_strcmp0(status, "connected")) { - args = json_object_new_object(); - afb_service_call("Bluetooth-Manager", "discovery_result", - args, discovery_result_cb, &response); - } else if (!g_strcmp0(status, "disconnected")) { - json_object_object_get_ex(object, "Address", &address_obj); - address = json_object_get_string(address_obj); - if (!g_strcmp0(address, ofono_manager_get_default_modem_address())) { - ofono_manager_invalidate_default_modem(); - ofono_voicecallmanager_free(vcm); - } - } else - AFB_ERROR("Unsupported connection status: %s\n", status); -} - -static void onevent(const char *event, struct json_object *object) -{ - if (!g_strcmp0(event, "Bluetooth-Manager/connection")) - process_connection_event(object); - else - AFB_ERROR("Unsupported event: %s\n", event); -} - -const struct afb_binding_v2 afbBindingV2 = { - .api = "telephony", - .specification = NULL, - .verbs = verbs, - .init = init, - .onevent = onevent, -}; |