4 #include <Elementary.h>
10 static E_DBus_Connection *bus_conn = NULL;
11 static E_DBus_Object *bus_obj = NULL;
12 static E_DBus_Interface *bus_iface = NULL;
14 #define RC_IFACE "org.tizen.messages.Control"
17 static const char *rc_service = NULL;
18 static OFono_Callback_List_Modem_Node *modem_changed_node = NULL;
19 static DBusMessage *pending_send = NULL;
21 static void _send_message(const char *number, const char *message,
24 INF("send '%s' '%s' auto=%d!", number, message, do_auto);
26 gui_send(number, message, do_auto);
29 static void _modem_changed_cb(void *data __UNUSED__)
32 const char *number, *message;
36 if (!ofono_voice_is_online() || !pending_send)
39 dbus_error_init(&err);
40 dbus_message_get_args(pending_send, &err,
41 DBUS_TYPE_STRING, &number,
42 DBUS_TYPE_STRING, &message,
43 DBUS_TYPE_BOOLEAN, &do_auto, DBUS_TYPE_INVALID);
45 if (dbus_error_is_set(&err)) {
46 ERR("Could not parse message: %s: %s", err.name, err.message);
47 reply = dbus_message_new_error(pending_send, err.name,
52 _send_message(number, message, do_auto);
53 reply = dbus_message_new_method_return(pending_send);
55 e_dbus_message_send(bus_conn, reply, NULL, -1, NULL);
56 dbus_message_unref(pending_send);
57 dbus_message_unref(reply);
62 _rc_activate(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
64 INF("Remotely activated!");
66 return dbus_message_new_method_return(msg);
70 _rc_send(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
74 const char *number, *message;
76 if (!ofono_voice_is_online()) {
78 dbus_message_unref(pending_send);
79 pending_send = dbus_message_ref(msg);
83 dbus_error_init(&err);
84 dbus_message_get_args(msg, &err,
85 DBUS_TYPE_STRING, &number,
86 DBUS_TYPE_STRING, &message,
87 DBUS_TYPE_BOOLEAN, &do_auto, DBUS_TYPE_INVALID);
88 if (dbus_error_is_set(&err)) {
89 ERR("Could not parse message: %s: %s", err.name, err.message);
90 return dbus_message_new_error(msg, err.name, err.message);
92 _send_message(number, message, do_auto);
93 return dbus_message_new_method_return(msg);
96 static void _rc_object_register(void)
98 bus_obj = e_dbus_object_add(bus_conn, RC_PATH, NULL);
100 CRITICAL("Could not create "RC_PATH" DBus object.");
103 bus_iface = e_dbus_interface_new(RC_IFACE);
104 e_dbus_object_interface_attach(bus_obj, bus_iface);
106 #define IF_ADD(name, par, ret, cb) \
107 e_dbus_interface_method_add(bus_iface, name, par, ret, cb)
109 IF_ADD("Activate", "", "", _rc_activate);
110 IF_ADD("Send", "ssb", "", _rc_send);
114 static void _rc_activate_existing_reply(void *data __UNUSED__,
115 DBusMessage *msg __UNUSED__,
118 if (dbus_error_is_set(err)) {
119 CRITICAL("Failed to activate existing messages: %s: %s",
120 err->name, err->message);
121 _app_exit_code = EXIT_FAILURE;
122 ecore_main_loop_quit();
126 INF("Activated the existing messages!");
127 ecore_main_loop_quit();
130 static void _rc_activate_existing(void)
132 DBusMessage *msg = dbus_message_new_method_call(
133 rc_service, RC_PATH, RC_IFACE, "Activate");
134 e_dbus_message_send(bus_conn, msg, _rc_activate_existing_reply,
136 dbus_message_unref(msg);
139 static void _rc_request_name_reply(void *data __UNUSED__, DBusMessage *msg,
147 WRN("%s: %s", err->name, err->message);
150 _rc_activate_existing();
155 dbus_message_get_args(msg, &e, DBUS_TYPE_UINT32, &t, DBUS_TYPE_INVALID);
156 if (t == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
157 _rc_object_register();
160 WRN("Messages already running! Activate it!");
161 _rc_activate_existing();
165 Eina_Bool rc_init(const char *service)
167 rc_service = service;
169 if (!elm_need_e_dbus()) {
170 CRITICAL("Elementary does not support DBus.");
174 INF("Running on Session bus");
175 bus_conn = e_dbus_bus_get(DBUS_BUS_SESSION);
178 CRITICAL("Could not get DBus Bus");
182 e_dbus_request_name(bus_conn, rc_service, DBUS_NAME_FLAG_DO_NOT_QUEUE,
183 _rc_request_name_reply, NULL);
185 modem_changed_node = ofono_modem_changed_cb_add(_modem_changed_cb,
191 void rc_shutdown(void)
194 e_dbus_object_free(bus_obj);
196 e_dbus_interface_unref(bus_iface);
198 ofono_modem_changed_cb_del(modem_changed_node);
201 dbus_message_unref(pending_send);