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"
40 #include "internal/dynamicbox.h"
42 #define PUBLIC __attribute__((visibility("default")))
44 #define FILE_SCHEMA "file://"
48 * This value is configurable value.
50 #define FRAME_WAIT_INTERVAL (1.0f/6.0f)
64 struct dynamicbox_desc {
68 unsigned int last_idx;
70 struct dlist *block_list;
73 struct dynamicbox_buffer_data {
77 /* for Buffer event wrapper */
78 int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *);
86 Ecore_Timer *frame_wait_timer;
90 * @brief These functions are defined in the data-provider-slave
93 const char *(*find_pkgname)(const char *filename);
94 int (*request_update_by_id)(const char *uri);
95 int (*trigger_update_monitor)(const char *id, int is_gbar);
96 int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name);
99 LOAD_TYPE_UNKNOWN = -1,
106 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);
110 int (*send)(dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar);
114 .find_pkgname = NULL,
115 .request_update_by_id = NULL,
116 .trigger_update_monitor = NULL,
117 .update_extra_info = NULL,
118 .type = LOAD_TYPE_UNKNOWN, /* Not initialized */
121 #define FUNC_PREFIX "dynamicbox_"
122 #define FUNC_DYNAMICBOX_SEND_UPDATED FUNC_PREFIX "send_buffer_updated"
123 #define FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated"
124 #define FUNC_DYNAMICBOX_FIND_PKGNAME FUNC_PREFIX "find_pkgname"
125 #define FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id"
126 #define FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor"
127 #define FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info"
129 static inline void load_update_function(void)
131 /* Must to be checked the slave function first. */
132 s_info.updated.slave.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_SEND_UPDATED);
133 if (s_info.updated.slave.send) {
134 s_info.type = LOAD_TYPE_SLAVE;
135 DbgPrint("Slave detected\n");
137 s_info.updated.app.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED);
138 if (s_info.updated.app.send) {
139 s_info.type = LOAD_TYPE_APP;
140 DbgPrint("App detected\n");
145 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)
147 int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
149 if (s_info.type == LOAD_TYPE_UNKNOWN) {
150 load_update_function();
153 if (s_info.type == LOAD_TYPE_APP) {
154 ret = s_info.updated.app.send(handle, idx, x, y, w, h, gbar);
155 } else if (s_info.type == LOAD_TYPE_SLAVE) {
157 * pkgname, id are used for finding handle of direct connection.
159 ret = s_info.updated.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile);
161 dynamicbox_damage_region_t region = {
167 ret = dynamicbox_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile);
173 static char *id_to_uri(const char *id)
178 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
180 uri = malloc(uri_len);
185 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
189 static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
193 struct dynamicbox_buffer_data *cbdata = data;
196 pkgname = dynamicbox_provider_buffer_pkgname(buffer);
198 ErrPrint("pkgname is not valid\n");
199 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
202 id = dynamicbox_provider_buffer_id(buffer);
204 ErrPrint("id is not valid[%s]\n", pkgname);
205 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
208 if (cbdata->handler) {
209 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
211 ret = DBOX_STATUS_ERROR_FAULT;
214 switch (event_info->type) {
215 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT:
216 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
217 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
218 case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE:
219 case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP:
220 case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN:
221 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP:
222 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
223 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
224 case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
225 case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
226 case DBOX_BUFFER_EVENT_ACCESS_MOUSE:
227 case DBOX_BUFFER_EVENT_ACCESS_BACK:
228 case DBOX_BUFFER_EVENT_ACCESS_OVER:
229 case DBOX_BUFFER_EVENT_ACCESS_READ:
230 case DBOX_BUFFER_EVENT_ACCESS_ENABLE:
231 case DBOX_BUFFER_EVENT_ACCESS_DISABLE:
232 DbgPrint("Accessibility event: %d\n", event_info->type);
234 (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR);
236 (void)dynamicbox_provider_send_access_status(pkgname, id, ret);
239 case DBOX_BUFFER_EVENT_KEY_UP:
240 case DBOX_BUFFER_EVENT_KEY_DOWN:
241 case DBOX_BUFFER_EVENT_KEY_FOCUS_IN:
242 case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT:
243 DbgPrint("Key event: %d\n", event_info->type);
245 (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR);
247 (void)dynamicbox_provider_send_key_status(pkgname, id, ret);
257 static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
263 PUBLIC const int DBOX_DONE = 0x00;
264 PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02;
265 PUBLIC const int DBOX_USE_NET = 0x04;
267 PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01;
268 PUBLIC const int DBOX_NEED_TO_CREATE = 0x01;
269 PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01;
270 PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08;
272 PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01;
273 PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02;
274 PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04;
275 PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08;
276 PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10;
277 PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100;
278 PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200;
279 PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400;
280 PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800;
282 PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd)
284 struct dynamicbox_desc *handle;
287 handle = calloc(1, sizeof(*handle));
289 ErrPrint("Error: %s\n", strerror(errno));
295 len = strlen(filename) + strlen(".desc") + 1;
296 new_fname = malloc(len);
298 ErrPrint("Error: %s\n", strerror(errno));
302 snprintf(new_fname, len, "%s.desc", filename);
304 new_fname = strdup(filename);
306 ErrPrint("Error: %s\n", strerror(errno));
312 DbgPrint("Open a file %s with merge mode %s\n",
314 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
316 handle->fp = fopen(new_fname, "at");
319 ErrPrint("Failed to open a file: %s\n", strerror(errno));
327 PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle)
334 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
337 dlist_foreach_safe(handle->block_list, l, n, block) {
338 handle->block_list = dlist_remove(handle->block_list, l);
340 fprintf(handle->fp, "{\n");
342 fprintf(handle->fp, "type=%s\n", block->type);
346 fprintf(handle->fp, "part=%s\n", block->part);
350 fprintf(handle->fp, "data=%s\n", block->data);
354 fprintf(handle->fp, "option=%s\n", block->option);
358 fprintf(handle->fp, "id=%s\n", block->id);
361 if (block->target_id) {
362 fprintf(handle->fp, "target=%s\n", block->target_id);
364 fprintf(handle->fp, "}\n");
371 free(block->target_id);
375 if (fclose(handle->fp) != 0) {
376 ErrPrint("fclose: %s\n", strerror(errno));
379 return DBOX_STATUS_ERROR_NONE;
382 PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category)
386 if (!handle || !category) {
387 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
390 block = calloc(1, sizeof(*block));
392 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
395 block->type = strdup(DBOX_DESC_TYPE_INFO);
398 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
401 block->part = strdup("category");
405 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
408 block->data = strdup(category);
413 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
417 block->id = strdup(id);
423 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
427 block->idx = handle->last_idx++;
428 handle->block_list = dlist_append(handle->block_list, block);
432 PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h)
438 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
441 block = calloc(1, sizeof(*block));
443 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
446 block->type = strdup(DBOX_DESC_TYPE_INFO);
449 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
452 block->part = strdup("size");
456 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
460 block->id = strdup(id);
465 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
469 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
470 block->data = strdup(buffer);
475 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
478 block->idx = handle->last_idx++;
479 handle->block_list = dlist_append(handle->block_list, block);
483 PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id)
488 dlist_foreach(handle->block_list, l, block) {
489 if (block->idx == idx) {
490 if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) {
491 ErrPrint("Invalid block is used\n");
492 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
495 free(block->target_id);
496 block->target_id = NULL;
498 if (!id || !strlen(id)) {
499 return DBOX_STATUS_ERROR_NONE;
502 block->target_id = strdup(id);
503 if (!block->target_id) {
504 ErrPrint("Heap: %s\n", strerror(errno));
505 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
508 return DBOX_STATUS_ERROR_NONE;
512 return DBOX_STATUS_ERROR_NOT_EXIST;
518 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)
522 if (!handle || !type) {
523 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
534 block = calloc(1, sizeof(*block));
536 ErrPrint("Heap: %s\n", strerror(errno));
537 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
540 block->type = strdup(type);
542 ErrPrint("Heap: %s\n", strerror(errno));
544 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
547 block->part = strdup(part);
549 ErrPrint("Heap: %s\n", strerror(errno));
552 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
555 block->data = strdup(data);
557 ErrPrint("Heap: %s\n", strerror(errno));
561 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
565 block->option = strdup(option);
566 if (!block->option) {
567 ErrPrint("Heap: %s\n", strerror(errno));
572 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
577 block->id = strdup(id);
579 ErrPrint("Heap: %s\n", strerror(errno));
585 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
589 block->idx = handle->last_idx++;
590 handle->block_list = dlist_append(handle->block_list, block);
594 PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx)
599 if (!handle || idx < 0) {
600 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
603 dlist_foreach(handle->block_list, l, block) {
604 if (block->idx == idx) {
605 handle->block_list = dlist_remove(handle->block_list, l);
611 free(block->target_id);
613 return DBOX_STATUS_ERROR_NONE;
617 return DBOX_STATUS_ERROR_NOT_EXIST;
620 PUBLIC int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixel_size)
624 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
625 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
632 /* To validate the buffer */
633 if (dynamicbox_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
634 ErrPrint("Failed to get buffer size\n");
637 if (_width != width || _height != height || pixel_size != _pixel_size) {
638 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
641 ret = dynamicbox_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
643 ret = dynamicbox_provider_buffer_acquire(handle, width, height, pixel_size);
649 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)
651 struct dynamicbox_buffer_data *user_data;
653 dynamicbox_buffer_h handle;
657 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
661 user_data = calloc(1, sizeof(*user_data));
663 ErrPrint("Heap: %s\n", strerror(errno));
667 user_data->is_gbar = is_gbar;
668 user_data->handler = handler ? handler : default_event_handler;
669 user_data->cbdata = data;
671 uri = id_to_uri(filename);
673 ErrPrint("Heap: %s\n", strerror(errno));
678 if (!s_info.find_pkgname) {
679 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
680 if (!s_info.find_pkgname) {
681 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
688 pkgname = s_info.find_pkgname(uri);
690 ErrPrint("Invalid Request\n");
696 handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data);
703 (void)dynamicbox_provider_buffer_set_user_data(handle, user_data);
707 PUBLIC int dynamicbox_request_update(const char *filename)
713 ErrPrint("Invalid argument\n");
714 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
717 uri = id_to_uri(filename);
719 ErrPrint("Heap: %s\n", strerror(errno));
720 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
723 if (!s_info.request_update_by_id) {
724 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID);
725 if (!s_info.request_update_by_id) {
726 ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n");
728 return DBOX_STATUS_ERROR_FAULT;
732 ret = s_info.request_update_by_id(uri);
737 PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx)
741 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
742 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
746 ret = dynamicbox_provider_buffer_extra_resource_id(handle, idx);
748 ret = dynamicbox_provider_buffer_resource_id(handle);
754 PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx)
758 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
759 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
763 ret = dynamicbox_provider_buffer_extra_release(handle, idx);
765 ret = dynamicbox_provider_buffer_release(handle);
768 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
772 PUBLIC int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle)
774 struct dynamicbox_buffer_data *user_data;
777 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
780 user_data = dynamicbox_provider_buffer_user_data(handle);
782 if (user_data->frame_wait_timer) {
783 ecore_timer_del(user_data->frame_wait_timer);
784 user_data->frame_wait_timer = NULL;
786 free(user_data->content);
787 free(user_data->title);
788 free(user_data->icon);
789 free(user_data->name);
791 dynamicbox_provider_buffer_set_user_data(handle, NULL);
794 DbgPrint("Destroy buffer\n");
795 return dynamicbox_provider_buffer_destroy(handle);
798 PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle)
800 struct dynamicbox_buffer_data *user_data;
809 user_data = dynamicbox_provider_buffer_user_data(handle);
814 if (user_data->accelerated) {
815 DbgPrint("H/W accelerated buffer is allocated\n");
819 ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size);
821 data = dynamicbox_provider_buffer_ref(handle);
822 if (data && !ret && w > 0 && h > 0 && size > 0) {
823 memset(data, 0, w * h * size);
824 (void)dynamicbox_provider_buffer_sync(handle);
827 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
831 PUBLIC int dynamicbox_unref_buffer(void *buffer)
834 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
837 DbgPrint("Unref buffer\n");
838 return dynamicbox_provider_buffer_unref(buffer);
841 PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle)
843 struct dynamicbox_buffer_data *user_data;
852 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
855 user_data = dynamicbox_provider_buffer_user_data(handle);
857 ErrPrint("Invalid buffer\n");
858 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
861 if (user_data->accelerated) {
862 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
863 return DBOX_STATUS_ERROR_NONE;
866 pkgname = dynamicbox_provider_buffer_pkgname(handle);
868 ErrPrint("Invalid buffer handler\n");
869 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
872 id = dynamicbox_provider_buffer_id(handle);
874 ErrPrint("Invalid buffer handler\n");
875 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
878 (void)dynamicbox_provider_buffer_sync(handle);
880 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
881 ErrPrint("Failed to get size (%s)\n", id);
886 * manipulate the damaged region, so send update event only for the damaged region.
887 * to make more efficient updates
889 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
891 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
897 PUBLIC int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx)
899 struct dynamicbox_buffer_data *user_data;
907 user_data = dynamicbox_provider_buffer_user_data(handle);
909 ErrPrint("Invalid buffer\n");
910 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
913 pkgname = dynamicbox_provider_buffer_pkgname(handle);
915 ErrPrint("Invalid buffer handler\n");
916 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
919 id = dynamicbox_provider_buffer_id(handle);
921 ErrPrint("Invalid buffer handler\n");
922 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
925 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
926 ErrPrint("Failed to get size (%s)\n", id);
929 ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL);
931 ErrPrint("Failed to send%supdated (%s) %d\n", user_data->is_gbar ? " GBAR " : " ", id, idx);
937 PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle)
940 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
943 return dynamicbox_provider_buffer_is_support_hw(handle);
946 PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle)
948 struct dynamicbox_buffer_data *user_data;
952 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
955 user_data = dynamicbox_provider_buffer_user_data(handle);
957 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
960 if (user_data->accelerated) {
961 return DBOX_STATUS_ERROR_ALREADY;
964 ret = dynamicbox_provider_buffer_create_hw(handle);
965 user_data->accelerated = (ret == 0);
969 PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle)
971 struct dynamicbox_buffer_data *user_data;
974 LOGD("handle is NULL\n");
975 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
978 user_data = dynamicbox_provider_buffer_user_data(handle);
979 if (!user_data || !user_data->accelerated) {
980 LOGD("user_data is NULL\n");
981 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
984 user_data->accelerated = 0;
986 return dynamicbox_provider_buffer_destroy_hw(handle);
989 PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle)
991 struct dynamicbox_buffer_data *user_data;
997 user_data = dynamicbox_provider_buffer_user_data(handle);
998 if (!user_data || !user_data->accelerated) {
1002 return dynamicbox_provider_buffer_hw_addr(handle);
1005 PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle)
1007 struct dynamicbox_buffer_data *user_data;
1010 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1013 user_data = dynamicbox_provider_buffer_user_data(handle);
1015 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1018 if (!user_data->accelerated) {
1019 return DBOX_STATUS_ERROR_NONE;
1024 * Do preprocessing for accessing the H/W render buffer
1026 return dynamicbox_provider_buffer_pre_render(handle);
1029 static Eina_Bool frame_wait_cb(void *data)
1031 dynamicbox_buffer_h handle = data;
1032 struct dynamicbox_buffer_data *user_data;
1033 const char *pkgname;
1040 user_data = dynamicbox_provider_buffer_user_data(handle);
1042 ErrPrint("Failed to get a user data\n");
1043 return ECORE_CALLBACK_CANCEL;
1046 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1047 id = dynamicbox_provider_buffer_id(handle);
1049 if (!pkgname || !id) {
1050 ErrPrint("Failed to get instance information (%s), (%s)\n", pkgname, id);
1051 user_data->frame_wait_timer = NULL;
1052 return ECORE_CALLBACK_CANCEL;
1055 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1056 ErrPrint("Failed to get size (%s)\n", id);
1059 pixel_size = sizeof(int);
1062 DbgPrint("Frame skip waiting timer is fired (%s)\n", id);
1066 * manipulate the damaged region, so send update event only for the damaged region.
1067 * to make more efficient updates
1069 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1071 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1074 (void)dynamicbox_provider_buffer_clear_frame_skip(handle);
1076 user_data->frame_wait_timer = NULL;
1077 return ECORE_CALLBACK_CANCEL;
1080 PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle)
1083 const char *pkgname;
1085 struct dynamicbox_buffer_data *user_data;
1093 PERF_MARK("post_render");
1094 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1097 user_data = dynamicbox_provider_buffer_user_data(handle);
1099 PERF_MARK("post_render");
1100 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1103 if (!user_data->accelerated) {
1104 PERF_MARK("post_render");
1105 return DBOX_STATUS_ERROR_NONE;
1108 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1110 ErrPrint("Invalid buffer handle\n");
1111 PERF_MARK("post_render");
1112 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1115 id = dynamicbox_provider_buffer_id(handle);
1117 ErrPrint("Invalid buffer handler\n");
1118 PERF_MARK("post_render");
1119 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1122 ret = dynamicbox_provider_buffer_post_render(handle);
1124 ErrPrint("Failed to post render processing\n");
1125 PERF_MARK("post_render");
1129 if (dynamicbox_provider_buffer_frame_skip(handle) == 0) {
1130 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1131 ErrPrint("Failed to get size (%s)\n", id);
1136 * manipulate the damaged region, so send update event only for the damaged region.
1137 * to make more efficient updates
1139 ret = send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1141 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1144 if (user_data->frame_wait_timer) {
1145 ecore_timer_del(user_data->frame_wait_timer);
1146 user_data->frame_wait_timer = NULL;
1149 if (user_data->frame_wait_timer) {
1150 ecore_timer_reset(user_data->frame_wait_timer);
1152 user_data->frame_wait_timer = ecore_timer_add(FRAME_WAIT_INTERVAL, frame_wait_cb, handle);
1153 if (!user_data->frame_wait_timer) {
1154 ErrPrint("Failed to add waiting timer for next frame\n");
1159 PERF_MARK("post_render");
1163 PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle)
1166 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1169 return dynamicbox_provider_buffer_stride(handle);
1172 PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar)
1174 if (!s_info.trigger_update_monitor) {
1175 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR);
1176 if (!s_info.trigger_update_monitor) {
1177 ErrPrint("Trigger update monitor function is not exists\n");
1178 return DBOX_STATUS_ERROR_FAULT;
1182 return s_info.trigger_update_monitor(filename, is_gbar);
1185 PUBLIC int dynamicbox_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1188 int schema_len = strlen(FILE_SCHEMA);
1191 if (!pkgname || !id) {
1192 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1193 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1196 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1197 uri = id_to_uri(id);
1199 ErrPrint("Heap: %s\n", strerror(errno));
1200 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1205 ErrPrint("Heap: %s\n", strerror(errno));
1206 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1210 ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason);
1215 PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id)
1220 uri = id_to_uri(id);
1222 ErrPrint("Heap: %s\n", strerror(errno));
1223 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1226 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1);
1231 PUBLIC int dynamicbox_thaw_scroller(const char *pkgname, const char *id)
1236 uri = id_to_uri(id);
1238 ErrPrint("Heap: %s\n", strerror(errno));
1239 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1242 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 0);
1247 PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1249 dynamicbox_buffer_h handle;
1250 const char *pkgname;
1253 uri = id_to_uri(id);
1255 ErrPrint("Heap: %s\n", strerror(errno));
1256 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1259 if (!s_info.find_pkgname) {
1260 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
1261 if (!s_info.find_pkgname) {
1262 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
1264 return DBOX_STATUS_ERROR_FAULT;
1268 pkgname = s_info.find_pkgname(uri);
1270 ErrPrint("Failed to find a package (%s)\n", uri);
1272 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1275 handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri);
1277 struct dynamicbox_buffer_data *user_data;
1279 user_data = dynamicbox_provider_buffer_user_data(handle);
1281 ErrPrint("User data is not available\n");
1283 return DBOX_STATUS_ERROR_FAULT;
1286 if (content && strlen(content)) {
1289 _content = strdup(content);
1291 if (user_data->content) {
1292 free(user_data->content);
1295 user_data->content = _content;
1297 ErrPrint("Heap: %s\n", strerror(errno));
1301 if (title && strlen(title)) {
1304 _title = strdup(title);
1306 if (user_data->title) {
1307 free(user_data->title);
1310 user_data->title = _title;
1312 ErrPrint("Heap: %s\n", strerror(errno));
1316 if (icon && strlen(icon)) {
1319 _icon = strdup(icon);
1321 if (user_data->icon) {
1322 free(user_data->icon);
1325 user_data->icon = _icon;
1327 ErrPrint("Heap: %s\n", strerror(errno));
1331 if (name && strlen(name)) {
1334 _name = strdup(name);
1336 if (user_data->name) {
1337 free(user_data->name);
1340 user_data->name = _name;
1342 ErrPrint("Heap: %s\n", strerror(errno));
1346 if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1347 ErrPrint("Failed to send extra info (%s)\n", id);
1351 return DBOX_STATUS_ERROR_NONE;
1355 if (!s_info.update_extra_info) {
1356 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO);
1357 if (!s_info.update_extra_info) {
1358 ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n");
1359 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1363 return s_info.update_extra_info(id, content, title, icon, name);