2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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"
25 #define MINICTRL_PRIORITY_SUFFIX_TOP "__minicontrol_top"
26 #define MINICTRL_PRIORITY_SUFFIX_LOW "__minicontrol_low"
27 #define MINICTRL_DATA_KEY "__minictrl_data_internal"
30 MINICTRL_STATE_READY =0,
31 MINICTRL_STATE_RUNNING,
34 struct _provider_data {
37 minicontrol_priority_e priority;
39 minictrl_sig_handle *sh;
42 static void __provider_data_free(struct _provider_data *pd)
49 _minictrl_dbus_sig_handle_dettach(pd->sh);
55 static int __str_has_suffix(const char *str, const char *suffix)
66 str_len = strlen (str);
67 suffix_len = strlen (suffix);
69 if (str_len < suffix_len)
72 return strcmp(str + str_len - suffix_len, suffix);
75 static void _running_req_cb(void *data, DBusMessage *msg)
77 struct _provider_data *pd;
85 if (pd->state == MINICTRL_STATE_RUNNING) {
88 evas_object_geometry_get(pd->obj, NULL, NULL, &w, &h);
89 _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START,
90 pd->name, w, h, pd->priority);
94 static int minicontrol_win_start(Evas_Object *mincontrol)
96 struct _provider_data *pd;
97 int ret = MINICONTROL_ERROR_NONE;
100 ERR("mincontrol is NULL, invaild parameter");
101 return MINICONTROL_ERROR_INVALID_PARAMETER;
104 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
106 ERR("pd is NULL, invaild parameter");
107 return MINICONTROL_ERROR_INVALID_PARAMETER;
111 ERR("pd name is NULL, invaild parameter");
112 return MINICONTROL_ERROR_INVALID_PARAMETER;
115 if (pd->state != MINICTRL_STATE_RUNNING) {
118 pd->state = MINICTRL_STATE_RUNNING;
120 evas_object_geometry_get(mincontrol, NULL, NULL, &w, &h);
121 _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_EXCLUDE);
122 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START,
123 pd->name, w, h, pd->priority);
129 static int minicontrol_win_stop(Evas_Object *mincontrol)
131 struct _provider_data *pd;
132 int ret = MINICONTROL_ERROR_NONE;
135 ERR("mincontrol is NULL, invaild parameter");
136 return MINICONTROL_ERROR_INVALID_PARAMETER;
139 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
141 ERR("pd is NULL, invaild parameter");
142 return MINICONTROL_ERROR_INVALID_PARAMETER;
146 ERR("pd name is NULL, invaild parameter");
147 return MINICONTROL_ERROR_INVALID_PARAMETER;
149 if (pd->state != MINICTRL_STATE_READY) {
150 pd->state = MINICTRL_STATE_READY;
151 _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_INCLUDE);
152 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_STOP,
153 pd->name, 0, 0, pd->priority);
159 static void _minictrl_win_del(void *data, Evas *e,
160 Evas_Object *obj, void *event_info)
162 struct _provider_data *pd = NULL;
164 minicontrol_win_stop(obj);
166 pd = evas_object_data_get(obj, MINICTRL_DATA_KEY);
167 __provider_data_free(pd);
169 evas_object_data_set(obj, MINICTRL_DATA_KEY, NULL);
172 static void _minictrl_win_hide(void *data, Evas *e,
173 Evas_Object *obj, void *event_info)
175 minicontrol_win_stop(obj);
178 static void _minictrl_win_show(void *data, Evas *e,
179 Evas_Object *obj, void *event_info)
181 minicontrol_win_start(obj);
184 static void _minictrl_win_resize(void *data, Evas *e,
185 Evas_Object *obj, void *event_info)
187 struct _provider_data *pd;
190 ERR("data is NULL, invaild parameter");
195 if (pd->state == MINICTRL_STATE_RUNNING) {
199 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
200 _minictrl_provider_message_send(MINICTRL_DBUS_SIG_RESIZE,
201 pd->name, w, h, pd->priority);
205 static char *_minictrl_create_name(const char *name)
211 ERR("name is NULL, invaild parameter");
215 size = snprintf(NULL, 0, "[%s]", name) + 1;
216 buf = (char *)malloc(sizeof(char) * size);
218 ERR("fail to alloc buf");
222 snprintf(buf, size, "[%s]", name);
227 static minicontrol_priority_e _minictrl_get_priroty_by_name(const char *name)
229 minicontrol_priority_e priority = MINICONTROL_PRIORITY_MIDDLE;
231 if (!__str_has_suffix(name, MINICTRL_PRIORITY_SUFFIX_TOP))
232 priority = MINICONTROL_PRIORITY_TOP;
233 else if (!__str_has_suffix(name, MINICTRL_PRIORITY_SUFFIX_LOW))
234 priority = MINICONTROL_PRIORITY_LOW;
239 EXPORT_API Evas_Object *minicontrol_win_add(const char *name)
241 Evas_Object *win = NULL;
242 char *name_inter = NULL;
243 struct _provider_data *pd;
248 win = elm_win_add(NULL, "minicontrol", ELM_WIN_SOCKET_IMAGE);
252 name_inter = _minictrl_create_name(name);
255 ERR("Fail to create name_inter for : %s", name);
256 evas_object_del(win);
260 if (!elm_win_socket_listen(win, name_inter, 0, EINA_TRUE)) {
261 ERR("Fail to elm win socket listen");
262 evas_object_del(win);
267 pd = malloc(sizeof(struct _provider_data));
269 ERR("Fail to alloc memory");
270 evas_object_del(win);
275 memset(pd, 0x00, sizeof(struct _provider_data));
276 pd->name = name_inter;
277 pd->state = MINICTRL_STATE_READY;
279 pd->priority = _minictrl_get_priroty_by_name(name);
281 evas_object_data_set(win ,MINICTRL_DATA_KEY,pd);
283 elm_win_autodel_set(win, EINA_TRUE);
285 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
286 _minictrl_win_del, pd);
288 evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW,
289 _minictrl_win_show, pd);
291 evas_object_event_callback_add(win, EVAS_CALLBACK_HIDE,
292 _minictrl_win_hide, pd);
294 evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE,
295 _minictrl_win_resize, pd);
297 pd->sh = _minictrl_dbus_sig_handle_attach(MINICTRL_DBUS_SIG_RUNNING_REQ,
298 _running_req_cb, pd);
300 INFO("new minicontrol created - %s", pd->name);
304 EXPORT_API minicontrol_error_e minicontrol_request(Evas_Object *mincontrol, minicontrol_request_e request)
306 struct _provider_data *pd;
307 int ret = MINICONTROL_ERROR_NONE;
310 ERR("mincontrol is NULL, invaild parameter");
311 return MINICONTROL_ERROR_INVALID_PARAMETER;
314 pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY);
316 ERR("pd is NULL, invaild parameter");
317 return MINICONTROL_ERROR_INVALID_PARAMETER;
321 ERR("pd name is NULL, invaild parameter");
322 return MINICONTROL_ERROR_INVALID_PARAMETER;
325 if (pd->state == MINICTRL_STATE_RUNNING) {
326 ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST,
327 pd->name, request, request, pd->priority);