2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (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://floralicense.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.
19 #include <stdlib.h> /* malloc */
20 #include <string.h> /* strdup */
22 #include <unistd.h> /* access */
27 #include <dynamicbox_errno.h>
28 #include <dynamicbox_service.h>
29 #include <dynamicbox_provider.h>
30 #include <dynamicbox_provider_buffer.h>
31 #include <dynamicbox_conf.h>
32 #include <dynamicbox_buffer.h>
39 #include "dynamicbox.h"
41 #define PUBLIC __attribute__((visibility("default")))
43 #define FILE_SCHEMA "file://"
47 * This value is configurable value.
49 #define FRAME_WAIT_INTERVAL (1.0f/6.0f)
63 struct dynamicbox_desc {
67 unsigned int last_idx;
69 struct dlist *block_list;
72 struct dynamicbox_buffer_data {
76 /* for Buffer event wrapper */
77 int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *);
85 Ecore_Timer *frame_wait_timer;
89 * @brief These functions are defined in the data-provider-slave
92 const char *(*find_pkgname)(const char *filename);
93 int (*request_update_by_id)(const char *uri);
94 int (*trigger_update_monitor)(const char *id, int is_gbar);
95 int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name);
98 LOAD_TYPE_UNKNOWN = -1,
105 int (*send)(const char *pkgname, const char *id, dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile);
109 int (*send)(dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar);
113 .find_pkgname = NULL,
114 .request_update_by_id = NULL,
115 .trigger_update_monitor = NULL,
116 .update_extra_info = NULL,
117 .type = LOAD_TYPE_UNKNOWN, /* Not initialized */
120 #define FUNC_PREFIX "dynamicbox_"
121 #define FUNC_DYNAMICBOX_SEND_UPDATED FUNC_PREFIX "send_buffer_updated"
122 #define FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated"
123 #define FUNC_DYNAMICBOX_FIND_PKGNAME FUNC_PREFIX "find_pkgname"
124 #define FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id"
125 #define FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor"
126 #define FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info"
128 static inline void load_update_function(void)
130 /* Must to be checked the slave function first. */
131 s_info.updated.slave.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_SEND_UPDATED);
132 if (s_info.updated.slave.send) {
133 s_info.type = LOAD_TYPE_SLAVE;
134 DbgPrint("Slave detected\n");
136 s_info.updated.app.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED);
137 if (s_info.updated.app.send) {
138 s_info.type = LOAD_TYPE_APP;
139 DbgPrint("App detected\n");
144 static int send_updated(const char *pkgname, const char *id, dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile)
146 int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
148 if (s_info.type == LOAD_TYPE_UNKNOWN) {
149 load_update_function();
152 if (s_info.type == LOAD_TYPE_APP) {
153 ret = s_info.updated.app.send(handle, idx, x, y, w, h, gbar);
154 } else if (s_info.type == LOAD_TYPE_SLAVE) {
156 * pkgname, id are used for finding handle of direct connection.
158 ret = s_info.updated.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile);
160 dynamicbox_damage_region_t region = {
166 ret = dynamicbox_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile);
172 static char *id_to_uri(const char *id)
177 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
179 uri = malloc(uri_len);
184 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
188 static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
192 struct dynamicbox_buffer_data *cbdata = data;
195 pkgname = dynamicbox_provider_buffer_pkgname(buffer);
197 ErrPrint("pkgname is not valid\n");
198 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
201 id = dynamicbox_provider_buffer_id(buffer);
203 ErrPrint("id is not valid[%s]\n", pkgname);
204 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
207 if (cbdata->handler) {
208 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
210 ret = DBOX_STATUS_ERROR_FAULT;
213 switch (event_info->type) {
214 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT:
215 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
216 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
217 case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE:
218 case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP:
219 case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN:
220 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP:
221 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
222 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
223 case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
224 case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
225 case DBOX_BUFFER_EVENT_ACCESS_MOUSE:
226 case DBOX_BUFFER_EVENT_ACCESS_BACK:
227 case DBOX_BUFFER_EVENT_ACCESS_OVER:
228 case DBOX_BUFFER_EVENT_ACCESS_READ:
229 case DBOX_BUFFER_EVENT_ACCESS_ENABLE:
230 case DBOX_BUFFER_EVENT_ACCESS_DISABLE:
231 DbgPrint("Accessibility event: %d\n", event_info->type);
233 (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR);
235 (void)dynamicbox_provider_send_access_status(pkgname, id, ret);
238 case DBOX_BUFFER_EVENT_KEY_UP:
239 case DBOX_BUFFER_EVENT_KEY_DOWN:
240 case DBOX_BUFFER_EVENT_KEY_FOCUS_IN:
241 case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT:
242 DbgPrint("Key event: %d\n", event_info->type);
244 (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR);
246 (void)dynamicbox_provider_send_key_status(pkgname, id, ret);
256 static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
262 PUBLIC const int DBOX_DONE = 0x00;
263 PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02;
264 PUBLIC const int DBOX_USE_NET = 0x04;
266 PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01;
267 PUBLIC const int DBOX_NEED_TO_CREATE = 0x01;
268 PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01;
269 PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08;
271 PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01;
272 PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02;
273 PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04;
274 PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08;
275 PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10;
276 PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100;
277 PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200;
278 PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400;
279 PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800;
281 PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd)
283 struct dynamicbox_desc *handle;
286 handle = calloc(1, sizeof(*handle));
288 ErrPrint("Error: %s\n", strerror(errno));
294 len = strlen(filename) + strlen(".desc") + 1;
295 new_fname = malloc(len);
297 ErrPrint("Error: %s\n", strerror(errno));
301 snprintf(new_fname, len, "%s.desc", filename);
303 new_fname = strdup(filename);
305 ErrPrint("Error: %s\n", strerror(errno));
311 DbgPrint("Open a file %s with merge mode %s\n",
313 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
315 handle->fp = fopen(new_fname, "at");
318 ErrPrint("Failed to open a file: %s\n", strerror(errno));
326 PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle)
333 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
336 dlist_foreach_safe(handle->block_list, l, n, block) {
337 handle->block_list = dlist_remove(handle->block_list, l);
339 fprintf(handle->fp, "{\n");
341 fprintf(handle->fp, "type=%s\n", block->type);
345 fprintf(handle->fp, "part=%s\n", block->part);
349 fprintf(handle->fp, "data=%s\n", block->data);
353 fprintf(handle->fp, "option=%s\n", block->option);
357 fprintf(handle->fp, "id=%s\n", block->id);
360 if (block->target_id) {
361 fprintf(handle->fp, "target=%s\n", block->target_id);
363 fprintf(handle->fp, "}\n");
370 free(block->target_id);
374 if (fclose(handle->fp) != 0) {
375 ErrPrint("fclose: %s\n", strerror(errno));
378 return DBOX_STATUS_ERROR_NONE;
381 PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category)
385 if (!handle || !category) {
386 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
389 block = calloc(1, sizeof(*block));
391 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
394 block->type = strdup(DBOX_DESC_TYPE_INFO);
397 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
400 block->part = strdup("category");
404 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
407 block->data = strdup(category);
412 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
416 block->id = strdup(id);
422 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
426 block->idx = handle->last_idx++;
427 handle->block_list = dlist_append(handle->block_list, block);
431 PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h)
437 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
440 block = calloc(1, sizeof(*block));
442 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
445 block->type = strdup(DBOX_DESC_TYPE_INFO);
448 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
451 block->part = strdup("size");
455 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
459 block->id = strdup(id);
464 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
468 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
469 block->data = strdup(buffer);
474 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
477 block->idx = handle->last_idx++;
478 handle->block_list = dlist_append(handle->block_list, block);
482 PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id)
487 dlist_foreach(handle->block_list, l, block) {
488 if (block->idx == idx) {
489 if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) {
490 ErrPrint("Invalid block is used\n");
491 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
494 free(block->target_id);
495 block->target_id = NULL;
497 if (!id || !strlen(id)) {
498 return DBOX_STATUS_ERROR_NONE;
501 block->target_id = strdup(id);
502 if (!block->target_id) {
503 ErrPrint("Heap: %s\n", strerror(errno));
504 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
507 return DBOX_STATUS_ERROR_NONE;
511 return DBOX_STATUS_ERROR_NOT_EXIST;
517 PUBLIC int dynamicbox_desc_add_block(struct dynamicbox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option)
521 if (!handle || !type) {
522 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
533 block = calloc(1, sizeof(*block));
535 ErrPrint("Heap: %s\n", strerror(errno));
536 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
539 block->type = strdup(type);
541 ErrPrint("Heap: %s\n", strerror(errno));
543 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
546 block->part = strdup(part);
548 ErrPrint("Heap: %s\n", strerror(errno));
551 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
554 block->data = strdup(data);
556 ErrPrint("Heap: %s\n", strerror(errno));
560 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
564 block->option = strdup(option);
565 if (!block->option) {
566 ErrPrint("Heap: %s\n", strerror(errno));
571 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
576 block->id = strdup(id);
578 ErrPrint("Heap: %s\n", strerror(errno));
584 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
588 block->idx = handle->last_idx++;
589 handle->block_list = dlist_append(handle->block_list, block);
593 PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx)
598 if (!handle || idx < 0) {
599 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
602 dlist_foreach(handle->block_list, l, block) {
603 if (block->idx == idx) {
604 handle->block_list = dlist_remove(handle->block_list, l);
610 free(block->target_id);
612 return DBOX_STATUS_ERROR_NONE;
616 return DBOX_STATUS_ERROR_NOT_EXIST;
619 PUBLIC int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixel_size)
623 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
624 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
631 /* To validate the buffer */
632 if (dynamicbox_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
633 ErrPrint("Failed to get buffer size\n");
636 if (_width != width || _height != height || pixel_size != _pixel_size) {
637 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
640 ret = dynamicbox_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
642 ret = dynamicbox_provider_buffer_acquire(handle, width, height, pixel_size);
648 PUBLIC dynamicbox_buffer_h dynamicbox_create_buffer(const char *filename, int is_gbar, int auto_align, int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *), void *data)
650 struct dynamicbox_buffer_data *user_data;
652 dynamicbox_buffer_h handle;
656 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
660 user_data = calloc(1, sizeof(*user_data));
662 ErrPrint("Heap: %s\n", strerror(errno));
666 user_data->is_gbar = is_gbar;
667 user_data->handler = handler ? handler : default_event_handler;
668 user_data->cbdata = data;
670 uri = id_to_uri(filename);
672 ErrPrint("Heap: %s\n", strerror(errno));
677 if (!s_info.find_pkgname) {
678 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
679 if (!s_info.find_pkgname) {
680 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
687 pkgname = s_info.find_pkgname(uri);
689 ErrPrint("Invalid Request\n");
695 handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data);
702 (void)dynamicbox_provider_buffer_set_user_data(handle, user_data);
706 PUBLIC int dynamicbox_request_update(const char *filename)
712 ErrPrint("Invalid argument\n");
713 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
716 uri = id_to_uri(filename);
718 ErrPrint("Heap: %s\n", strerror(errno));
719 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
722 if (!s_info.request_update_by_id) {
723 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID);
724 if (!s_info.request_update_by_id) {
725 ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n");
727 return DBOX_STATUS_ERROR_FAULT;
731 ret = s_info.request_update_by_id(uri);
736 PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx)
740 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
741 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
745 ret = dynamicbox_provider_buffer_extra_resource_id(handle, idx);
747 ret = dynamicbox_provider_buffer_resource_id(handle);
753 PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx)
757 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
758 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
762 ret = dynamicbox_provider_buffer_extra_release(handle, idx);
764 ret = dynamicbox_provider_buffer_release(handle);
767 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
771 PUBLIC int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle)
773 struct dynamicbox_buffer_data *user_data;
776 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
779 user_data = dynamicbox_provider_buffer_user_data(handle);
781 if (user_data->frame_wait_timer) {
782 ecore_timer_del(user_data->frame_wait_timer);
783 user_data->frame_wait_timer = NULL;
785 free(user_data->content);
786 free(user_data->title);
787 free(user_data->icon);
788 free(user_data->name);
790 dynamicbox_provider_buffer_set_user_data(handle, NULL);
793 DbgPrint("Destroy buffer\n");
794 return dynamicbox_provider_buffer_destroy(handle);
797 PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle)
799 struct dynamicbox_buffer_data *user_data;
808 user_data = dynamicbox_provider_buffer_user_data(handle);
813 if (user_data->accelerated) {
814 DbgPrint("H/W accelerated buffer is allocated\n");
818 ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size);
820 data = dynamicbox_provider_buffer_ref(handle);
821 if (data && !ret && w > 0 && h > 0 && size > 0) {
822 memset(data, 0, w * h * size);
823 (void)dynamicbox_provider_buffer_sync(handle);
826 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
830 PUBLIC int dynamicbox_unref_buffer(void *buffer)
833 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
836 DbgPrint("Unref buffer\n");
837 return dynamicbox_provider_buffer_unref(buffer);
840 PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle)
842 struct dynamicbox_buffer_data *user_data;
851 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
854 user_data = dynamicbox_provider_buffer_user_data(handle);
856 ErrPrint("Invalid buffer\n");
857 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
860 if (user_data->accelerated) {
861 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
862 return DBOX_STATUS_ERROR_NONE;
865 pkgname = dynamicbox_provider_buffer_pkgname(handle);
867 ErrPrint("Invalid buffer handler\n");
868 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
871 id = dynamicbox_provider_buffer_id(handle);
873 ErrPrint("Invalid buffer handler\n");
874 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
877 (void)dynamicbox_provider_buffer_sync(handle);
879 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
880 ErrPrint("Failed to get size (%s)\n", id);
885 * manipulate the damaged region, so send update event only for the damaged region.
886 * to make more efficient updates
888 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
890 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
896 PUBLIC int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx)
898 struct dynamicbox_buffer_data *user_data;
906 user_data = dynamicbox_provider_buffer_user_data(handle);
908 ErrPrint("Invalid buffer\n");
909 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
912 pkgname = dynamicbox_provider_buffer_pkgname(handle);
914 ErrPrint("Invalid buffer handler\n");
915 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
918 id = dynamicbox_provider_buffer_id(handle);
920 ErrPrint("Invalid buffer handler\n");
921 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
924 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
925 ErrPrint("Failed to get size (%s)\n", id);
928 ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL);
930 ErrPrint("Failed to send%supdated (%s) %d\n", user_data->is_gbar ? " GBAR " : " ", id, idx);
936 PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle)
939 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
942 return dynamicbox_provider_buffer_is_support_hw(handle);
945 PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle)
947 struct dynamicbox_buffer_data *user_data;
951 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
954 user_data = dynamicbox_provider_buffer_user_data(handle);
956 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
959 if (user_data->accelerated) {
960 return DBOX_STATUS_ERROR_ALREADY;
963 ret = dynamicbox_provider_buffer_create_hw(handle);
964 user_data->accelerated = (ret == 0);
968 PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle)
970 struct dynamicbox_buffer_data *user_data;
973 LOGD("handle is NULL\n");
974 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
977 user_data = dynamicbox_provider_buffer_user_data(handle);
978 if (!user_data || !user_data->accelerated) {
979 LOGD("user_data is NULL\n");
980 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
983 user_data->accelerated = 0;
985 return dynamicbox_provider_buffer_destroy_hw(handle);
988 PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle)
990 struct dynamicbox_buffer_data *user_data;
996 user_data = dynamicbox_provider_buffer_user_data(handle);
997 if (!user_data || !user_data->accelerated) {
1001 return dynamicbox_provider_buffer_hw_addr(handle);
1004 PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle)
1006 struct dynamicbox_buffer_data *user_data;
1009 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1012 user_data = dynamicbox_provider_buffer_user_data(handle);
1014 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1017 if (!user_data->accelerated) {
1018 return DBOX_STATUS_ERROR_NONE;
1023 * Do preprocessing for accessing the H/W render buffer
1025 return dynamicbox_provider_buffer_pre_render(handle);
1028 static Eina_Bool frame_wait_cb(void *data)
1030 dynamicbox_buffer_h handle = data;
1031 struct dynamicbox_buffer_data *user_data;
1032 const char *pkgname;
1039 user_data = dynamicbox_provider_buffer_user_data(handle);
1041 ErrPrint("Failed to get a user data\n");
1042 return ECORE_CALLBACK_CANCEL;
1045 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1046 id = dynamicbox_provider_buffer_id(handle);
1048 if (!pkgname || !id) {
1049 ErrPrint("Failed to get instance information (%s), (%s)\n", pkgname, id);
1050 user_data->frame_wait_timer = NULL;
1051 return ECORE_CALLBACK_CANCEL;
1054 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1055 ErrPrint("Failed to get size (%s)\n", id);
1058 pixel_size = sizeof(int);
1061 DbgPrint("Frame skip waiting timer is fired (%s)\n", id);
1065 * manipulate the damaged region, so send update event only for the damaged region.
1066 * to make more efficient updates
1068 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1070 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1073 (void)dynamicbox_provider_buffer_clear_frame_skip(handle);
1075 user_data->frame_wait_timer = NULL;
1076 return ECORE_CALLBACK_CANCEL;
1079 PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle)
1082 const char *pkgname;
1084 struct dynamicbox_buffer_data *user_data;
1092 PERF_MARK("post_render");
1093 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1096 user_data = dynamicbox_provider_buffer_user_data(handle);
1098 PERF_MARK("post_render");
1099 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1102 if (!user_data->accelerated) {
1103 PERF_MARK("post_render");
1104 return DBOX_STATUS_ERROR_NONE;
1107 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1109 ErrPrint("Invalid buffer handle\n");
1110 PERF_MARK("post_render");
1111 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1114 id = dynamicbox_provider_buffer_id(handle);
1116 ErrPrint("Invalid buffer handler\n");
1117 PERF_MARK("post_render");
1118 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1121 ret = dynamicbox_provider_buffer_post_render(handle);
1123 ErrPrint("Failed to post render processing\n");
1124 PERF_MARK("post_render");
1128 if (dynamicbox_provider_buffer_frame_skip(handle) == 0) {
1129 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1130 ErrPrint("Failed to get size (%s)\n", id);
1135 * manipulate the damaged region, so send update event only for the damaged region.
1136 * to make more efficient updates
1138 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1140 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1143 if (user_data->frame_wait_timer) {
1144 ecore_timer_del(user_data->frame_wait_timer);
1145 user_data->frame_wait_timer = NULL;
1148 if (user_data->frame_wait_timer) {
1149 ecore_timer_reset(user_data->frame_wait_timer);
1151 user_data->frame_wait_timer = ecore_timer_add(FRAME_WAIT_INTERVAL, frame_wait_cb, handle);
1152 if (!user_data->frame_wait_timer) {
1153 ErrPrint("Failed to add waiting timer for next frame\n");
1158 PERF_MARK("post_render");
1162 PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle)
1165 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1168 return dynamicbox_provider_buffer_stride(handle);
1171 PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar)
1173 if (!s_info.trigger_update_monitor) {
1174 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR);
1175 if (!s_info.trigger_update_monitor) {
1176 ErrPrint("Trigger update monitor function is not exists\n");
1177 return DBOX_STATUS_ERROR_FAULT;
1181 return s_info.trigger_update_monitor(filename, is_gbar);
1184 PUBLIC int dynamicbox_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1187 int schema_len = strlen(FILE_SCHEMA);
1190 if (!pkgname || !id) {
1191 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1192 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1195 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1196 uri = id_to_uri(id);
1198 ErrPrint("Heap: %s\n", strerror(errno));
1199 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1204 ErrPrint("Heap: %s\n", strerror(errno));
1205 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1209 ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason);
1214 PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id)
1219 uri = id_to_uri(id);
1221 ErrPrint("Heap: %s\n", strerror(errno));
1222 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1225 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1);
1230 PUBLIC int dynamicbox_thaw_scroller(const char *pkgname, const char *id)
1235 uri = id_to_uri(id);
1237 ErrPrint("Heap: %s\n", strerror(errno));
1238 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1241 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 0);
1246 PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1248 dynamicbox_buffer_h handle;
1249 const char *pkgname;
1252 uri = id_to_uri(id);
1254 ErrPrint("Heap: %s\n", strerror(errno));
1255 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1258 if (!s_info.find_pkgname) {
1259 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
1260 if (!s_info.find_pkgname) {
1261 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
1263 return DBOX_STATUS_ERROR_FAULT;
1267 pkgname = s_info.find_pkgname(uri);
1269 ErrPrint("Failed to find a package (%s)\n", uri);
1271 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1274 handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri);
1276 struct dynamicbox_buffer_data *user_data;
1278 user_data = dynamicbox_provider_buffer_user_data(handle);
1280 ErrPrint("User data is not available\n");
1282 return DBOX_STATUS_ERROR_FAULT;
1285 if (content && strlen(content)) {
1288 _content = strdup(content);
1290 if (user_data->content) {
1291 free(user_data->content);
1294 user_data->content = _content;
1296 ErrPrint("Heap: %s\n", strerror(errno));
1300 if (title && strlen(title)) {
1303 _title = strdup(title);
1305 if (user_data->title) {
1306 free(user_data->title);
1309 user_data->title = _title;
1311 ErrPrint("Heap: %s\n", strerror(errno));
1315 if (icon && strlen(icon)) {
1318 _icon = strdup(icon);
1320 if (user_data->icon) {
1321 free(user_data->icon);
1324 user_data->icon = _icon;
1326 ErrPrint("Heap: %s\n", strerror(errno));
1330 if (name && strlen(name)) {
1333 _name = strdup(name);
1335 if (user_data->name) {
1336 free(user_data->name);
1339 user_data->name = _name;
1341 ErrPrint("Heap: %s\n", strerror(errno));
1345 if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1346 ErrPrint("Failed to send extra info (%s)\n", id);
1350 return DBOX_STATUS_ERROR_NONE;
1354 if (!s_info.update_extra_info) {
1355 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO);
1356 if (!s_info.update_extra_info) {
1357 ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n");
1358 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1362 return s_info.update_extra_info(id, content, title, icon, name);