tizen 2.4 release
[apps/home/minicontrol.git] / src / minicontrol-viewer.c
old mode 100755 (executable)
new mode 100644 (file)
index 5e6e5dd..4d024f4
 #include "minicontrol-internal.h"
 #include "minicontrol-type.h"
 #include "minicontrol-viewer.h"
+#include "minicontrol-viewer-internal.h"
 #include "minicontrol-log.h"
 
 #define MINICTRL_PLUG_DATA_KEY "__minictrl_plug_name"
 
-static void _minictrl_plug_server_del(Ecore_Evas *ee)
+struct _minicontrol_viewer {
+       minictrl_sig_handle *event_sh;
+       minicontrol_viewer_event_cb callback;
+       void *user_data;
+};
+
+static struct _minicontrol_viewer *g_minicontrol_viewer_h = NULL;
+
+EXPORT_API int minicontrol_viewer_send_event(const char *minicontrol_name, minicontrol_viewer_event_e event, bundle *event_arg)
+{
+       int ret = MINICONTROL_ERROR_NONE;
+
+       if (minicontrol_name == NULL) {
+               ERR("appid is NULL, invaild parameter");
+               return MINICONTROL_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = _minictrl_send_event(MINICTRL_DBUS_SIG_TO_PROVIDER, minicontrol_name, event, event_arg);
+
+       return ret;
+}
+
+
+static void _sig_to_viewer_handler_cb(void *data, DBusMessage *msg)
 {
-       char *svr_name = NULL;
+       DBusError err;
+       char *minicontrol_name = NULL;
+       minicontrol_event_e event;
+       dbus_bool_t dbus_ret;
+       bundle *event_arg_bundle = NULL;
+       bundle_raw *serialized_arg = NULL;
+       unsigned int serialized_arg_length = 0;
+
+       dbus_error_init(&err); /* Does not allocate any memory. the error only needs to be freed if it is set at some point. */
 
-       svr_name = ecore_evas_data_get(ee, MINICTRL_PLUG_DATA_KEY);
-       if (!svr_name) {
-               ERR("fail to get svr_name");
+       dbus_ret = dbus_message_get_args(msg, &err,
+                               DBUS_TYPE_STRING, &minicontrol_name,
+                               DBUS_TYPE_INT32, &event,
+                               DBUS_TYPE_STRING, &serialized_arg,
+                               DBUS_TYPE_UINT32, &serialized_arg_length,
+                               DBUS_TYPE_INVALID);
+
+       if (!dbus_ret) {
+               ERR("fail to get args : %s", err.message);
+               dbus_error_free(&err);
                return;
        }
 
-       INFO("server - %s is deleted", svr_name);
+       if (serialized_arg_length != 0) {
+               event_arg_bundle = bundle_decode(serialized_arg, serialized_arg_length);
 
-       /* send message to remve plug */
-       _minictrl_provider_message_send(MINICTRL_DBUS_SIG_STOP,
-                                       svr_name, 0, 0,
-                                       MINICONTROL_PRIORITY_LOW, NULL);
-       _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_INCLUDE);
+               if (event_arg_bundle == NULL) {
+                       ERR("fail to deserialize arguments");
+                       return;
+               }
+       }
+
+       if (g_minicontrol_viewer_h->callback)
+               g_minicontrol_viewer_h->callback(event, minicontrol_name, event_arg_bundle, g_minicontrol_viewer_h->user_data);
+
+       bundle_free(event_arg_bundle);
+       dbus_error_free(&err);
 }
 
-static void _minictrl_plug_del(void *data, Evas *e,
-                       Evas_Object *obj, void *event_info)
+
+EXPORT_API int minicontrol_viewer_set_event_cb(minicontrol_viewer_event_cb callback, void *data)
 {
-       Ecore_Evas *ee = NULL;
-       char *svr_name = NULL;
+       if (!callback) {
+               ERR("MINICONTROL_ERROR_INVALID_PARAMETER");
+               return MINICONTROL_ERROR_INVALID_PARAMETER;
+       }
 
-       ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
-       if (!ee)
+       INFO("g_minicontrol_viewer_h [%p]", g_minicontrol_viewer_h);
+
+       if (g_minicontrol_viewer_h == NULL) {
+               minictrl_sig_handle *event_sh;
+               struct _minicontrol_viewer *minicontrol_viewer_h;
+
+               event_sh = _minictrl_dbus_sig_handle_attach(MINICTRL_DBUS_SIG_TO_VIEWER, _sig_to_viewer_handler_cb, NULL);
+               if (!event_sh) {
+                       ERR("fail to _minictrl_dbus_sig_handle_attach - %s", MINICTRL_DBUS_SIG_TO_VIEWER);
+                       return MINICONTROL_ERROR_IPC_FAILURE;
+               }
+
+               minicontrol_viewer_h = malloc(sizeof(struct _minicontrol_viewer));
+               if (!minicontrol_viewer_h) {
+                       ERR("fail to alloc minicontrol_viewer_h");
+                       _minictrl_dbus_sig_handle_dettach(event_sh);
+                       return MINICONTROL_ERROR_OUT_OF_MEMORY;
+               }
+
+               minicontrol_viewer_h->event_sh = event_sh;
+               g_minicontrol_viewer_h = minicontrol_viewer_h;
+       }
+
+       g_minicontrol_viewer_h->callback = callback;
+       g_minicontrol_viewer_h->user_data = data;
+       INFO("callback[%p], data[%p]", callback, data);
+
+       return _minictrl_viewer_req_message_send();
+}
+
+EXPORT_API int minicontrol_viewer_unset_event_cb(void)
+{
+       if (!g_minicontrol_viewer_h)
+               return MINICONTROL_ERROR_NONE;
+
+       if (g_minicontrol_viewer_h->event_sh)
+               _minictrl_dbus_sig_handle_dettach(g_minicontrol_viewer_h->event_sh);
+
+       free(g_minicontrol_viewer_h);
+       g_minicontrol_viewer_h = NULL;
+
+       return MINICONTROL_ERROR_NONE;
+}
+
+static void _minictrl_plug_server_del(Ecore_Evas *ee)
+{
+       char *minicontrol_name = NULL;
+
+       minicontrol_name = ecore_evas_data_get(ee, MINICTRL_PLUG_DATA_KEY);
+       if (!minicontrol_name) {
+               ERR("fail to get minicontrol_name");
                return;
+       }
 
-       svr_name = ecore_evas_data_get(ee, MINICTRL_PLUG_DATA_KEY);
-       if (svr_name)
-               free(svr_name);
+       INFO("server - %s is deleted", minicontrol_name);
 
+       /* To avoid retrying to free minicontrol_name again, set MINICTRL_PLUG_DATA_KEY as NULL */
        ecore_evas_data_set(ee, MINICTRL_PLUG_DATA_KEY, NULL);
+
+       /* send message to remove plug */
+       _minictrl_provider_message_send(MINICONTROL_EVENT_STOP, minicontrol_name, 0, 0, MINICONTROL_PRIORITY_LOW);
+       _minictrl_provider_proc_send(MINICONTROL_DBUS_PROC_INCLUDE);
+       free(minicontrol_name);
 }
 
-EXPORT_API
-Evas_Object *minicontrol_viewer_image_object_get(const Evas_Object *obj)
+static void _minictrl_plug_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
-       return elm_plug_image_object_get(obj);
+       Ecore_Evas *ee = data;
+       char *minicontrol_name = NULL;
+
+       if (!ee)
+               return;
+
+       minicontrol_name = ecore_evas_data_get(ee, MINICTRL_PLUG_DATA_KEY);
+
+       if (minicontrol_name) {
+               /* Sending an event 'MINICONTROL_EVENT_REQUEST_HIDE' should be done by minicontrol viewer manually */
+               free(minicontrol_name);
+               ecore_evas_data_set(ee, MINICTRL_PLUG_DATA_KEY, NULL);
+       }
 }
 
-EXPORT_API Evas_Object *minicontrol_viewer_add(Evas_Object *parent,
-                                               const char *svr_name)
+EXPORT_API Evas_Object *minicontrol_viewer_add(Evas_Object *parent, const char *minicontrol_name)
 {
        Evas_Object *plug = NULL;
        Evas_Object *plug_img = NULL;
        Ecore_Evas *ee = NULL;
 
+       if (parent == NULL || minicontrol_name == NULL) {
+               ERR("invalid parameter");
+               set_last_result(MINICONTROL_ERROR_INVALID_PARAMETER);
+               return NULL;
+       }
+
        plug = elm_plug_add(parent);
+
        if (!plug) {
                ERR("fail to create plug");
+               set_last_result(MINICONTROL_ERROR_ELM_FAILURE);
                return NULL;
        }
 
-       if (!elm_plug_connect(plug, svr_name, 0, EINA_TRUE)) {
-               ERR("Cannot connect plug[%s]", svr_name);
+       if (!elm_plug_connect(plug, minicontrol_name, 0, EINA_TRUE)) {
+               ERR("Cannot connect plug[%s]", minicontrol_name);
+               set_last_result(MINICONTROL_ERROR_ELM_FAILURE);
                evas_object_del(plug);
                return NULL;
        }
@@ -88,31 +209,62 @@ EXPORT_API Evas_Object *minicontrol_viewer_add(Evas_Object *parent,
        plug_img = elm_plug_image_object_get(plug);
 
        ee = ecore_evas_object_ecore_evas_get(plug_img);
-       ecore_evas_data_set(ee, MINICTRL_PLUG_DATA_KEY, strdup(svr_name));
+       ecore_evas_data_set(ee, MINICTRL_PLUG_DATA_KEY, strdup(minicontrol_name));
        ecore_evas_callback_delete_request_set(ee, _minictrl_plug_server_del);
 
-       evas_object_event_callback_add(plug, EVAS_CALLBACK_DEL,
-                                       _minictrl_plug_del, plug);
+       evas_object_event_callback_add(plug, EVAS_CALLBACK_DEL, _minictrl_plug_del, ee);
 
        return plug;
 }
 
-EXPORT_API minicontrol_error_e minicontrol_viewer_request(const char *appid, minicontrol_request_e request, int value)
+EXPORT_API Evas_Object *minicontrol_viewer_image_object_get(const Evas_Object *obj)
+{
+       return elm_plug_image_object_get(obj);
+}
+
+EXPORT_API int minicontrol_viewer_request(const char *minicontrol_name, minicontrol_request_e request, int value)
 {
        int ret = MINICONTROL_ERROR_NONE;
+       minicontrol_viewer_event_e event  = 0;
+       bundle *event_arg_bundle = NULL;
+       char bundle_value_buffer[BUNDLE_BUFFER_LENGTH] = { 0, };
 
-       if (appid == NULL) {
+       if (minicontrol_name == NULL) {
                ERR("appid is NULL, invaild parameter");
                return MINICONTROL_ERROR_INVALID_PARAMETER;
        }
-       if (request != MINICONTROL_REQ_ROTATE_PROVIDER
-               && request != MINICONTROL_REQ_PROVIDER_PAUSE
-               && request != MINICONTROL_REQ_PROVIDER_RESUME) {
-               return MINICONTROL_ERROR_INVALID_PARAMETER;
+
+       switch(request) {
+       case MINICONTROL_REQ_ROTATE_PROVIDER: {
+               event = MINICONTROL_EVENT_REPORT_ANGLE;
+               event_arg_bundle = bundle_create();
+
+               if (event_arg_bundle == NULL) {
+                       ERR("fail to create a bundle instance");
+                       ret = MINICONTROL_ERROR_OUT_OF_MEMORY;
+                       goto out;
+               }
+
+               snprintf(bundle_value_buffer, BUNDLE_BUFFER_LENGTH, "%d", value);
+
+               bundle_add_str(event_arg_bundle, "angle", bundle_value_buffer);
+               break;
        }
+       case MINICONTROL_REQ_NONE:
+       case MINICONTROL_REQ_HIDE_VIEWER:
+       case MINICONTROL_REQ_FREEZE_SCROLL_VIEWER:
+       case MINICONTROL_REQ_UNFREEZE_SCROLL_VIEWER:
+       case MINICONTROL_REQ_REPORT_VIEWER_ANGLE:
+       default :
+               ret = MINICONTROL_ERROR_INVALID_PARAMETER;
+               goto out;
+       }
+
+       _minictrl_send_event(MINICTRL_DBUS_SIG_TO_PROVIDER, minicontrol_name, event, event_arg_bundle);
 
-       ret = _minictrl_provider_message_send(MINICTRL_DBUS_SIG_REQUEST,
-                       appid, request, value, MINICONTROL_PRIORITY_MIDDLE, NULL);
+out:
+       if (event_arg_bundle)
+               bundle_free(event_arg_bundle);
 
        return ret;
 }