2 # include "elementary_config.h"
5 #include <Elementary.h>
8 #define MY_CLASS ELM_APP_CLIENT_CLASS
10 #define MY_CLASS_NAME "Elm_App_Client"
14 Eldbus_Proxy *app_proxy;
16 } Elm_App_Client_Data;
19 _sub_path_process(Elm_App_Client *eo, Eldbus_Message_Iter *obj_iter, Elm_App_Client_Data *data, Eina_Bool loading_list)
22 Eldbus_Message_Iter *array_iface, *iface;
24 eldbus_message_iter_arguments_get(obj_iter, "oa{sa{sv}}", &obj_path, &array_iface);
25 while (eldbus_message_iter_get_and_next(array_iface, '{', &iface))
27 const char *iface_name;
28 Eldbus_Message_Iter *array_props;
29 Elm_App_Client_View *view;
31 eldbus_message_iter_arguments_get(iface, "sa{sv}", &iface_name,
33 if (strcmp(iface_name, "org.enlightenment.ApplicationView1"))
36 view = eina_hash_find(data->views, obj_path);
40 view = eo_add(ELM_APP_CLIENT_VIEW_CLASS, eo,
41 elm_app_client_view_constructor(obj_path));
42 eina_hash_add(data->views, obj_path, view);
44 eo_do(eo, eo_event_callback_call(ELM_APP_CLIENT_EVENT_VIEW_CREATED, view));
49 _objects_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
52 Elm_App_Client_Data *cdata = eo_data_scope_get(eo, MY_CLASS);
53 Eldbus_Message_Iter *array_path, *path;
55 if (eldbus_message_error_get(msg, NULL, NULL))
58 if (!eldbus_message_arguments_get(msg, "a{oa{sa{sv}}}", &array_path))
60 while (eldbus_message_iter_get_and_next(array_path, '{', &path))
61 _sub_path_process(eo, path, cdata, EINA_TRUE);
63 eo_do(eo, eo_event_callback_call(ELM_APP_CLIENT_EVENT_VIEW_LIST_LOADED,
67 static void _iface_add(void *data, const Eldbus_Message *msg)
70 Elm_App_Client_Data *cdata = eo_data_scope_get(eo, MY_CLASS);
71 Eldbus_Message_Iter *main_iter;
73 main_iter = eldbus_message_iter_get(msg);
74 _sub_path_process(eo, main_iter, cdata, EINA_FALSE);
78 _iface_del(void *data, const Eldbus_Message *msg)
81 Elm_App_Client_Data *cdata = eo_data_scope_get(eo, MY_CLASS);
82 const char *path, *iface;
83 Eldbus_Message_Iter *array_iface;
85 if (!eldbus_message_arguments_get(msg, "oas", &path, &array_iface))
87 while (eldbus_message_iter_get_and_next(array_iface, 's', &iface))
89 Elm_App_Client_View *view;
90 Elm_App_View_State view_state = ELM_APP_VIEW_STATE_UNKNOWN;
92 if (strcmp(iface, "org.enlightenment.ApplicationView1"))
95 view = eina_hash_find(cdata->views, path);
99 eo_do(view, view_state = elm_app_client_view_state_get());
100 if (view_state != ELM_APP_VIEW_STATE_CLOSED)
102 elm_app_client_view_internal_state_set(view,
103 ELM_APP_VIEW_STATE_SHALLOW);
107 eina_hash_del(cdata->views, path, NULL);
108 eo_do(eo, eo_event_callback_call(ELM_APP_CLIENT_EVENT_VIEW_DELETED,
115 _pkg_name_owner_changed_cb(void *data, const char *bus EINA_UNUSED, const char *old_id EINA_UNUSED, const char *new_id)
117 Elm_App_Client *eo = data;
118 Elm_App_Client_Data *cdata = eo_data_scope_get(eo, MY_CLASS);
120 Elm_App_Client_View *view;
121 Eina_List *views_list = NULL;
123 if (!new_id || (new_id[0] == '\0'))
126 iter = eina_hash_iterator_data_new(cdata->views);
127 EINA_ITERATOR_FOREACH(iter, view)
128 views_list = eina_list_append(views_list, view);
129 eina_iterator_free(iter);
132 * remove all views that are closed of the views hash
133 * views not closed, only set they to SHALLOW
135 EINA_LIST_FREE(views_list, view)
137 Elm_App_View_State view_state = ELM_APP_VIEW_STATE_UNKNOWN;
138 const char *path = NULL;
140 eo_do(view, view_state = elm_app_client_view_state_get(),
141 path = elm_app_client_view_path_get());
142 if (view_state != ELM_APP_VIEW_STATE_CLOSED)
144 elm_app_client_view_internal_state_set(view,
145 ELM_APP_VIEW_STATE_SHALLOW);
149 eina_hash_del(cdata->views, path, NULL);
150 eo_do(eo, eo_event_callback_call(ELM_APP_CLIENT_EVENT_VIEW_DELETED,
157 _elm_app_client_constructor(Eo *eo, Elm_App_Client_Data *data, const char *pkg)
159 Eldbus_Connection *conn;
163 EINA_SAFETY_ON_NULL_GOTO(pkg, error);
165 data->views = eina_hash_string_small_new(NULL);
167 path = _dbus_package_to_path(pkg);
170 conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
171 obj = eldbus_object_get(conn, pkg, path);
172 data->app_proxy = eldbus_proxy_get(obj, "org.enlightenment.Application1");
173 eldbus_object_managed_objects_get(obj, _objects_get, eo);
174 eldbus_object_manager_interfaces_added(obj, _iface_add, eo);
175 eldbus_object_manager_interfaces_removed(obj, _iface_del, eo);
176 eldbus_name_owner_changed_callback_add(conn, pkg, _pkg_name_owner_changed_cb,
187 _create_view_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending)
189 Elm_App_Client_Open_View_Cb cb = eldbus_pending_data_del(pending, "user_cb");
190 void *user_data = eldbus_pending_data_del(pending, "user_data");
191 const char *error_name, *error_message, *view_path;
192 Elm_App_Client *eo = data;
193 Elm_App_Client_View *view;
194 Elm_App_Client_Data *cdata = eo_data_scope_get(eo, MY_CLASS);
196 if (eldbus_message_error_get(msg, &error_name, &error_message))
200 if (error_name && !strcmp(error_name, ELDBUS_ERROR_PENDING_CANCELED))
201 cb(user_data, NULL, ELM_APP_CLIENT_VIEW_OPEN_CANCELED, NULL);
202 else if (error_name && !strcmp(error_name, ELDBUS_ERROR_PENDING_TIMEOUT))
203 cb(user_data, NULL, ELM_APP_CLIENT_VIEW_OPEN_TIMEOUT, error_message);
205 cb(user_data, NULL, error_name, error_message);
209 if (!eldbus_message_arguments_get(msg, "o", &view_path))
212 cb(user_data, NULL, "Unknow error", NULL);
217 * Because a IntefaceAdd signal could arrive first
219 view = eina_hash_find(cdata->views, view_path);
222 view = eo_add(ELM_APP_CLIENT_VIEW_CLASS, eo,
223 elm_app_client_view_constructor(view_path));
224 eina_hash_add(cdata->views, view_path, view);
225 eo_do(eo, eo_event_callback_call(ELM_APP_CLIENT_EVENT_VIEW_CREATED,
232 cb(user_data, NULL, ELM_APP_CLEINT_VIEW_OPEN_ERROR, NULL);
236 cb(user_data, view, NULL, NULL);
239 EOLIAN static Elm_App_Client_Pending *
240 _elm_app_client_view_open(Eo *eo, Elm_App_Client_Data *data, Eina_Value *args, Elm_App_Client_Open_View_Cb cb, const void *user_data)
243 Eldbus_Pending *pending;
245 msg = eldbus_proxy_method_call_new(data->app_proxy, "CreateView");
249 if (!eldbus_message_from_eina_value("a{sv}", msg, args))
251 eldbus_message_unref(msg);
252 //TODO test to find out what type eina_value must be
253 ERR("Eina_Value of args don't have a structure of a{sv}");
259 Eldbus_Message_Iter *main_iter = eldbus_message_iter_get(msg);
260 Eldbus_Message_Iter *array;
262 eldbus_message_iter_arguments_append(main_iter, "a{sv}", &array);
263 eldbus_message_iter_container_close(main_iter, array);
266 pending = eldbus_proxy_send(data->app_proxy, msg, _create_view_cb, eo, -1);
268 eldbus_pending_data_set(pending, "user_data", user_data);
270 eldbus_pending_data_set(pending, "user_cb", cb);
275 EOLIAN static Eina_Iterator*
276 _elm_app_client_views_get(Eo *eo EINA_UNUSED, Elm_App_Client_Data *data)
278 return eina_hash_iterator_data_new(data->views);
282 _elm_app_client_view_all_close(Eo *obj EINA_UNUSED, Elm_App_Client_Data *data)
284 eldbus_proxy_call(data->app_proxy, "CloseAllViews", NULL, NULL, -1, "");
288 _elm_app_client_terminate(Eo *eo EINA_UNUSED, Elm_App_Client_Data *data)
290 eldbus_proxy_call(data->app_proxy, "Terminate", NULL, NULL, -1, "");
293 EOLIAN static const char*
294 _elm_app_client_package_get(Eo *eo EINA_UNUSED, Elm_App_Client_Data *data)
298 obj = eldbus_proxy_object_get(data->app_proxy);
299 return eldbus_object_bus_name_get(obj);
303 _elm_app_client_view_open_cancel(Eo *eo EINA_UNUSED, Elm_App_Client_Data *_pd EINA_UNUSED, Elm_App_Client_Pending *pending)
305 eldbus_pending_cancel(pending);
309 _elm_app_client_eo_base_destructor(Eo *eo, Elm_App_Client_Data *data)
312 Eldbus_Connection *conn;
314 Elm_App_Client_View *view;
316 iter = eina_hash_iterator_data_new(data->views);
317 EINA_ITERATOR_FOREACH(iter, view)
319 eina_iterator_free(iter);
320 eina_hash_free(data->views);
322 obj = eldbus_proxy_object_get(data->app_proxy);
323 conn = eldbus_object_connection_get(obj);
324 eldbus_name_owner_changed_callback_del(conn, eldbus_object_bus_name_get(obj),
325 _pkg_name_owner_changed_cb, eo);
326 eldbus_proxy_unref(data->app_proxy);
327 eldbus_object_unref(obj);
328 eldbus_connection_unref(conn);
331 eo_do_super(eo, MY_CLASS, eo_destructor());
334 #include "elm_app_client.eo.c"