2 * Copyright (c) 2013-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
19 #include "minicontrol-error.h"
20 #include "minicontrol-type.h"
21 #include "minicontrol-internal.h"
22 #include "minicontrol-provider.h"
23 #include "minicontrol-log.h"
24 #include "minicontrol-handler.h"
26 #define MINICTRL_PRIORITY_SUFFIX_TOP "__minicontrol_top"
27 #define MINICTRL_PRIORITY_SUFFIX_LOW "__minicontrol_low"
28 #define MINICTRL_DATA_KEY "__minictrl_data_internal"
31 MINICTRL_STATE_READY =0,
32 MINICTRL_STATE_RUNNING,
35 struct _provider_data {
38 minicontrol_priority_e priority;
40 minictrl_sig_handle *sh;
41 minicontrol_h handler;
44 static void __provider_data_free(struct _provider_data *pd)
51 _minictrl_dbus_sig_handle_dettach(pd->sh);
54 _minictrl_handler_destroy(pd->handler);
60 static int __str_has_suffix(const char *str, const char *suffix)
71 str_len = strlen (str);
72 suffix_len = strlen (suffix);
74 if (str_len < suffix_len)
77 return strcmp(str + str_len - suffix_len, suffix);
80 static void _running_req_cb(void *data, DBusMessage *msg)
82 struct _provider_data *pd;
90 if (pd->state == MINICTRL_STATE_RUNNING) {
93 evas_object_geometry_get(pd->obj, NULL, NULL, &w, &h);
94 _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START,
95 pd->name, w, h, pd->priority, pd->handler);
99 static int minicontrol_win_start(Evas_Object *mincontrol)
101 struct _provider_data *pd;
102 int ret = MINICONTROL_ERROR_NONE;
105 ERR("mincontrol is NULL, invaild parameter");
106 return MINICONTROL_ERROR_INVALID_PARAMETER;
109 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
111 ERR("pd is NULL, invaild parameter");
112 return MINICONTROL_ERROR_INVALID_PARAMETER;
116 ERR("pd name is NULL, invaild parameter");
117 return MINICONTROL_ERROR_INVALID_PARAMETER;
120 if (pd->state != MINICTRL_STATE_RUNNING) {
123 pd->state = MINICTRL_STATE_RUNNING;
125 evas_object_geometry_get(mincontrol, NULL, NULL, &w, &h);
126 _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_EXCLUDE);
127 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START,
128 pd->name, w, h, pd->priority, pd->handler);
134 static int minicontrol_win_realize(Evas_Object *mincontrol)
136 struct _provider_data *pd;
137 int ret = MINICONTROL_ERROR_NONE;
140 ERR("mincontrol is NULL, invaild parameter");
141 return MINICONTROL_ERROR_INVALID_PARAMETER;
144 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
146 ERR("pd is NULL, invaild parameter");
147 return MINICONTROL_ERROR_INVALID_PARAMETER;
151 ERR("pd name is NULL, invaild parameter");
152 return MINICONTROL_ERROR_INVALID_PARAMETER;
157 if (pd->state != MINICTRL_STATE_RUNNING) {
158 pd->state = MINICTRL_STATE_RUNNING;
161 evas_object_geometry_get(mincontrol, NULL, NULL, &w, &h);
162 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REALIZE,
163 pd->name, w, h, pd->priority, pd->handler);
168 static int minicontrol_win_stop(Evas_Object *mincontrol)
170 struct _provider_data *pd;
171 int ret = MINICONTROL_ERROR_NONE;
174 ERR("mincontrol is NULL, invaild parameter");
175 return MINICONTROL_ERROR_INVALID_PARAMETER;
178 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
180 ERR("pd is NULL, invaild parameter");
181 return MINICONTROL_ERROR_INVALID_PARAMETER;
185 ERR("pd name is NULL, invaild parameter");
186 return MINICONTROL_ERROR_INVALID_PARAMETER;
188 if (pd->state != MINICTRL_STATE_READY) {
189 pd->state = MINICTRL_STATE_READY;
190 _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_INCLUDE);
191 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_STOP,
192 pd->name, 0, 0, pd->priority, pd->handler);
198 static void _minictrl_win_del(void *data, Evas *e,
199 Evas_Object *obj, void *event_info)
201 struct _provider_data *pd = NULL;
203 minicontrol_win_stop(obj);
205 pd = evas_object_data_get(obj, MINICTRL_DATA_KEY);
206 __provider_data_free(pd);
208 evas_object_data_set(obj, MINICTRL_DATA_KEY, NULL);
211 static void _minictrl_win_hide(void *data, Evas *e,
212 Evas_Object *obj, void *event_info)
214 minicontrol_win_stop(obj);
217 static void _minictrl_win_show(void *data, Evas *e,
218 Evas_Object *obj, void *event_info)
220 minicontrol_win_start(obj);
223 static void _minictrl_win_realize(void *data, Evas *e,
224 Evas_Object *obj, void *event_info)
226 struct _provider_data *pd;
229 ERR("data is NULL, invaild parameter");
235 ERR("minicontrol object is NULL, invalid parameter");
239 Evas *win_e = evas_object_evas_get(pd->obj);
241 evas_event_callback_del(win_e, EVAS_CALLBACK_RENDER_POST,
242 _minictrl_win_realize);
245 minicontrol_win_realize(pd->obj);
247 if (pd->handler != NULL) {
248 _minictrl_handler_set_state(pd->handler, 1);
252 static void _minictrl_win_resize(void *data, Evas *e,
253 Evas_Object *obj, void *event_info)
255 struct _provider_data *pd;
258 ERR("data is NULL, invaild parameter");
263 if (pd->state == MINICTRL_STATE_RUNNING) {
267 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
268 _minictrl_provider_message_send(MINICTRL_DBUS_SIG_RESIZE,
269 pd->name, w, h, pd->priority, pd->handler);
273 static char *_minictrl_create_name(const char *name)
279 ERR("name is NULL, invaild parameter");
283 size = snprintf(NULL, 0, "[%s]", name) + 1;
284 buf = (char *)malloc(sizeof(char) * size);
286 ERR("fail to alloc buf");
290 snprintf(buf, size, "[%s]", name);
295 static minicontrol_priority_e _minictrl_get_priroty_by_name(const char *name)
297 minicontrol_priority_e priority = MINICONTROL_PRIORITY_MIDDLE;
299 if (!__str_has_suffix(name, MINICTRL_PRIORITY_SUFFIX_TOP))
300 priority = MINICONTROL_PRIORITY_TOP;
301 else if (!__str_has_suffix(name, MINICTRL_PRIORITY_SUFFIX_LOW))
302 priority = MINICONTROL_PRIORITY_LOW;
307 EXPORT_API Evas_Object *minicontrol_win_add(const char *name)
309 minicontrol_h handler = NULL;
310 Evas_Object *win = NULL;
312 if (_minictrl_handler_create(&handler) == MINICONTROL_ERROR_NONE) {
313 if (_minictrl_handler_set_service_name(handler, name) != MINICONTROL_ERROR_NONE) {
314 ERR("failed to service name");
315 _minictrl_handler_destroy(handler);
318 if (_minictrl_handler_set_timestamp(handler, time(NULL)) != MINICONTROL_ERROR_NONE) {
319 ERR("failed to set timestamp");
321 if (_minictrl_handler_set_priority(handler, MINICONTROL_HDL_PRIORITY_LV3) != MINICONTROL_ERROR_NONE) {
322 ERR("failed to set priority");
325 ERR("Failed to create minicontrol handler");
329 win = minicontrol_win_add_by_handler(handler);
330 _minictrl_handler_destroy(handler);
335 EXPORT_API Evas_Object *minicontrol_win_add_by_handler(minicontrol_h handler)
337 Evas_Object *win = NULL;
339 char *name_inter = NULL;
340 char *priority = NULL;
341 struct _provider_data *pd;
342 time_t timestamp_value = 0;
344 if (_minictrl_handler_check_validation(handler) != MINICONTROL_ERROR_NONE) {
345 ERR("handler is invalid, invaild parameter");
349 _minictrl_handler_get_service_name(handler, &name);
351 ERR("service name cannot be NULL");
354 _minictrl_handler_get_timestamp(handler, ×tamp_value);
355 if (timestamp_value == 0) {
356 if (_minictrl_handler_set_timestamp(handler, time(NULL)) != MINICONTROL_ERROR_NONE) {
357 ERR("failed to set timestamp");
360 _minictrl_handler_get_priority(handler, &priority);
361 if (priority == NULL) {
362 if (_minictrl_handler_set_priority(handler, MINICONTROL_HDL_PRIORITY_LV3) != MINICONTROL_ERROR_NONE) {
363 ERR("failed to set priority");
369 win = elm_win_add(NULL, "minicontrol", ELM_WIN_SOCKET_IMAGE);
375 name_inter = _minictrl_create_name(name);
377 ERR("Fail to create name_inter for : %s", name);
379 evas_object_del(win);
383 if (!elm_win_socket_listen(win, name_inter, 0, EINA_TRUE)) {
384 ERR("Fail to elm win socket listen");
386 evas_object_del(win);
391 pd = malloc(sizeof(struct _provider_data));
393 ERR("Fail to alloc memory");
395 evas_object_del(win);
400 memset(pd, 0x00, sizeof(struct _provider_data));
401 pd->name = name_inter;
402 pd->state = MINICTRL_STATE_READY;
404 pd->priority = _minictrl_get_priroty_by_name(name);
406 if (_minictrl_handler_clone(handler, &(pd->handler)) != MINICONTROL_ERROR_NONE) {
407 ERR("Fail to clone handler");
409 evas_object_del(win);
415 evas_object_data_set(win ,MINICTRL_DATA_KEY,pd);
417 elm_win_autodel_set(win, EINA_TRUE);
419 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
420 _minictrl_win_del, pd);
422 evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW,
423 _minictrl_win_show, pd);
425 evas_object_event_callback_add(win, EVAS_CALLBACK_HIDE,
426 _minictrl_win_hide, pd);
428 evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE,
429 _minictrl_win_resize, pd);
431 Evas *win_e = evas_object_evas_get(win);
433 evas_event_callback_add(win_e, EVAS_CALLBACK_RENDER_POST,
434 _minictrl_win_realize, pd);
437 pd->sh = _minictrl_dbus_sig_handle_attach(MINICTRL_DBUS_SIG_RUNNING_REQ,
438 _running_req_cb, pd);
440 INFO("new minicontrol created - %s", pd->name);
447 EXPORT_API minicontrol_error_e minicontrol_win_handler_get(Evas_Object *mincontrol, minicontrol_h *handler)
450 ERR("invaild mincontrol object");
451 return MINICONTROL_ERROR_INVALID_PARAMETER;
454 ERR("invaild mincontrol handler");
455 return MINICONTROL_ERROR_INVALID_PARAMETER;
458 struct _provider_data *pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
460 *handler = pd->handler;
462 return MINICONTROL_ERROR_NO_DATA;
465 return MINICONTROL_ERROR_NONE;
468 EXPORT_API minicontrol_error_e minicontrol_win_handler_update(Evas_Object *mincontrol, minicontrol_h handler)
470 struct _provider_data *pd;
471 int ret = MINICONTROL_ERROR_NONE;
474 ERR("mincontrol is NULL, invaild parameter");
475 return MINICONTROL_ERROR_INVALID_PARAMETER;
477 if (_minictrl_handler_check_validation(handler) != MINICONTROL_ERROR_NONE) {
478 ERR("handler is invalid, invaild parameter");
479 return MINICONTROL_ERROR_INVALID_PARAMETER;
482 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
484 ERR("pd is NULL, invaild parameter");
485 return MINICONTROL_ERROR_INVALID_PARAMETER;
489 ERR("pd name is NULL, invaild parameter");
490 return MINICONTROL_ERROR_INVALID_PARAMETER;
493 if (pd->handler != handler) {
494 if (pd->handler != NULL) {
495 _minictrl_handler_destroy(pd->handler);
498 if (_minictrl_handler_clone(handler, &(pd->handler)) != MINICONTROL_ERROR_NONE) {
499 ERR("failed to clone a minicontrol handler");
500 return MINICONTROL_ERROR_OUT_OF_MEMORY;
504 if (pd->state == MINICTRL_STATE_RUNNING) {
505 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST,
506 pd->name, MINICONTROL_REQ_UPDATE_HANDLER, MINICONTROL_REQ_UPDATE_HANDLER
507 , pd->priority, pd->handler);
513 EXPORT_API minicontrol_error_e minicontrol_request(Evas_Object *mincontrol, minicontrol_request_e request)
515 struct _provider_data *pd;
516 int ret = MINICONTROL_ERROR_NONE;
519 ERR("mincontrol is NULL, invaild parameter");
520 return MINICONTROL_ERROR_INVALID_PARAMETER;
523 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
525 ERR("pd is NULL, invaild parameter");
526 return MINICONTROL_ERROR_INVALID_PARAMETER;
530 ERR("pd name is NULL, invaild parameter");
531 return MINICONTROL_ERROR_INVALID_PARAMETER;
534 if (pd->state == MINICTRL_STATE_RUNNING) {
535 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST,
536 pd->name, request, request, pd->priority, pd->handler);