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>
38 #include "dynamicbox.h"
40 #define PUBLIC __attribute__((visibility("default")))
42 #define FILE_SCHEMA "file://"
56 struct dynamicbox_desc {
60 unsigned int last_idx;
62 struct dlist *block_list;
65 struct dynamicbox_buffer_data {
69 /* for Buffer event wrapper */
70 int (*handler)(dynamicbox_buffer_h , dynamicbox_buffer_event_data_t, void *);
80 * @brief These functions are defined in the data-provider-slave
83 const char *(*find_pkgname)(const char *filename);
84 int (*request_update_by_id)(const char *uri);
85 int (*trigger_update_monitor)(const char *id, int is_gbar);
86 int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name);
89 LOAD_TYPE_UNKNOWN = -1,
96 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);
100 int (*send)(dynamicbox_buffer_h handle, int idx, int x, int y, int w, int h, int gbar);
104 .find_pkgname = NULL,
105 .request_update_by_id = NULL,
106 .trigger_update_monitor = NULL,
107 .update_extra_info = NULL,
108 .type = LOAD_TYPE_UNKNOWN, /* Not initialized */
111 #define FUNC_PREFIX "dynamicbox_"
112 #define FUNC_DYNAMICBOX_SEND_UPDATED FUNC_PREFIX "send_buffer_updated"
113 #define FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated"
114 #define FUNC_DYNAMICBOX_FIND_PKGNAME FUNC_PREFIX "find_pkgname"
115 #define FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id"
116 #define FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor"
117 #define FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info"
119 static inline void load_update_function(void)
121 /* Must to be checked the slave function first. */
122 s_info.updated.slave.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_SEND_UPDATED);
123 if (s_info.updated.slave.send) {
124 s_info.type = LOAD_TYPE_SLAVE;
125 DbgPrint("Slave detected\n");
127 s_info.updated.app.send = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED);
128 if (s_info.updated.app.send) {
129 s_info.type = LOAD_TYPE_APP;
130 DbgPrint("App detected\n");
135 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)
137 int ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
139 if (s_info.type == LOAD_TYPE_UNKNOWN) {
140 load_update_function();
143 if (s_info.type == LOAD_TYPE_APP) {
144 ret = s_info.updated.app.send(handle, idx, x, y, w, h, gbar);
145 } else if (s_info.type == LOAD_TYPE_SLAVE) {
147 * pkgname, id are used for finding handle of direct connection.
149 ret = s_info.updated.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile);
151 dynamicbox_damage_region_t region = {
157 ret = dynamicbox_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile);
163 static char *id_to_uri(const char *id)
168 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
170 uri = malloc(uri_len);
175 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
179 static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
183 struct dynamicbox_buffer_data *cbdata = data;
186 pkgname = dynamicbox_provider_buffer_pkgname(buffer);
188 ErrPrint("pkgname is not valid\n");
189 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
192 id = dynamicbox_provider_buffer_id(buffer);
194 ErrPrint("id is not valid[%s]\n", pkgname);
195 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
198 if (cbdata->handler) {
199 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
201 ret = DBOX_STATUS_ERROR_FAULT;
204 switch (event_info->type) {
205 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT:
206 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
207 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
208 case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE:
209 case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP:
210 case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN:
211 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP:
212 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
213 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
214 case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
215 case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
216 case DBOX_BUFFER_EVENT_ACCESS_MOUSE:
217 case DBOX_BUFFER_EVENT_ACCESS_BACK:
218 case DBOX_BUFFER_EVENT_ACCESS_OVER:
219 case DBOX_BUFFER_EVENT_ACCESS_READ:
220 case DBOX_BUFFER_EVENT_ACCESS_ENABLE:
221 case DBOX_BUFFER_EVENT_ACCESS_DISABLE:
222 DbgPrint("Accessibility event: %d\n", event_info->type);
224 (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR);
226 (void)dynamicbox_provider_send_access_status(pkgname, id, ret);
229 case DBOX_BUFFER_EVENT_KEY_UP:
230 case DBOX_BUFFER_EVENT_KEY_DOWN:
231 case DBOX_BUFFER_EVENT_KEY_FOCUS_IN:
232 case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT:
233 DbgPrint("Key event: %d\n", event_info->type);
235 (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR);
237 (void)dynamicbox_provider_send_key_status(pkgname, id, ret);
247 static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
253 PUBLIC const int DBOX_DONE = 0x00;
254 PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02;
255 PUBLIC const int DBOX_USE_NET = 0x04;
257 PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01;
258 PUBLIC const int DBOX_NEED_TO_CREATE = 0x01;
259 PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01;
260 PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08;
262 PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01;
263 PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02;
264 PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04;
265 PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08;
266 PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10;
267 PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100;
268 PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200;
269 PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400;
270 PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800;
272 PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd)
274 struct dynamicbox_desc *handle;
277 handle = calloc(1, sizeof(*handle));
279 ErrPrint("Error: %s\n", strerror(errno));
285 len = strlen(filename) + strlen(".desc") + 1;
286 new_fname = malloc(len);
288 ErrPrint("Error: %s\n", strerror(errno));
292 snprintf(new_fname, len, "%s.desc", filename);
294 new_fname = strdup(filename);
296 ErrPrint("Error: %s\n", strerror(errno));
302 DbgPrint("Open a file %s with merge mode %s\n",
304 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
306 handle->fp = fopen(new_fname, "at");
309 ErrPrint("Failed to open a file: %s\n", strerror(errno));
317 PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle)
324 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
327 dlist_foreach_safe(handle->block_list, l, n, block) {
328 handle->block_list = dlist_remove(handle->block_list, l);
330 fprintf(handle->fp, "{\n");
332 fprintf(handle->fp, "type=%s\n", block->type);
336 fprintf(handle->fp, "part=%s\n", block->part);
340 fprintf(handle->fp, "data=%s\n", block->data);
344 fprintf(handle->fp, "option=%s\n", block->option);
348 fprintf(handle->fp, "id=%s\n", block->id);
351 if (block->target_id) {
352 fprintf(handle->fp, "target=%s\n", block->target_id);
354 fprintf(handle->fp, "}\n");
361 free(block->target_id);
365 if (fclose(handle->fp) != 0) {
366 ErrPrint("fclose: %s\n", strerror(errno));
369 return DBOX_STATUS_ERROR_NONE;
372 PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category)
376 if (!handle || !category) {
377 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
380 block = calloc(1, sizeof(*block));
382 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
385 block->type = strdup(DBOX_DESC_TYPE_INFO);
388 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
391 block->part = strdup("category");
395 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
398 block->data = strdup(category);
403 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
407 block->id = strdup(id);
413 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
417 block->idx = handle->last_idx++;
418 handle->block_list = dlist_append(handle->block_list, block);
422 PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h)
428 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
431 block = calloc(1, sizeof(*block));
433 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
436 block->type = strdup(DBOX_DESC_TYPE_INFO);
439 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
442 block->part = strdup("size");
446 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
450 block->id = strdup(id);
455 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
459 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
460 block->data = strdup(buffer);
465 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
468 block->idx = handle->last_idx++;
469 handle->block_list = dlist_append(handle->block_list, block);
473 PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id)
478 dlist_foreach(handle->block_list, l, block) {
479 if (block->idx == idx) {
480 if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) {
481 ErrPrint("Invalid block is used\n");
482 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
485 free(block->target_id);
486 block->target_id = NULL;
488 if (!id || !strlen(id)) {
489 return DBOX_STATUS_ERROR_NONE;
492 block->target_id = strdup(id);
493 if (!block->target_id) {
494 ErrPrint("Heap: %s\n", strerror(errno));
495 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
498 return DBOX_STATUS_ERROR_NONE;
502 return DBOX_STATUS_ERROR_NOT_EXIST;
508 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)
512 if (!handle || !type) {
513 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
524 block = calloc(1, sizeof(*block));
526 ErrPrint("Heap: %s\n", strerror(errno));
527 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
530 block->type = strdup(type);
532 ErrPrint("Heap: %s\n", strerror(errno));
534 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
537 block->part = strdup(part);
539 ErrPrint("Heap: %s\n", strerror(errno));
542 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
545 block->data = strdup(data);
547 ErrPrint("Heap: %s\n", strerror(errno));
551 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
555 block->option = strdup(option);
556 if (!block->option) {
557 ErrPrint("Heap: %s\n", strerror(errno));
562 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
567 block->id = strdup(id);
569 ErrPrint("Heap: %s\n", strerror(errno));
575 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
579 block->idx = handle->last_idx++;
580 handle->block_list = dlist_append(handle->block_list, block);
584 PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx)
589 if (!handle || idx < 0) {
590 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
593 dlist_foreach(handle->block_list, l, block) {
594 if (block->idx == idx) {
595 handle->block_list = dlist_remove(handle->block_list, l);
601 free(block->target_id);
603 return DBOX_STATUS_ERROR_NONE;
607 return DBOX_STATUS_ERROR_NOT_EXIST;
610 PUBLIC int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixel_size)
614 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
615 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
622 /* To validate the buffer */
623 if (dynamicbox_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
624 ErrPrint("Failed to get buffer size\n");
627 if (_width != width || _height != height || pixel_size != _pixel_size) {
628 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
631 ret = dynamicbox_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
633 ret = dynamicbox_provider_buffer_acquire(handle, width, height, pixel_size);
639 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)
641 struct dynamicbox_buffer_data *user_data;
643 dynamicbox_buffer_h handle;
647 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
651 user_data = calloc(1, sizeof(*user_data));
653 ErrPrint("Heap: %s\n", strerror(errno));
657 user_data->is_gbar = is_gbar;
658 user_data->handler = handler ? handler : default_event_handler;
659 user_data->cbdata = data;
661 uri = id_to_uri(filename);
663 ErrPrint("Heap: %s\n", strerror(errno));
668 if (!s_info.find_pkgname) {
669 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
670 if (!s_info.find_pkgname) {
671 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
678 pkgname = s_info.find_pkgname(uri);
680 ErrPrint("Invalid Request\n");
686 handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data);
693 (void)dynamicbox_provider_buffer_set_user_data(handle, user_data);
697 PUBLIC int dynamicbox_request_update(const char *filename)
703 ErrPrint("Invalid argument\n");
704 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
707 uri = id_to_uri(filename);
709 ErrPrint("Heap: %s\n", strerror(errno));
710 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
713 if (!s_info.request_update_by_id) {
714 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID);
715 if (!s_info.request_update_by_id) {
716 ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n");
718 return DBOX_STATUS_ERROR_FAULT;
722 ret = s_info.request_update_by_id(uri);
727 PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx)
731 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
732 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
736 ret = dynamicbox_provider_buffer_extra_resource_id(handle, idx);
738 ret = dynamicbox_provider_buffer_resource_id(handle);
744 PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx)
748 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
749 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
753 ret = dynamicbox_provider_buffer_extra_release(handle, idx);
755 ret = dynamicbox_provider_buffer_release(handle);
758 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
762 PUBLIC int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle)
764 struct dynamicbox_buffer_data *user_data;
767 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
770 user_data = dynamicbox_provider_buffer_user_data(handle);
772 free(user_data->content);
773 free(user_data->title);
774 free(user_data->icon);
775 free(user_data->name);
777 dynamicbox_provider_buffer_set_user_data(handle, NULL);
780 DbgPrint("Destroy buffer\n");
781 return dynamicbox_provider_buffer_destroy(handle);
784 PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle)
786 struct dynamicbox_buffer_data *user_data;
795 user_data = dynamicbox_provider_buffer_user_data(handle);
800 if (user_data->accelerated) {
801 DbgPrint("H/W accelerated buffer is allocated\n");
805 ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size);
807 data = dynamicbox_provider_buffer_ref(handle);
808 if (data && !ret && w > 0 && h > 0 && size > 0) {
809 memset(data, 0, w * h * size);
810 (void)dynamicbox_provider_buffer_sync(handle);
813 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
817 PUBLIC int dynamicbox_unref_buffer(void *buffer)
820 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
823 DbgPrint("Unref buffer\n");
824 return dynamicbox_provider_buffer_unref(buffer);
827 PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle)
829 struct dynamicbox_buffer_data *user_data;
837 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
840 user_data = dynamicbox_provider_buffer_user_data(handle);
842 ErrPrint("Invalid buffer\n");
843 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
846 if (user_data->accelerated) {
847 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
848 return DBOX_STATUS_ERROR_NONE;
851 pkgname = dynamicbox_provider_buffer_pkgname(handle);
853 ErrPrint("Invalid buffer handler\n");
854 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
857 id = dynamicbox_provider_buffer_id(handle);
859 ErrPrint("Invalid buffer handler\n");
860 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
863 (void)dynamicbox_provider_buffer_sync(handle);
865 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
866 ErrPrint("Failed to get size (%s)\n", id);
871 * manipulate the damaged region, so send update event only for the damaged region.
872 * to make more efficient updates
875 if (user_data->is_gbar == 1) {
876 if (send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
877 ErrPrint("Failed to send GBAR updated (%s)\n", id);
880 if (send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
881 ErrPrint("Failed to send updated (%s)\n", id);
885 return DBOX_STATUS_ERROR_NONE;
888 PUBLIC int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx)
890 struct dynamicbox_buffer_data *user_data;
898 user_data = dynamicbox_provider_buffer_user_data(handle);
900 ErrPrint("Invalid buffer\n");
901 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
904 pkgname = dynamicbox_provider_buffer_pkgname(handle);
906 ErrPrint("Invalid buffer handler\n");
907 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
910 id = dynamicbox_provider_buffer_id(handle);
912 ErrPrint("Invalid buffer handler\n");
913 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
916 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
917 ErrPrint("Failed to get size (%s)\n", id);
920 ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL);
922 ErrPrint("Failed to send GBAR updated (%s) %d\n", id, idx);
928 PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle)
931 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
934 return dynamicbox_provider_buffer_is_support_hw(handle);
937 PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle)
939 struct dynamicbox_buffer_data *user_data;
943 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
946 user_data = dynamicbox_provider_buffer_user_data(handle);
948 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
951 if (user_data->accelerated) {
952 return DBOX_STATUS_ERROR_ALREADY;
955 ret = dynamicbox_provider_buffer_create_hw(handle);
956 user_data->accelerated = (ret == 0);
960 PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle)
962 struct dynamicbox_buffer_data *user_data;
965 LOGD("handle is NULL\n");
966 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
969 user_data = dynamicbox_provider_buffer_user_data(handle);
970 if (!user_data || !user_data->accelerated) {
971 LOGD("user_data is NULL\n");
972 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
975 user_data->accelerated = 0;
977 return dynamicbox_provider_buffer_destroy_hw(handle);
980 PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle)
982 struct dynamicbox_buffer_data *user_data;
988 user_data = dynamicbox_provider_buffer_user_data(handle);
989 if (!user_data || !user_data->accelerated) {
993 return dynamicbox_provider_buffer_hw_addr(handle);
996 PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle)
998 struct dynamicbox_buffer_data *user_data;
1001 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1004 user_data = dynamicbox_provider_buffer_user_data(handle);
1006 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1009 if (!user_data->accelerated) {
1010 return DBOX_STATUS_ERROR_NONE;
1015 * Do preprocessing for accessing the H/W render buffer
1017 return dynamicbox_provider_buffer_pre_render(handle);
1020 PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle)
1023 const char *pkgname;
1025 struct dynamicbox_buffer_data *user_data;
1033 PERF_MARK("post_render");
1034 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1037 user_data = dynamicbox_provider_buffer_user_data(handle);
1039 PERF_MARK("post_render");
1040 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1043 if (!user_data->accelerated) {
1044 PERF_MARK("post_render");
1045 return DBOX_STATUS_ERROR_NONE;
1048 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1050 ErrPrint("Invalid buffer handle\n");
1051 PERF_MARK("post_render");
1052 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1055 id = dynamicbox_provider_buffer_id(handle);
1057 ErrPrint("Invalid buffer handler\n");
1058 PERF_MARK("post_render");
1059 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1062 ret = dynamicbox_provider_buffer_post_render(handle);
1064 ErrPrint("Failed to post render processing\n");
1065 PERF_MARK("post_render");
1069 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1070 ErrPrint("Failed to get size (%s)\n", id);
1075 * manipulate the damaged region, so send update event only for the damaged region.
1076 * to make more efficient updates
1079 if (send_updated(pkgname, id, handle, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
1080 ErrPrint("Failed to send GBAR updated (%s)\n", id);
1083 PERF_MARK("post_render");
1084 return DBOX_STATUS_ERROR_NONE;
1087 PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle)
1090 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1093 return dynamicbox_provider_buffer_stride(handle);
1096 PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar)
1098 if (!s_info.trigger_update_monitor) {
1099 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR);
1100 if (!s_info.trigger_update_monitor) {
1101 ErrPrint("Trigger update monitor function is not exists\n");
1102 return DBOX_STATUS_ERROR_FAULT;
1106 return s_info.trigger_update_monitor(filename, is_gbar);
1109 PUBLIC int dynamicbox_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1112 int schema_len = strlen(FILE_SCHEMA);
1115 if (!pkgname || !id) {
1116 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1117 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1120 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1121 uri = id_to_uri(id);
1123 ErrPrint("Heap: %s\n", strerror(errno));
1124 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1129 ErrPrint("Heap: %s\n", strerror(errno));
1130 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1134 ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason);
1139 PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id)
1144 uri = id_to_uri(id);
1146 ErrPrint("Heap: %s\n", strerror(errno));
1147 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1150 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1);
1155 PUBLIC int dynamicbox_thaw_scroller(const char *pkgname, const char *id)
1160 uri = id_to_uri(id);
1162 ErrPrint("Heap: %s\n", strerror(errno));
1163 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1166 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 0);
1171 PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1173 dynamicbox_buffer_h handle;
1174 const char *pkgname;
1177 uri = id_to_uri(id);
1179 ErrPrint("Heap: %s\n", strerror(errno));
1180 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1183 if (!s_info.find_pkgname) {
1184 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
1185 if (!s_info.find_pkgname) {
1186 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
1188 return DBOX_STATUS_ERROR_FAULT;
1192 pkgname = s_info.find_pkgname(uri);
1194 ErrPrint("Failed to find a package (%s)\n", uri);
1196 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1199 handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri);
1201 struct dynamicbox_buffer_data *user_data;
1203 user_data = dynamicbox_provider_buffer_user_data(handle);
1205 ErrPrint("User data is not available\n");
1207 return DBOX_STATUS_ERROR_FAULT;
1210 if (content && strlen(content)) {
1213 _content = strdup(content);
1215 if (user_data->content) {
1216 free(user_data->content);
1219 user_data->content = _content;
1221 ErrPrint("Heap: %s\n", strerror(errno));
1225 if (title && strlen(title)) {
1228 _title = strdup(title);
1230 if (user_data->title) {
1231 free(user_data->title);
1234 user_data->title = _title;
1236 ErrPrint("Heap: %s\n", strerror(errno));
1240 if (icon && strlen(icon)) {
1243 _icon = strdup(icon);
1245 if (user_data->icon) {
1246 free(user_data->icon);
1249 user_data->icon = _icon;
1251 ErrPrint("Heap: %s\n", strerror(errno));
1255 if (name && strlen(name)) {
1258 _name = strdup(name);
1260 if (user_data->name) {
1261 free(user_data->name);
1264 user_data->name = _name;
1266 ErrPrint("Heap: %s\n", strerror(errno));
1270 if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1271 ErrPrint("Failed to send extra info (%s)\n", id);
1275 return DBOX_STATUS_ERROR_NONE;
1279 if (!s_info.update_extra_info) {
1280 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO);
1281 if (!s_info.update_extra_info) {
1282 ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n");
1283 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1287 return s_info.update_extra_info(id, content, title, icon, name);