4 #include <Elementary.h>
5 #include <appcore-efl.h>
14 #define APP_NAME "org.tizen.call"
15 #define BUS_NAME "org.tizen.dialer"
17 #define IFACE "org.tizen.dialer.Control"
19 static E_DBus_Connection *bus_conn = NULL;
22 typedef struct _Daemon {
27 static void _dial_return_cb(void *data __UNUSED__, DBusMessage *msg __UNUSED__,
30 if (dbus_error_is_set(error)) {
31 fprintf(stderr, "Error: %s %s", error->name, error->message);
37 static void _pending_call_send(Daemon *d)
40 EINA_LIST_FREE(d->pending, p_msg) {
41 e_dbus_message_send(bus_conn, p_msg, _dial_return_cb, -1, NULL);
42 dbus_message_unref(p_msg);
46 static void _has_owner_cb(void *data, DBusMessage *msg, DBusError *error)
52 if (dbus_error_is_set(error)) {
53 fprintf(stderr, "Error: %s %s", error->name, error->message);
56 dbus_error_init(&err);
57 dbus_message_get_args(msg, &err, DBUS_TYPE_BOOLEAN, &online,
61 e_dbus_start_service_by_name(bus_conn, BUS_NAME, 0, NULL, NULL);
63 d->online = EINA_TRUE;
64 _pending_call_send(d);
68 static void _name_owner_changed(void *data, DBusMessage *msg)
71 const char *name, *from, *to;
74 dbus_error_init(&err);
75 if (!dbus_message_get_args(msg, &err,
76 DBUS_TYPE_STRING, &name,
77 DBUS_TYPE_STRING, &from,
78 DBUS_TYPE_STRING, &to,
81 "Could not get NameOwnerChanged arguments: %s: %s",
82 err.name, err.message);
83 dbus_error_free(&err);
87 if (strcmp(name, BUS_NAME) != 0)
90 d->online = EINA_TRUE;
91 _pending_call_send(d);
94 static Eina_Bool _dbus_init(Daemon *dialer_daemon)
97 char *bus_name = BUS_NAME;
99 bus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
101 fprintf(stderr, "Could not fetch the DBus session");
105 e_dbus_signal_handler_add(bus_conn, E_DBUS_FDO_BUS, E_DBUS_FDO_PATH,
106 E_DBUS_FDO_INTERFACE,
108 _name_owner_changed, dialer_daemon);
110 msg = dbus_message_new_method_call(E_DBUS_FDO_BUS, E_DBUS_FDO_PATH,
111 E_DBUS_FDO_INTERFACE,
114 EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE);
116 if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &bus_name,
120 e_dbus_message_send(bus_conn, msg, _has_owner_cb, -1, dialer_daemon);
121 dbus_message_unref(msg);
125 dbus_message_unref(msg);
129 static int _dial(const char *number, Daemon *d)
131 dbus_bool_t do_auto = TRUE;
134 msg = dbus_message_new_method_call(BUS_NAME, PATH, IFACE, "Dial");
136 EINA_SAFETY_ON_NULL_RETURN_VAL(msg, -1);
138 if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &number,
139 DBUS_TYPE_BOOLEAN, &do_auto,
144 e_dbus_message_send(bus_conn, msg, _dial_return_cb, -1, NULL);
145 dbus_message_unref(msg);
147 d->pending = eina_list_append(d->pending, msg);
151 dbus_message_unref(msg);
155 static int _create(void *data __UNUSED__)
160 static int _reset(bundle *b, void *data)
162 const char *number, *mime_type, *tmp;
165 EINA_SAFETY_ON_NULL_RETURN_VAL(b, -1);
166 number = bundle_get_val(b, "number");
168 mime_type = bundle_get_val(b, AUL_K_MIME_TYPE);
170 if (strncmp(mime_type, "phonenum.uri", 12) == 0 ||
171 strncmp(mime_type, "tel.uri", 7) == 0) {
172 tmp = bundle_get_val(b, AUL_K_MIME_CONTENT);
173 EINA_SAFETY_ON_NULL_RETURN_VAL(tmp, -1);
174 if (strncmp(tmp, "tel:", 4) == 0)
175 number = (char *)tmp + 4;
177 fprintf(stderr, "Phone not present");
181 fprintf(stderr, "Unexpected mime type.");
185 tmp = (const char *)appsvc_get_uri(b);
186 EINA_SAFETY_ON_NULL_RETURN_VAL(tmp, -1);
187 number = (char *)tmp + 4;
190 EINA_SAFETY_ON_NULL_RETURN_VAL(number, -1);
191 return _dial(number, d);
194 static int _resume(void *data __UNUSED__)
199 static int _pause(void *data __UNUSED__)
204 static int _terminate(void *data __UNUSED__)
209 int main(int argc __UNUSED__, char **argv __UNUSED__)
212 Daemon dialer_daemon;
213 dialer_daemon.pending = NULL;
214 dialer_daemon.online = EINA_FALSE;
215 struct appcore_ops ops = {
220 .terminate = _terminate,
222 ops.data = &dialer_daemon;
225 EINA_SAFETY_ON_FALSE_RETURN_VAL(_dbus_init(&dialer_daemon), -1);
226 r = appcore_efl_main(APP_NAME, &argc, &argv, &ops);
227 e_dbus_connection_close(bus_conn);