X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fminicontrol-provider.c;h=bda4b06fce1464000f7bf4a3cea520128ba54286;hb=4a768f097381c8a138e0c2ab27cc1c7100f49086;hp=dab9c18539e3828b802192d4ea450e2299665428;hpb=27559d1af567eaaeb86409e549209423daac60b0;p=apps%2Fhome%2Fminicontrol.git diff --git a/src/minicontrol-provider.c b/src/minicontrol-provider.c index dab9c18..bda4b06 100755 --- a/src/minicontrol-provider.c +++ b/src/minicontrol-provider.c @@ -1,14 +1,14 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2013-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.tizenopensource.org/license + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, + * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. @@ -21,6 +21,7 @@ #include "minicontrol-internal.h" #include "minicontrol-provider.h" #include "minicontrol-log.h" +#include "minicontrol-handler.h" #define MINICTRL_PRIORITY_SUFFIX_TOP "__minicontrol_top" #define MINICTRL_PRIORITY_SUFFIX_LOW "__minicontrol_low" @@ -37,6 +38,7 @@ struct _provider_data { minicontrol_priority_e priority; Evas_Object *obj; minictrl_sig_handle *sh; + minicontrol_h handler; }; static void __provider_data_free(struct _provider_data *pd) @@ -48,6 +50,9 @@ static void __provider_data_free(struct _provider_data *pd) if (pd->sh) _minictrl_dbus_sig_handle_dettach(pd->sh); + if (pd->handler) + _minictrl_handler_destroy(pd->handler); + free(pd); } } @@ -87,7 +92,7 @@ static void _running_req_cb(void *data, DBusMessage *msg) Evas_Coord h = 0; evas_object_geometry_get(pd->obj, NULL, NULL, &w, &h); _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START, - pd->name, w, h, pd->priority); + pd->name, w, h, pd->priority, pd->handler); } } @@ -120,9 +125,43 @@ static int minicontrol_win_start(Evas_Object *mincontrol) evas_object_geometry_get(mincontrol, NULL, NULL, &w, &h); _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_EXCLUDE); ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_START, - pd->name, w, h, pd->priority); + pd->name, w, h, pd->priority, pd->handler); + } + + return ret; +} + +static int minicontrol_win_realize(Evas_Object *mincontrol) +{ + struct _provider_data *pd; + int ret = MINICONTROL_ERROR_NONE; + + if (!mincontrol) { + ERR("mincontrol is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY); + if (!pd) { + ERR("pd is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; } + if (!pd->name) { + ERR("pd name is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + Evas_Coord w = 0; + Evas_Coord h = 0; + if (pd->state != MINICTRL_STATE_RUNNING) { + pd->state = MINICTRL_STATE_RUNNING; + } + + evas_object_geometry_get(mincontrol, NULL, NULL, &w, &h); + ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REALIZE, + pd->name, w, h, pd->priority, pd->handler); + return ret; } @@ -150,7 +189,7 @@ static int minicontrol_win_stop(Evas_Object *mincontrol) pd->state = MINICTRL_STATE_READY; _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_INCLUDE); ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_STOP, - pd->name, 0, 0, pd->priority); + pd->name, 0, 0, pd->priority, pd->handler); } return ret; @@ -181,6 +220,35 @@ static void _minictrl_win_show(void *data, Evas *e, minicontrol_win_start(obj); } +static void _minictrl_win_realize(void *data, Evas *e, + Evas_Object *obj, void *event_info) +{ + struct _provider_data *pd; + + if (!data) { + ERR("data is NULL, invaild parameter"); + return; + } + pd = data; + + if (!pd->obj) { + ERR("minicontrol object is NULL, invalid parameter"); + return; + } + + Evas *win_e = evas_object_evas_get(pd->obj); + if (win_e != NULL) { + evas_event_callback_del(win_e, EVAS_CALLBACK_RENDER_POST, + _minictrl_win_realize); + } + + minicontrol_win_realize(pd->obj); + + if (pd->handler != NULL) { + _minictrl_handler_set_state(pd->handler, 1); + } +} + static void _minictrl_win_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) { @@ -198,7 +266,7 @@ static void _minictrl_win_resize(void *data, Evas *e, evas_object_geometry_get(obj, NULL, NULL, &w, &h); _minictrl_provider_message_send(MINICTRL_DBUS_SIG_RESIZE, - pd->name, w, h, pd->priority); + pd->name, w, h, pd->priority, pd->handler); } } @@ -238,27 +306,83 @@ static minicontrol_priority_e _minictrl_get_priroty_by_name(const char *name) EXPORT_API Evas_Object *minicontrol_win_add(const char *name) { + minicontrol_h handler = NULL; + Evas_Object *win = NULL; + + if (_minictrl_handler_create(&handler) == MINICONTROL_ERROR_NONE) { + if (_minictrl_handler_set_service_name(handler, name) != MINICONTROL_ERROR_NONE) { + ERR("failed to service name"); + _minictrl_handler_destroy(handler); + return NULL; + } + if (_minictrl_handler_set_timestamp(handler, time(NULL)) != MINICONTROL_ERROR_NONE) { + ERR("failed to set timestamp"); + } + if (_minictrl_handler_set_priority(handler, MINICONTROL_HDL_PRIORITY_LV3) != MINICONTROL_ERROR_NONE) { + ERR("failed to set priority"); + } + } else { + ERR("Failed to create minicontrol handler"); + return NULL; + } + + win = minicontrol_win_add_by_handler(handler); + _minictrl_handler_destroy(handler); + + return win; +} + +EXPORT_API Evas_Object *minicontrol_win_add_by_handler(minicontrol_h handler) +{ Evas_Object *win = NULL; + char *name = NULL; char *name_inter = NULL; + char *priority = NULL; struct _provider_data *pd; + time_t timestamp_value = 0; - if (!name) + if (_minictrl_handler_check_validation(handler) != MINICONTROL_ERROR_NONE) { + ERR("handler is invalid, invaild parameter"); return NULL; + } + + _minictrl_handler_get_service_name(handler, &name); + if (name == NULL) { + ERR("service name cannot be NULL"); + return NULL; + } + _minictrl_handler_get_timestamp(handler, ×tamp_value); + if (timestamp_value == 0) { + if (_minictrl_handler_set_timestamp(handler, time(NULL)) != MINICONTROL_ERROR_NONE) { + ERR("failed to set timestamp"); + } + } + _minictrl_handler_get_priority(handler, &priority); + if (priority == NULL) { + if (_minictrl_handler_set_priority(handler, MINICONTROL_HDL_PRIORITY_LV3) != MINICONTROL_ERROR_NONE) { + ERR("failed to set priority"); + } + } else { + free(priority); + } win = elm_win_add(NULL, "minicontrol", ELM_WIN_SOCKET_IMAGE); - if (!win) + if (!win) { + free(name); return NULL; + } name_inter = _minictrl_create_name(name); if (!name_inter) { - ERR("Fail to create name_inter for : %s", name); + free(name); evas_object_del(win); return NULL; } if (!elm_win_socket_listen(win, name_inter, 0, EINA_TRUE)) { ERR("Fail to elm win socket listen"); + free(name); evas_object_del(win); free(name_inter); return NULL; @@ -267,6 +391,7 @@ EXPORT_API Evas_Object *minicontrol_win_add(const char *name) pd = malloc(sizeof(struct _provider_data)); if (!pd) { ERR("Fail to alloc memory"); + free(name); evas_object_del(win); free(name_inter); return NULL; @@ -278,6 +403,15 @@ EXPORT_API Evas_Object *minicontrol_win_add(const char *name) pd->obj = win; pd->priority = _minictrl_get_priroty_by_name(name); + if (_minictrl_handler_clone(handler, &(pd->handler)) != MINICONTROL_ERROR_NONE) { + ERR("Fail to clone handler"); + free(name); + evas_object_del(win); + free(name_inter); + free(pd); + return NULL; + } + evas_object_data_set(win ,MINICTRL_DATA_KEY,pd); elm_win_autodel_set(win, EINA_TRUE); @@ -294,13 +428,88 @@ EXPORT_API Evas_Object *minicontrol_win_add(const char *name) evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _minictrl_win_resize, pd); + Evas *win_e = evas_object_evas_get(win); + if (win_e != NULL) { + evas_event_callback_add(win_e, EVAS_CALLBACK_RENDER_POST, + _minictrl_win_realize, pd); + } + pd->sh = _minictrl_dbus_sig_handle_attach(MINICTRL_DBUS_SIG_RUNNING_REQ, _running_req_cb, pd); INFO("new minicontrol created - %s", pd->name); + + free(name); + return win; } +EXPORT_API minicontrol_error_e minicontrol_win_handler_get(Evas_Object *mincontrol, minicontrol_h *handler) +{ + if (!mincontrol) { + ERR("invaild mincontrol object"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + if (!handler) { + ERR("invaild mincontrol handler"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + struct _provider_data *pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY); + if (pd != NULL) { + *handler = pd->handler; + } else { + return MINICONTROL_ERROR_NO_DATA; + } + + return MINICONTROL_ERROR_NONE; +} + +EXPORT_API minicontrol_error_e minicontrol_win_handler_update(Evas_Object *mincontrol, minicontrol_h handler) +{ + struct _provider_data *pd; + int ret = MINICONTROL_ERROR_NONE; + + if (!mincontrol) { + ERR("mincontrol is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + if (_minictrl_handler_check_validation(handler) != MINICONTROL_ERROR_NONE) { + ERR("handler is invalid, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + pd = evas_object_data_get(mincontrol, MINICTRL_DATA_KEY); + if (!pd) { + ERR("pd is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + if (!pd->name) { + ERR("pd name is NULL, invaild parameter"); + return MINICONTROL_ERROR_INVALID_PARAMETER; + } + + if (pd->handler != handler) { + if (pd->handler != NULL) { + _minictrl_handler_destroy(pd->handler); + pd->handler = NULL; + } + if (_minictrl_handler_clone(handler, &(pd->handler)) != MINICONTROL_ERROR_NONE) { + ERR("failed to clone a minicontrol handler"); + return MINICONTROL_ERROR_OUT_OF_MEMORY; + } + } + + if (pd->state == MINICTRL_STATE_RUNNING) { + ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST, + pd->name, MINICONTROL_REQ_UPDATE_HANDLER, MINICONTROL_REQ_UPDATE_HANDLER + , pd->priority, pd->handler); + } + + return ret; +} + EXPORT_API minicontrol_error_e minicontrol_request(Evas_Object *mincontrol, minicontrol_request_e request) { struct _provider_data *pd; @@ -324,7 +533,7 @@ EXPORT_API minicontrol_error_e minicontrol_request(Evas_Object *mincontrol, mini if (pd->state == MINICTRL_STATE_RUNNING) { ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST, - pd->name, request, request, pd->priority); + pd->name, request, request, pd->priority, pd->handler); } return ret;