fix warning: unused parameter ‘reason’
[profile/ivi/lemolo.git] / dialer / rc.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include <Elementary.h>
5
6 #include "log.h"
7 #include "gui.h"
8
9 static E_DBus_Connection *bus_conn = NULL;
10 static E_DBus_Object *bus_obj = NULL;
11 static E_DBus_Interface *bus_iface = NULL;
12
13 #define RC_SERVICE "org.tizen.dialer"
14 #define RC_IFACE "org.tizen.dialer.Control"
15 #define RC_PATH "/"
16
17 static DBusMessage *
18 _rc_activate(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
19 {
20         INF("Remotely activated!");
21         gui_activate();
22         return dbus_message_new_method_return(msg);
23 }
24
25 static DBusMessage *
26 _rc_dial(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
27 {
28         DBusError err;
29         dbus_bool_t do_auto;
30         const char *number;
31
32         dbus_error_init(&err);
33         dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &number,
34                                 DBUS_TYPE_BOOLEAN, &do_auto, DBUS_TYPE_INVALID);
35         if (dbus_error_is_set(&err)) {
36                 ERR("Could not parse message: %s: %s", err.name, err.message);
37                 return dbus_message_new_error(msg, err.name, err.message);
38         }
39
40         INF("dial '%s' auto=%d!", number, do_auto);
41         gui_activate();
42         gui_call_exit();
43         gui_number_set(number, do_auto);
44         return dbus_message_new_method_return(msg);
45 }
46
47 static void _rc_object_register(void)
48 {
49         bus_obj = e_dbus_object_add(bus_conn, RC_PATH, NULL);
50         if (!bus_obj) {
51                 CRITICAL("Could not create "RC_PATH" DBus object.");
52                 return;
53         }
54         bus_iface = e_dbus_interface_new(RC_IFACE);
55         e_dbus_object_interface_attach(bus_obj, bus_iface);
56
57 #define IF_ADD(name, par, ret, cb)              \
58         e_dbus_interface_method_add(bus_iface, name, par, ret, cb)
59
60         IF_ADD("Activate", "", "", _rc_activate);
61         IF_ADD("Dial", "sb", "", _rc_dial);
62 #undef IF_ADD
63 }
64
65 static void _rc_activate_existing_reply(void *data __UNUSED__,
66                                         DBusMessage *msg __UNUSED__,
67                                         DBusError *err)
68 {
69         if (dbus_error_is_set(err)) {
70                 CRITICAL("Failed to activate existing dialer: %s: %s",
71                                 err->name, err->message);
72                 _app_exit_code = EXIT_FAILURE;
73                 ecore_main_loop_quit();
74                 return;
75         }
76
77         INF("Activated the existing dialer!");
78         ecore_main_loop_quit();
79 }
80
81 static void _rc_activate_existing(void)
82 {
83         DBusMessage *msg = dbus_message_new_method_call(
84                 RC_SERVICE, RC_PATH, RC_IFACE, "Activate");
85         e_dbus_message_send(bus_conn, msg,  _rc_activate_existing_reply,
86                                 -1, NULL);
87         dbus_message_unref(msg);
88 }
89
90 static void _rc_request_name_reply(void *data __UNUSED__, DBusMessage *msg,
91                                         DBusError *err)
92 {
93         DBusError e;
94         dbus_uint32_t t;
95
96         if (!msg) {
97                 if (err)
98                         WRN("%s: %s", err->name, err->message);
99                 else
100                         WRN("No message");
101                 _rc_activate_existing();
102                 return;
103         }
104
105         dbus_error_init(&e);
106         dbus_message_get_args(msg, &e, DBUS_TYPE_UINT32, &t, DBUS_TYPE_INVALID);
107         if (t == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
108                 _rc_object_register();
109                 gui_activate();
110         } else {
111                 WRN("Dialer already running! Activate it!");
112                 _rc_activate_existing();
113         }
114 }
115
116 Eina_Bool rc_init(void)
117 {
118         if (!elm_need_e_dbus()) {
119                 CRITICAL("Elementary does not support DBus.");
120                 return EINA_FALSE;
121         }
122
123         bus_conn = e_dbus_bus_get(DBUS_BUS_SESSION);
124         if (!bus_conn) {
125                 CRITICAL("Could not get DBus System Bus");
126                 return EINA_FALSE;
127         }
128
129         e_dbus_request_name(bus_conn, RC_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE,
130                                 _rc_request_name_reply, NULL);
131         return EINA_TRUE;
132 }
133
134 void rc_shutdown(void)
135 {
136         if (bus_obj)
137                 e_dbus_object_free(bus_obj);
138         if (bus_iface)
139                 e_dbus_interface_unref(bus_iface);
140         bus_conn = NULL;
141 }