diff options
Diffstat (limited to 'cras/src/server/cras_telephony.c')
-rw-r--r-- | cras/src/server/cras_telephony.c | 455 |
1 files changed, 0 insertions, 455 deletions
diff --git a/cras/src/server/cras_telephony.c b/cras/src/server/cras_telephony.c deleted file mode 100644 index 805fb137..00000000 --- a/cras/src/server/cras_telephony.c +++ /dev/null @@ -1,455 +0,0 @@ -/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include <string.h> -#include <stdlib.h> -#include <syslog.h> - -#include <dbus/dbus.h> - -#include "cras_telephony.h" -#include "cras_hfp_ag_profile.h" -#include "cras_hfp_slc.h" - -#define CRAS_TELEPHONY_INTERFACE "org.chromium.cras.Telephony" -#define CRAS_TELEPHONY_OBJECT_PATH "/org/chromium/cras/telephony" -#define TELEPHONY_INTROSPECT_XML \ - DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ - "<node>\n" \ - " <interface name=\"" CRAS_TELEPHONY_INTERFACE "\">\n" \ - " <method name=\"AnswerCall\">\n" \ - " </method>\n" \ - " <method name=\"IncomingCall\">\n" \ - " <arg name=\"value\" type=\"s\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"TerminateCall\">\n" \ - " </method>\n" \ - " <method name=\"SetBatteryLevel\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetSignalStrength\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetServiceAvailability\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetDialNumber\">\n" \ - " <arg name=\"value\" type=\"s\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetCallheld\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetCallsetup\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " <method name=\"SetCall\">\n" \ - " <arg name=\"value\" type=\"i\" direction=\"in\"/>\n" \ - " </method>\n" \ - " </interface>\n" \ - " <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n" \ - " <method name=\"Introspect\">\n" \ - " <arg name=\"data\" type=\"s\" direction=\"out\"/>\n" \ - " </method>\n" \ - " </interface>\n" \ - "</node>\n" - -static struct cras_telephony_handle telephony_handle; - -/* Helper to extract a single argument from a DBus message. */ -static DBusHandlerResult get_single_arg(DBusMessage *message, int dbus_type, - void *arg) -{ - DBusError dbus_error; - - dbus_error_init(&dbus_error); - - if (!dbus_message_get_args(message, &dbus_error, dbus_type, arg, - DBUS_TYPE_INVALID)) { - syslog(LOG_WARNING, "Bad method received: %s", - dbus_error.message); - dbus_error_free(&dbus_error); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -/* Helper to send an empty reply. */ -static void send_empty_reply(DBusConnection *conn, DBusMessage *message) -{ - DBusMessage *reply; - dbus_uint32_t serial = 0; - - reply = dbus_message_new_method_return(message); - if (!reply) - return; - - dbus_connection_send(conn, reply, &serial); - - dbus_message_unref(reply); -} - -static DBusHandlerResult handle_incoming_call(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - const char *number; - - rc = get_single_arg(message, DBUS_TYPE_STRING, &number); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - handle = cras_hfp_ag_get_active_handle(); - - telephony_handle.callsetup = 1; - - if (handle) { - hfp_event_update_callsetup(handle); - hfp_event_incoming_call(handle, number, 129); - } - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_terminate_call(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - cras_telephony_event_terminate_call(); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_answer_call(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - cras_telephony_event_answer_call(); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_dial_number(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - DBusHandlerResult rc; - const char *number; - - rc = get_single_arg(message, DBUS_TYPE_STRING, &number); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - cras_telephony_store_dial_number(strlen(number), number); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_battery(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_set_battery(handle, value); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_signal(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_set_signal(handle, value); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_service(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_set_service(handle, value); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_callheld(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - telephony_handle.callheld = value; - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_update_callheld(handle); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_callsetup(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - telephony_handle.callsetup = value; - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_update_callsetup(handle); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult handle_set_call(DBusConnection *conn, - DBusMessage *message, void *arg) -{ - struct hfp_slc_handle *handle; - DBusHandlerResult rc; - int value; - - rc = get_single_arg(message, DBUS_TYPE_INT32, &value); - if (rc != DBUS_HANDLER_RESULT_HANDLED) - return rc; - - telephony_handle.call = value; - handle = cras_hfp_ag_get_active_handle(); - if (handle) - hfp_event_update_call(handle); - - send_empty_reply(conn, message); - return DBUS_HANDLER_RESULT_HANDLED; -} - -/* Handle incoming messages. */ -static DBusHandlerResult -handle_telephony_message(DBusConnection *conn, DBusMessage *message, void *arg) -{ - syslog(LOG_ERR, "Telephony message: %s %s %s", - dbus_message_get_path(message), - dbus_message_get_interface(message), - dbus_message_get_member(message)); - - if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, - "Introspect")) { - DBusMessage *reply; - const char *xml = TELEPHONY_INTROSPECT_XML; - - reply = dbus_message_new_method_return(message); - if (!reply) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &xml, - DBUS_TYPE_INVALID)) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - if (!dbus_connection_send(conn, reply, NULL)) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_message_unref(reply); - return DBUS_HANDLER_RESULT_HANDLED; - } else if (dbus_message_is_method_call( - message, CRAS_TELEPHONY_INTERFACE, "IncomingCall")) { - return handle_incoming_call(conn, message, arg); - } else if (dbus_message_is_method_call(message, - CRAS_TELEPHONY_INTERFACE, - "TerminateCall")) { - return handle_terminate_call(conn, message, arg); - } else if (dbus_message_is_method_call( - message, CRAS_TELEPHONY_INTERFACE, "AnswerCall")) { - return handle_answer_call(conn, message, arg); - } else if (dbus_message_is_method_call(message, - CRAS_TELEPHONY_INTERFACE, - "SetDialNumber")) { - return handle_set_dial_number(conn, message, arg); - } else if (dbus_message_is_method_call(message, - CRAS_TELEPHONY_INTERFACE, - "SetBatteryLevel")) { - return handle_set_battery(conn, message, arg); - } else if (dbus_message_is_method_call(message, - CRAS_TELEPHONY_INTERFACE, - "SetSignalStrength")) { - return handle_set_signal(conn, message, arg); - } else if (dbus_message_is_method_call(message, - CRAS_TELEPHONY_INTERFACE, - "SetServiceAvailability")) { - return handle_set_service(conn, message, arg); - } else if (dbus_message_is_method_call( - message, CRAS_TELEPHONY_INTERFACE, "SetCallheld")) { - return handle_set_callheld(conn, message, arg); - } else if (dbus_message_is_method_call( - message, CRAS_TELEPHONY_INTERFACE, "SetCallsetup")) { - return handle_set_callsetup(conn, message, arg); - } else if (dbus_message_is_method_call( - message, CRAS_TELEPHONY_INTERFACE, "SetCall")) { - return handle_set_call(conn, message, arg); - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -/* Exported Interface */ - -void cras_telephony_start(DBusConnection *conn) -{ - static const DBusObjectPathVTable control_vtable = { - .message_function = handle_telephony_message, - }; - - DBusError dbus_error; - - telephony_handle.dbus_conn = conn; - dbus_connection_ref(telephony_handle.dbus_conn); - - if (!dbus_connection_register_object_path( - conn, CRAS_TELEPHONY_OBJECT_PATH, &control_vtable, - &dbus_error)) { - syslog(LOG_ERR, "Couldn't register telephony control: %s: %s", - CRAS_TELEPHONY_OBJECT_PATH, dbus_error.message); - dbus_error_free(&dbus_error); - return; - } -} - -void cras_telephony_stop() -{ - if (!telephony_handle.dbus_conn) - return; - - dbus_connection_unregister_object_path(telephony_handle.dbus_conn, - CRAS_TELEPHONY_OBJECT_PATH); - dbus_connection_unref(telephony_handle.dbus_conn); - telephony_handle.dbus_conn = NULL; -} - -struct cras_telephony_handle *cras_telephony_get() -{ - return &telephony_handle; -} - -/* Procedure to answer a call from AG. - * - * HF(hands-free) AG(audio gateway) - * <-- Call answered - * <-- +CIEV: (call = 1) - * <-- +CIEV: (callsetup = 0) - */ -int cras_telephony_event_answer_call() -{ - int rc; - - struct hfp_slc_handle *handle; - - handle = cras_hfp_ag_get_active_handle(); - - if (telephony_handle.call == 0) { - telephony_handle.call = 1; - if (handle) { - rc = hfp_event_update_call(handle); - if (rc) - return rc; - } - } - - telephony_handle.callsetup = 0; - if (handle) { - rc = hfp_event_update_callsetup(handle); - if (rc) - return rc; - } - - return 0; -} - -/* Procedure to terminate a call from AG. - * - * HF(hands-free) AG(audio gateway) - * <-- Call dropped - * <-- +CIEV: (call = 0) - */ -int cras_telephony_event_terminate_call() -{ - int rc; - struct hfp_slc_handle *handle; - - handle = cras_hfp_ag_get_active_handle(); - - if (telephony_handle.call) { - telephony_handle.call = 0; - if (handle) { - rc = hfp_event_update_call(handle); - if (rc) - return rc; - } - } - if (telephony_handle.callsetup) { - telephony_handle.callsetup = 0; - if (handle) { - rc = hfp_event_update_callsetup(handle); - if (rc) - return rc; - } - } - return 0; -} - -void cras_telephony_store_dial_number(int len, const char *number) -{ - if (telephony_handle.dial_number != NULL) { - free(telephony_handle.dial_number); - telephony_handle.dial_number = NULL; - } - - if (len == 0) - return; - - telephony_handle.dial_number = - (char *)calloc(len + 1, sizeof(*telephony_handle.dial_number)); - strncpy(telephony_handle.dial_number, number, len); - - syslog(LOG_ERR, "store dial_number: \"%s\"", - telephony_handle.dial_number); -} |