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>
36 #include "dynamicbox.h"
38 #define PUBLIC __attribute__((visibility("default")))
40 #define FILE_SCHEMA "file://"
54 struct dynamicbox_desc {
58 unsigned int last_idx;
60 struct dlist *block_list;
63 struct dynamicbox_buffer_data {
67 /* for Buffer event wrapper */
68 int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *);
78 * @brief These functions are defined in the data-provider-slave
81 const char *(*find_pkgname)(const char *filename);
82 int (*request_update_by_id)(const char *uri);
83 int (*trigger_update_monitor)(const char *id, int is_gbar);
84 int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name);
89 int (*dbox)(const char *pkgname, const char *id, int x, int y, int w, int h);
90 int (*gbar)(const char *pkgname, const char *id, const char *descfile, int x, int y, int w, int h);
94 int (*dbox)(const char *id, int x, int y, int w, int h);
95 int (*gbar)(const char *id, int x, int y, int w, int h);
100 .request_update_by_id = NULL,
101 .trigger_update_monitor = NULL,
102 .update_extra_info = NULL,
103 .is_slave = -1, /* Not initialized */
106 static int send_dbox_updated(const char *pkgname, const char *id, int x, int y, int w, int h)
108 int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
110 if (s_info.is_slave < 0) {
111 /* Must to be checked the slave function first. */
112 s_info.updated.slave.dbox = dlsym(RTLD_DEFAULT, "dynamicbox_send_updated");
113 s_info.updated.slave.gbar = dlsym(RTLD_DEFAULT, "dynamicbox_send_desc_updated");
114 if (s_info.updated.slave.dbox && s_info.updated.slave.gbar) {
116 DbgPrint("Slave detected\n");
118 s_info.updated.app.dbox = dlsym(RTLD_DEFAULT, "dynamicbox_provider_app_dbox_updated");
119 s_info.updated.app.gbar = dlsym(RTLD_DEFAULT, "dynamicbox_provider_app_gbar_updated");
120 if (s_info.updated.app.dbox && s_info.updated.app.gbar) {
122 DbgPrint("App detected\n");
127 if (s_info.is_slave == 0) {
128 ret = s_info.updated.app.dbox(id, x, y, w, h);
129 } else if (s_info.is_slave == 1) {
130 ret = s_info.updated.slave.dbox(pkgname, id, x, y, w, h);
132 dynamicbox_damage_region_t region = {
138 ret = dynamicbox_provider_send_updated(pkgname, id, ®ion);
144 static int send_gbar_updated(const char *pkgname, const char *id, const char *descfile, int x, int y, int w, int h)
146 int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
148 if (s_info.is_slave < 0) {
149 /* Must to be checked the slave function first. */
150 s_info.updated.slave.dbox = dlsym(RTLD_DEFAULT, "dynamicbox_send_updated");
151 s_info.updated.slave.gbar = dlsym(RTLD_DEFAULT, "dynamicbox_send_desc_updated");
152 if (s_info.updated.slave.dbox && s_info.updated.slave.gbar) {
154 DbgPrint("Slave detected\n");
156 s_info.updated.app.dbox = dlsym(RTLD_DEFAULT, "dynamicbox_provider_app_dbox_updated");
157 s_info.updated.app.gbar = dlsym(RTLD_DEFAULT, "dynamicbox_provider_app_gbar_updated");
158 if (s_info.updated.app.dbox && s_info.updated.app.gbar) {
160 DbgPrint("App detected\n");
165 if (s_info.is_slave == 0) {
166 ret = s_info.updated.app.gbar(id, x, y, w, h);
167 } else if (s_info.is_slave == 1) {
168 ret = s_info.updated.slave.gbar(pkgname, id, descfile, x, y, w, h);
170 dynamicbox_damage_region_t region = {
176 ret = dynamicbox_provider_send_desc_updated(pkgname, id, descfile, ®ion);
182 static char *id_to_uri(const char *id)
187 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
189 uri = malloc(uri_len);
194 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
198 static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
202 struct dynamicbox_buffer_data *cbdata = data;
205 pkgname = dynamicbox_provider_buffer_pkgname(buffer);
207 ErrPrint("pkgname is not valid\n");
208 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
211 id = dynamicbox_provider_buffer_id(buffer);
213 ErrPrint("id is not valid[%s]\n", pkgname);
214 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
217 if (cbdata->handler) {
218 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
220 ret = DBOX_STATUS_ERROR_FAULT;
223 switch (event_info->type) {
224 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT:
225 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
226 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
227 case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE:
228 case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP:
229 case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN:
230 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP:
231 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
232 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
233 case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
234 case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
235 case DBOX_BUFFER_EVENT_ACCESS_MOUSE:
236 case DBOX_BUFFER_EVENT_ACCESS_BACK:
237 case DBOX_BUFFER_EVENT_ACCESS_OVER:
238 case DBOX_BUFFER_EVENT_ACCESS_READ:
239 case DBOX_BUFFER_EVENT_ACCESS_ENABLE:
240 case DBOX_BUFFER_EVENT_ACCESS_DISABLE:
241 DbgPrint("Accessibility event: %d\n", event_info->type);
243 (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR);
245 (void)dynamicbox_provider_send_access_status(pkgname, id, ret);
248 case DBOX_BUFFER_EVENT_KEY_UP:
249 case DBOX_BUFFER_EVENT_KEY_DOWN:
250 case DBOX_BUFFER_EVENT_KEY_FOCUS_IN:
251 case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT:
252 DbgPrint("Key event: %d\n", event_info->type);
254 (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR);
256 (void)dynamicbox_provider_send_key_status(pkgname, id, ret);
266 static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
272 PUBLIC const int DBOX_DONE = 0x00;
273 PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02;
274 PUBLIC const int DBOX_USE_NET = 0x04;
276 PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01;
277 PUBLIC const int DBOX_NEED_TO_CREATE = 0x01;
278 PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01;
279 PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08;
281 PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01;
282 PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02;
283 PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04;
284 PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08;
285 PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10;
286 PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100;
287 PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200;
288 PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400;
289 PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800;
291 PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd)
293 struct dynamicbox_desc *handle;
296 handle = calloc(1, sizeof(*handle));
298 ErrPrint("Error: %s\n", strerror(errno));
304 len = strlen(filename) + strlen(".desc") + 1;
305 new_fname = malloc(len);
307 ErrPrint("Error: %s\n", strerror(errno));
311 snprintf(new_fname, len, "%s.desc", filename);
313 new_fname = strdup(filename);
315 ErrPrint("Error: %s\n", strerror(errno));
321 DbgPrint("Open a file %s with merge mode %s\n",
323 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
325 handle->fp = fopen(new_fname, "at");
328 ErrPrint("Failed to open a file: %s\n", strerror(errno));
336 PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle)
343 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
346 dlist_foreach_safe(handle->block_list, l, n, block) {
347 handle->block_list = dlist_remove(handle->block_list, l);
349 fprintf(handle->fp, "{\n");
351 fprintf(handle->fp, "type=%s\n", block->type);
355 fprintf(handle->fp, "part=%s\n", block->part);
359 fprintf(handle->fp, "data=%s\n", block->data);
363 fprintf(handle->fp, "option=%s\n", block->option);
367 fprintf(handle->fp, "id=%s\n", block->id);
370 if (block->target_id) {
371 fprintf(handle->fp, "target=%s\n", block->target_id);
373 fprintf(handle->fp, "}\n");
380 free(block->target_id);
384 if (fclose(handle->fp) != 0) {
385 ErrPrint("fclose: %s\n", strerror(errno));
388 return DBOX_STATUS_ERROR_NONE;
391 PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category)
395 if (!handle || !category) {
396 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
399 block = calloc(1, sizeof(*block));
401 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
404 block->type = strdup(DBOX_DESC_TYPE_INFO);
407 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
410 block->part = strdup("category");
414 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
417 block->data = strdup(category);
422 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
426 block->id = strdup(id);
432 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
436 block->idx = handle->last_idx++;
437 handle->block_list = dlist_append(handle->block_list, block);
441 PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h)
447 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
450 block = calloc(1, sizeof(*block));
452 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
455 block->type = strdup(DBOX_DESC_TYPE_INFO);
458 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
461 block->part = strdup("size");
465 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
469 block->id = strdup(id);
474 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
478 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
479 block->data = strdup(buffer);
484 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
487 block->idx = handle->last_idx++;
488 handle->block_list = dlist_append(handle->block_list, block);
492 PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id)
497 dlist_foreach(handle->block_list, l, block) {
498 if (block->idx == idx) {
499 if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) {
500 ErrPrint("Invalid block is used\n");
501 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
504 free(block->target_id);
505 block->target_id = NULL;
507 if (!id || !strlen(id)) {
508 return DBOX_STATUS_ERROR_NONE;
511 block->target_id = strdup(id);
512 if (!block->target_id) {
513 ErrPrint("Heap: %s\n", strerror(errno));
514 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
517 return DBOX_STATUS_ERROR_NONE;
521 return DBOX_STATUS_ERROR_NOT_EXIST;
527 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)
531 if (!handle || !type) {
532 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
543 block = calloc(1, sizeof(*block));
545 ErrPrint("Heap: %s\n", strerror(errno));
546 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
549 block->type = strdup(type);
551 ErrPrint("Heap: %s\n", strerror(errno));
553 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
556 block->part = strdup(part);
558 ErrPrint("Heap: %s\n", strerror(errno));
561 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
564 block->data = strdup(data);
566 ErrPrint("Heap: %s\n", strerror(errno));
570 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
574 block->option = strdup(option);
575 if (!block->option) {
576 ErrPrint("Heap: %s\n", strerror(errno));
581 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
586 block->id = strdup(id);
588 ErrPrint("Heap: %s\n", strerror(errno));
594 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
598 block->idx = handle->last_idx++;
599 handle->block_list = dlist_append(handle->block_list, block);
603 PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx)
608 if (!handle || idx < 0) {
609 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
612 dlist_foreach(handle->block_list, l, block) {
613 if (block->idx == idx) {
614 handle->block_list = dlist_remove(handle->block_list, l);
620 free(block->target_id);
622 return DBOX_STATUS_ERROR_NONE;
626 return DBOX_STATUS_ERROR_NOT_EXIST;
629 PUBLIC dynamicbox_buffer_h dynamicbox_acquire_buffer(const char *filename, int is_gbar, int width, int height, int pixels, int auto_align, int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *), void *data)
631 struct dynamicbox_buffer_data *user_data;
633 dynamicbox_buffer_h handle;
636 if (!filename || !width || !height) {
637 ErrPrint("Invalid argument: %p(%dx%d)\n", filename, width, height);
641 user_data = calloc(1, sizeof(*user_data));
643 ErrPrint("Heap: %s\n", strerror(errno));
647 user_data->is_gbar = is_gbar;
648 user_data->handler = handler ? handler : default_event_handler;
649 user_data->cbdata = data;
651 uri = id_to_uri(filename);
653 ErrPrint("Heap: %s\n", strerror(errno));
658 if (!s_info.find_pkgname) {
659 s_info.find_pkgname = dlsym(RTLD_DEFAULT, "dynamicbox_find_pkgname");
660 if (!s_info.find_pkgname) {
661 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
668 pkgname = s_info.find_pkgname(uri);
670 ErrPrint("Invalid Request\n");
676 handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data);
683 if (dynamicbox_provider_buffer_acquire(handle, width, height, pixels) < 0) {
684 dynamicbox_provider_buffer_destroy(handle);
689 (void)dynamicbox_provider_buffer_set_user_data(handle, user_data);
693 PUBLIC int dynamicbox_request_update(const char *filename)
699 ErrPrint("Invalid argument\n");
700 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
703 uri = id_to_uri(filename);
705 ErrPrint("Heap: %s\n", strerror(errno));
706 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
709 if (!s_info.request_update_by_id) {
710 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, "dynamicbox_request_update_by_id");
711 if (!s_info.request_update_by_id) {
712 ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n");
714 return DBOX_STATUS_ERROR_FAULT;
717 ret = s_info.request_update_by_id(uri);
722 PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle)
724 return dynamicbox_provider_buffer_resource_id(handle);
727 PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle)
729 struct dynamicbox_buffer_data *user_data;
732 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
735 user_data = dynamicbox_provider_buffer_user_data(handle);
737 free(user_data->content);
738 free(user_data->title);
739 free(user_data->icon);
740 free(user_data->name);
742 dynamicbox_provider_buffer_set_user_data(handle, NULL);
745 (void)dynamicbox_provider_buffer_release(handle);
746 (void)dynamicbox_provider_buffer_destroy(handle);
748 DbgPrint("Release buffer\n");
752 PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle)
754 struct dynamicbox_buffer_data *user_data;
763 user_data = dynamicbox_provider_buffer_user_data(handle);
768 if (user_data->accelerated) {
769 DbgPrint("H/W accelerated buffer is allocated\n");
773 ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size);
775 data = dynamicbox_provider_buffer_ref(handle);
776 if (data && !ret && w > 0 && h > 0 && size > 0) {
777 memset(data, 0, w * h * size);
778 (void)dynamicbox_provider_buffer_sync(handle);
781 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
785 PUBLIC int dynamicbox_unref_buffer(void *buffer)
788 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
791 DbgPrint("Unref buffer\n");
792 return dynamicbox_provider_buffer_unref(buffer);
795 PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle)
797 struct dynamicbox_buffer_data *user_data;
805 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
808 user_data = dynamicbox_provider_buffer_user_data(handle);
810 ErrPrint("Invalid buffer\n");
811 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
814 if (user_data->accelerated) {
815 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
816 return DBOX_STATUS_ERROR_NONE;
819 pkgname = dynamicbox_provider_buffer_pkgname(handle);
821 ErrPrint("Invalid buffer handler\n");
822 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
825 id = dynamicbox_provider_buffer_id(handle);
827 ErrPrint("Invalid buffer handler\n");
828 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
831 (void)dynamicbox_provider_buffer_sync(handle);
833 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
834 ErrPrint("Failed to get size (%s)\n", id);
839 * manipulate the damaged region, so send update event only for the damaged region.
840 * to make more efficient updates
843 if (user_data->is_gbar == 1) {
844 if (send_gbar_updated(pkgname, id, NULL, 0, 0, w, h) < 0) {
845 ErrPrint("Failed to send PD updated (%s)\n", id);
848 if (send_dbox_updated(pkgname, id, 0, 0, w, h) < 0) {
849 ErrPrint("Failed to send updated (%s)\n", id);
853 return DBOX_STATUS_ERROR_NONE;
856 PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle)
859 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
862 return dynamicbox_provider_buffer_is_support_hw(handle);
865 PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle)
867 struct dynamicbox_buffer_data *user_data;
871 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
874 user_data = dynamicbox_provider_buffer_user_data(handle);
876 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
879 if (user_data->accelerated) {
880 return DBOX_STATUS_ERROR_ALREADY;
883 ret = dynamicbox_provider_buffer_create_hw(handle);
884 user_data->accelerated = (ret == 0);
888 PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle)
890 struct dynamicbox_buffer_data *user_data;
893 LOGD("handle is NULL\n");
894 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
897 user_data = dynamicbox_provider_buffer_user_data(handle);
898 if (!user_data || !user_data->accelerated) {
899 LOGD("user_data is NULL\n");
900 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
903 user_data->accelerated = 0;
905 return dynamicbox_provider_buffer_destroy_hw(handle);
908 PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle)
910 struct dynamicbox_buffer_data *user_data;
916 user_data = dynamicbox_provider_buffer_user_data(handle);
917 if (!user_data || !user_data->accelerated) {
921 return dynamicbox_provider_buffer_hw_addr(handle);
924 PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle)
926 struct dynamicbox_buffer_data *user_data;
929 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
932 user_data = dynamicbox_provider_buffer_user_data(handle);
934 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
937 if (!user_data->accelerated) {
938 return DBOX_STATUS_ERROR_NONE;
943 * Do preprocessing for accessing the H/W render buffer
945 return dynamicbox_provider_buffer_pre_render(handle);
948 PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle)
953 struct dynamicbox_buffer_data *user_data;
959 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
962 user_data = dynamicbox_provider_buffer_user_data(handle);
964 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
967 if (!user_data->accelerated) {
968 return DBOX_STATUS_ERROR_NONE;
971 pkgname = dynamicbox_provider_buffer_pkgname(handle);
973 ErrPrint("Invalid buffer handle\n");
974 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
977 id = dynamicbox_provider_buffer_id(handle);
979 ErrPrint("Invalid buffer handler\n");
980 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
983 ret = dynamicbox_provider_buffer_post_render(handle);
985 ErrPrint("Failed to post render processing\n");
989 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
990 ErrPrint("Failed to get size (%s)\n", id);
995 * manipulate the damaged region, so send update event only for the damaged region.
996 * to make more efficient updates
999 if (user_data->is_gbar == 1) {
1000 if (send_gbar_updated(pkgname, id, NULL, 0, 0, w, h) < 0) {
1001 ErrPrint("Failed to send PD updated (%s)\n", id);
1004 if (send_dbox_updated(pkgname, id, 0, 0, w, h) < 0) {
1005 ErrPrint("Failed to send updated (%s)\n", id);
1009 return DBOX_STATUS_ERROR_NONE;
1012 PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle)
1015 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1018 return dynamicbox_provider_buffer_stride(handle);
1021 PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar)
1023 if (!s_info.trigger_update_monitor) {
1024 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, "dynamicbox_trigger_update_monitor");
1025 if (!s_info.trigger_update_monitor) {
1026 ErrPrint("Trigger update monitor function is not exists\n");
1027 return DBOX_STATUS_ERROR_FAULT;
1031 return s_info.trigger_update_monitor(filename, is_gbar);
1034 PUBLIC int dynamicbox_request_close_gbar(const char *pkgname, const char *id, int reason)
1037 int schema_len = strlen(FILE_SCHEMA);
1040 if (!pkgname || !id) {
1041 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1042 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1045 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1046 uri = id_to_uri(id);
1048 ErrPrint("Heap: %s\n", strerror(errno));
1049 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1054 ErrPrint("Heap: %s\n", strerror(errno));
1055 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1059 ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason);
1064 PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id)
1069 uri = id_to_uri(id);
1071 ErrPrint("Heap: %s\n", strerror(errno));
1072 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1075 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1);
1080 PUBLIC int dynamicbox_thaw_scroller(const char *pkgname, const char *id)
1085 uri = id_to_uri(id);
1087 ErrPrint("Heap: %s\n", strerror(errno));
1088 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1091 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 0);
1096 PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1098 dynamicbox_buffer_h handle;
1099 const char *pkgname;
1102 uri = id_to_uri(id);
1104 ErrPrint("Heap: %s\n", strerror(errno));
1105 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1108 if (!s_info.find_pkgname) {
1109 s_info.find_pkgname = dlsym(RTLD_DEFAULT, "dynamicbox_find_pkgname");
1110 if (!s_info.find_pkgname) {
1111 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
1113 return DBOX_STATUS_ERROR_FAULT;
1117 pkgname = s_info.find_pkgname(uri);
1119 ErrPrint("Failed to find a package (%s)\n", uri);
1121 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1124 handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri);
1126 struct dynamicbox_buffer_data *user_data;
1128 user_data = dynamicbox_provider_buffer_user_data(handle);
1130 ErrPrint("User data is not available\n");
1132 return DBOX_STATUS_ERROR_FAULT;
1135 if (content && strlen(content)) {
1138 _content = strdup(content);
1140 if (user_data->content) {
1141 free(user_data->content);
1144 user_data->content = _content;
1146 ErrPrint("Heap: %s\n", strerror(errno));
1150 if (title && strlen(title)) {
1153 _title = strdup(title);
1155 if (user_data->title) {
1156 free(user_data->title);
1159 user_data->title = _title;
1161 ErrPrint("Heap: %s\n", strerror(errno));
1165 if (icon && strlen(icon)) {
1168 _icon = strdup(icon);
1170 if (user_data->icon) {
1171 free(user_data->icon);
1174 user_data->icon = _icon;
1176 ErrPrint("Heap: %s\n", strerror(errno));
1180 if (name && strlen(name)) {
1183 _name = strdup(name);
1185 if (user_data->name) {
1186 free(user_data->name);
1189 user_data->name = _name;
1191 ErrPrint("Heap: %s\n", strerror(errno));
1195 if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1196 ErrPrint("Failed to send extra info (%s)\n", id);
1200 return DBOX_STATUS_ERROR_NONE;
1204 if (!s_info.update_extra_info) {
1205 s_info.update_extra_info = dlsym(RTLD_DEFAULT, "dynamicbox_update_extra_info");
1206 if (!s_info.update_extra_info) {
1207 ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n");
1208 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1212 return s_info.update_extra_info(id, content, title, icon, name);