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, int idx, int x, int y, int w, int h, int gbar, const char *descfile);
100 int (*send)(const char *id, 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_updated"
113 #define FUNC_DYNAMICBOX_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_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, 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(id, idx, x, y, w, h, gbar);
145 } else if (s_info.type == LOAD_TYPE_SLAVE) {
146 ret = s_info.updated.slave.send(pkgname, id, idx, x, y, w, h, gbar, descfile);
148 dynamicbox_damage_region_t region = {
154 ret = dynamicbox_provider_send_updated(pkgname, id, idx, ®ion, gbar, descfile);
160 static char *id_to_uri(const char *id)
165 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
167 uri = malloc(uri_len);
172 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
176 static inline int event_handler_wrapper(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
180 struct dynamicbox_buffer_data *cbdata = data;
183 pkgname = dynamicbox_provider_buffer_pkgname(buffer);
185 ErrPrint("pkgname is not valid\n");
186 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
189 id = dynamicbox_provider_buffer_id(buffer);
191 ErrPrint("id is not valid[%s]\n", pkgname);
192 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
195 if (cbdata->handler) {
196 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
198 ret = DBOX_STATUS_ERROR_FAULT;
201 switch (event_info->type) {
202 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT:
203 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
204 case DBOX_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
205 case DBOX_BUFFER_EVENT_ACCESS_ACTIVATE:
206 case DBOX_BUFFER_EVENT_ACCESS_ACTION_UP:
207 case DBOX_BUFFER_EVENT_ACCESS_ACTION_DOWN:
208 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_UP:
209 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
210 case DBOX_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
211 case DBOX_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
212 case DBOX_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
213 case DBOX_BUFFER_EVENT_ACCESS_MOUSE:
214 case DBOX_BUFFER_EVENT_ACCESS_BACK:
215 case DBOX_BUFFER_EVENT_ACCESS_OVER:
216 case DBOX_BUFFER_EVENT_ACCESS_READ:
217 case DBOX_BUFFER_EVENT_ACCESS_ENABLE:
218 case DBOX_BUFFER_EVENT_ACCESS_DISABLE:
219 DbgPrint("Accessibility event: %d\n", event_info->type);
221 (void)dynamicbox_provider_send_access_status(pkgname, id, DBOX_ACCESS_STATUS_ERROR);
223 (void)dynamicbox_provider_send_access_status(pkgname, id, ret);
226 case DBOX_BUFFER_EVENT_KEY_UP:
227 case DBOX_BUFFER_EVENT_KEY_DOWN:
228 case DBOX_BUFFER_EVENT_KEY_FOCUS_IN:
229 case DBOX_BUFFER_EVENT_KEY_FOCUS_OUT:
230 DbgPrint("Key event: %d\n", event_info->type);
232 (void)dynamicbox_provider_send_key_status(pkgname, id, DBOX_KEY_STATUS_ERROR);
234 (void)dynamicbox_provider_send_key_status(pkgname, id, ret);
244 static inline int default_event_handler(dynamicbox_buffer_h buffer, dynamicbox_buffer_event_data_t event_info, void *data)
250 PUBLIC const int DBOX_DONE = 0x00;
251 PUBLIC const int DBOX_OUTPUT_UPDATED = 0x02;
252 PUBLIC const int DBOX_USE_NET = 0x04;
254 PUBLIC const int DBOX_NEED_TO_SCHEDULE = 0x01;
255 PUBLIC const int DBOX_NEED_TO_CREATE = 0x01;
256 PUBLIC const int DBOX_NEED_TO_DESTROY = 0x01;
257 PUBLIC const int DBOX_FORCE_TO_SCHEDULE = 0x08;
259 PUBLIC const int DBOX_SYS_EVENT_FONT_CHANGED = 0x01;
260 PUBLIC const int DBOX_SYS_EVENT_LANG_CHANGED = 0x02;
261 PUBLIC const int DBOX_SYS_EVENT_TIME_CHANGED = 0x04;
262 PUBLIC const int DBOX_SYS_EVENT_REGION_CHANGED = 0x08;
263 PUBLIC const int DBOX_SYS_EVENT_TTS_CHANGED = 0x10;
264 PUBLIC const int DBOX_SYS_EVENT_PAUSED = 0x0100;
265 PUBLIC const int DBOX_SYS_EVENT_RESUMED = 0x0200;
266 PUBLIC const int DBOX_SYS_EVENT_MMC_STATUS_CHANGED = 0x0400;
267 PUBLIC const int DBOX_SYS_EVENT_DELETED = 0x0800;
269 PUBLIC struct dynamicbox_desc *dynamicbox_desc_open(const char *filename, int for_pd)
271 struct dynamicbox_desc *handle;
274 handle = calloc(1, sizeof(*handle));
276 ErrPrint("Error: %s\n", strerror(errno));
282 len = strlen(filename) + strlen(".desc") + 1;
283 new_fname = malloc(len);
285 ErrPrint("Error: %s\n", strerror(errno));
289 snprintf(new_fname, len, "%s.desc", filename);
291 new_fname = strdup(filename);
293 ErrPrint("Error: %s\n", strerror(errno));
299 DbgPrint("Open a file %s with merge mode %s\n",
301 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
303 handle->fp = fopen(new_fname, "at");
306 ErrPrint("Failed to open a file: %s\n", strerror(errno));
314 PUBLIC int dynamicbox_desc_close(struct dynamicbox_desc *handle)
321 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
324 dlist_foreach_safe(handle->block_list, l, n, block) {
325 handle->block_list = dlist_remove(handle->block_list, l);
327 fprintf(handle->fp, "{\n");
329 fprintf(handle->fp, "type=%s\n", block->type);
333 fprintf(handle->fp, "part=%s\n", block->part);
337 fprintf(handle->fp, "data=%s\n", block->data);
341 fprintf(handle->fp, "option=%s\n", block->option);
345 fprintf(handle->fp, "id=%s\n", block->id);
348 if (block->target_id) {
349 fprintf(handle->fp, "target=%s\n", block->target_id);
351 fprintf(handle->fp, "}\n");
358 free(block->target_id);
362 if (fclose(handle->fp) != 0) {
363 ErrPrint("fclose: %s\n", strerror(errno));
366 return DBOX_STATUS_ERROR_NONE;
369 PUBLIC int dynamicbox_desc_set_category(struct dynamicbox_desc *handle, const char *id, const char *category)
373 if (!handle || !category) {
374 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
377 block = calloc(1, sizeof(*block));
379 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
382 block->type = strdup(DBOX_DESC_TYPE_INFO);
385 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
388 block->part = strdup("category");
392 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
395 block->data = strdup(category);
400 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
404 block->id = strdup(id);
410 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
414 block->idx = handle->last_idx++;
415 handle->block_list = dlist_append(handle->block_list, block);
419 PUBLIC int dynamicbox_desc_set_size(struct dynamicbox_desc *handle, const char *id, int w, int h)
425 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
428 block = calloc(1, sizeof(*block));
430 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
433 block->type = strdup(DBOX_DESC_TYPE_INFO);
436 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
439 block->part = strdup("size");
443 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
447 block->id = strdup(id);
452 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
456 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
457 block->data = strdup(buffer);
462 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
465 block->idx = handle->last_idx++;
466 handle->block_list = dlist_append(handle->block_list, block);
470 PUBLIC int dynamicbox_desc_set_id(struct dynamicbox_desc *handle, int idx, const char *id)
475 dlist_foreach(handle->block_list, l, block) {
476 if (block->idx == idx) {
477 if (strcasecmp(block->type, DBOX_DESC_TYPE_SCRIPT)) {
478 ErrPrint("Invalid block is used\n");
479 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
482 free(block->target_id);
483 block->target_id = NULL;
485 if (!id || !strlen(id)) {
486 return DBOX_STATUS_ERROR_NONE;
489 block->target_id = strdup(id);
490 if (!block->target_id) {
491 ErrPrint("Heap: %s\n", strerror(errno));
492 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
495 return DBOX_STATUS_ERROR_NONE;
499 return DBOX_STATUS_ERROR_NOT_EXIST;
505 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)
509 if (!handle || !type) {
510 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
521 block = calloc(1, sizeof(*block));
523 ErrPrint("Heap: %s\n", strerror(errno));
524 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
527 block->type = strdup(type);
529 ErrPrint("Heap: %s\n", strerror(errno));
531 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
534 block->part = strdup(part);
536 ErrPrint("Heap: %s\n", strerror(errno));
539 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
542 block->data = strdup(data);
544 ErrPrint("Heap: %s\n", strerror(errno));
548 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
552 block->option = strdup(option);
553 if (!block->option) {
554 ErrPrint("Heap: %s\n", strerror(errno));
559 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
564 block->id = strdup(id);
566 ErrPrint("Heap: %s\n", strerror(errno));
572 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
576 block->idx = handle->last_idx++;
577 handle->block_list = dlist_append(handle->block_list, block);
581 PUBLIC int dynamicbox_desc_del_block(struct dynamicbox_desc *handle, int idx)
586 if (!handle || idx < 0) {
587 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
590 dlist_foreach(handle->block_list, l, block) {
591 if (block->idx == idx) {
592 handle->block_list = dlist_remove(handle->block_list, l);
598 free(block->target_id);
600 return DBOX_STATUS_ERROR_NONE;
604 return DBOX_STATUS_ERROR_NOT_EXIST;
607 PUBLIC int dynamicbox_acquire_buffer(dynamicbox_buffer_h handle, int idx, int width, int height, int pixel_size)
611 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
612 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
619 /* To validate the buffer */
620 if (dynamicbox_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
621 ErrPrint("Failed to get buffer size\n");
624 if (_width != width || _height != height || pixel_size != _pixel_size) {
625 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
628 ret = dynamicbox_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
630 ret = dynamicbox_provider_buffer_acquire(handle, width, height, pixel_size);
636 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)
638 struct dynamicbox_buffer_data *user_data;
640 dynamicbox_buffer_h handle;
644 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
648 user_data = calloc(1, sizeof(*user_data));
650 ErrPrint("Heap: %s\n", strerror(errno));
654 user_data->is_gbar = is_gbar;
655 user_data->handler = handler ? handler : default_event_handler;
656 user_data->cbdata = data;
658 uri = id_to_uri(filename);
660 ErrPrint("Heap: %s\n", strerror(errno));
665 if (!s_info.find_pkgname) {
666 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
667 if (!s_info.find_pkgname) {
668 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
675 pkgname = s_info.find_pkgname(uri);
677 ErrPrint("Invalid Request\n");
683 handle = dynamicbox_provider_buffer_create((!!is_gbar) ? DBOX_TYPE_GBAR : DBOX_TYPE_DBOX, pkgname, uri, auto_align, event_handler_wrapper, user_data);
690 (void)dynamicbox_provider_buffer_set_user_data(handle, user_data);
694 PUBLIC int dynamicbox_request_update(const char *filename)
700 ErrPrint("Invalid argument\n");
701 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
704 uri = id_to_uri(filename);
706 ErrPrint("Heap: %s\n", strerror(errno));
707 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
710 if (!s_info.request_update_by_id) {
711 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_REQUEST_UPDATE_BY_ID);
712 if (!s_info.request_update_by_id) {
713 ErrPrint("\"dynamicbox_request_update_by_id\" is not exists\n");
715 return DBOX_STATUS_ERROR_FAULT;
719 ret = s_info.request_update_by_id(uri);
724 PUBLIC unsigned int dynamicbox_resource_id(dynamicbox_buffer_h handle, int idx)
728 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
729 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
733 ret = dynamicbox_provider_buffer_extra_resource_id(handle, idx);
735 ret = dynamicbox_provider_buffer_resource_id(handle);
741 PUBLIC int dynamicbox_release_buffer(dynamicbox_buffer_h handle, int idx)
745 if (!handle || idx > DYNAMICBOX_CONF_EXTRA_BUFFER_COUNT) {
746 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
750 ret = dynamicbox_provider_buffer_extra_release(handle, idx);
752 ret = dynamicbox_provider_buffer_release(handle);
755 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
759 PUBLIC int dynamicbox_destroy_buffer(dynamicbox_buffer_h handle)
761 struct dynamicbox_buffer_data *user_data;
764 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
767 user_data = dynamicbox_provider_buffer_user_data(handle);
769 free(user_data->content);
770 free(user_data->title);
771 free(user_data->icon);
772 free(user_data->name);
774 dynamicbox_provider_buffer_set_user_data(handle, NULL);
777 DbgPrint("Destroy buffer\n");
778 return dynamicbox_provider_buffer_destroy(handle);
781 PUBLIC void *dynamicbox_ref_buffer(dynamicbox_buffer_h handle)
783 struct dynamicbox_buffer_data *user_data;
792 user_data = dynamicbox_provider_buffer_user_data(handle);
797 if (user_data->accelerated) {
798 DbgPrint("H/W accelerated buffer is allocated\n");
802 ret = dynamicbox_provider_buffer_get_size(handle, &w, &h, &size);
804 data = dynamicbox_provider_buffer_ref(handle);
805 if (data && !ret && w > 0 && h > 0 && size > 0) {
806 memset(data, 0, w * h * size);
807 (void)dynamicbox_provider_buffer_sync(handle);
810 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
814 PUBLIC int dynamicbox_unref_buffer(void *buffer)
817 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
820 DbgPrint("Unref buffer\n");
821 return dynamicbox_provider_buffer_unref(buffer);
824 PUBLIC int dynamicbox_sync_buffer(dynamicbox_buffer_h handle)
826 struct dynamicbox_buffer_data *user_data;
834 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
837 user_data = dynamicbox_provider_buffer_user_data(handle);
839 ErrPrint("Invalid buffer\n");
840 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
843 if (user_data->accelerated) {
844 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
845 return DBOX_STATUS_ERROR_NONE;
848 pkgname = dynamicbox_provider_buffer_pkgname(handle);
850 ErrPrint("Invalid buffer handler\n");
851 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
854 id = dynamicbox_provider_buffer_id(handle);
856 ErrPrint("Invalid buffer handler\n");
857 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
860 (void)dynamicbox_provider_buffer_sync(handle);
862 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
863 ErrPrint("Failed to get size (%s)\n", id);
868 * manipulate the damaged region, so send update event only for the damaged region.
869 * to make more efficient updates
872 if (user_data->is_gbar == 1) {
873 if (send_updated(pkgname, id, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
874 ErrPrint("Failed to send GBAR updated (%s)\n", id);
877 if (send_updated(pkgname, id, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
878 ErrPrint("Failed to send updated (%s)\n", id);
882 return DBOX_STATUS_ERROR_NONE;
885 PUBLIC int dynamicbox_send_updated_by_idx(dynamicbox_buffer_h handle, int idx)
887 struct dynamicbox_buffer_data *user_data;
894 user_data = dynamicbox_provider_buffer_user_data(handle);
896 ErrPrint("Invalid buffer\n");
897 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
900 pkgname = dynamicbox_provider_buffer_pkgname(handle);
902 ErrPrint("Invalid buffer handler\n");
903 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
906 id = dynamicbox_provider_buffer_id(handle);
908 ErrPrint("Invalid buffer handler\n");
909 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
912 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
913 ErrPrint("Failed to get size (%s)\n", id);
916 if (send_updated(pkgname, id, idx, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
917 ErrPrint("Failed to send GBAR updated (%s) %d\n", id, idx);
921 PUBLIC int dynamicbox_support_hw_buffer(dynamicbox_buffer_h handle)
924 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
927 return dynamicbox_provider_buffer_is_support_hw(handle);
930 PUBLIC int dynamicbox_create_hw_buffer(dynamicbox_buffer_h handle)
932 struct dynamicbox_buffer_data *user_data;
936 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
939 user_data = dynamicbox_provider_buffer_user_data(handle);
941 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
944 if (user_data->accelerated) {
945 return DBOX_STATUS_ERROR_ALREADY;
948 ret = dynamicbox_provider_buffer_create_hw(handle);
949 user_data->accelerated = (ret == 0);
953 PUBLIC int dynamicbox_destroy_hw_buffer(dynamicbox_buffer_h handle)
955 struct dynamicbox_buffer_data *user_data;
958 LOGD("handle is NULL\n");
959 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
962 user_data = dynamicbox_provider_buffer_user_data(handle);
963 if (!user_data || !user_data->accelerated) {
964 LOGD("user_data is NULL\n");
965 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
968 user_data->accelerated = 0;
970 return dynamicbox_provider_buffer_destroy_hw(handle);
973 PUBLIC void *dynamicbox_buffer_hw_buffer(dynamicbox_buffer_h handle)
975 struct dynamicbox_buffer_data *user_data;
981 user_data = dynamicbox_provider_buffer_user_data(handle);
982 if (!user_data || !user_data->accelerated) {
986 return dynamicbox_provider_buffer_hw_addr(handle);
989 PUBLIC int dynamicbox_buffer_pre_render(dynamicbox_buffer_h handle)
991 struct dynamicbox_buffer_data *user_data;
994 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
997 user_data = dynamicbox_provider_buffer_user_data(handle);
999 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1002 if (!user_data->accelerated) {
1003 return DBOX_STATUS_ERROR_NONE;
1008 * Do preprocessing for accessing the H/W render buffer
1010 return dynamicbox_provider_buffer_pre_render(handle);
1013 PUBLIC int dynamicbox_buffer_post_render(dynamicbox_buffer_h handle)
1016 const char *pkgname;
1018 struct dynamicbox_buffer_data *user_data;
1024 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1027 user_data = dynamicbox_provider_buffer_user_data(handle);
1029 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1032 if (!user_data->accelerated) {
1033 return DBOX_STATUS_ERROR_NONE;
1036 pkgname = dynamicbox_provider_buffer_pkgname(handle);
1038 ErrPrint("Invalid buffer handle\n");
1039 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1042 id = dynamicbox_provider_buffer_id(handle);
1044 ErrPrint("Invalid buffer handler\n");
1045 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1048 ret = dynamicbox_provider_buffer_post_render(handle);
1050 ErrPrint("Failed to post render processing\n");
1054 if (dynamicbox_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1055 ErrPrint("Failed to get size (%s)\n", id);
1060 * manipulate the damaged region, so send update event only for the damaged region.
1061 * to make more efficient updates
1064 if (send_updated(pkgname, id, DBOX_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL) < 0) {
1065 ErrPrint("Failed to send GBAR updated (%s)\n", id);
1068 return DBOX_STATUS_ERROR_NONE;
1071 PUBLIC int dynamicbox_buffer_stride(dynamicbox_buffer_h handle)
1074 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1077 return dynamicbox_provider_buffer_stride(handle);
1080 PUBLIC int dynamicbox_content_is_updated(const char *filename, int is_gbar)
1082 if (!s_info.trigger_update_monitor) {
1083 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_TRIGGER_UPDATE_MONITOR);
1084 if (!s_info.trigger_update_monitor) {
1085 ErrPrint("Trigger update monitor function is not exists\n");
1086 return DBOX_STATUS_ERROR_FAULT;
1090 return s_info.trigger_update_monitor(filename, is_gbar);
1093 PUBLIC int dynamicbox_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1096 int schema_len = strlen(FILE_SCHEMA);
1099 if (!pkgname || !id) {
1100 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1101 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1104 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1105 uri = id_to_uri(id);
1107 ErrPrint("Heap: %s\n", strerror(errno));
1108 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1113 ErrPrint("Heap: %s\n", strerror(errno));
1114 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1118 ret = dynamicbox_provider_send_request_close_gbar(pkgname, uri, reason);
1123 PUBLIC int dynamicbox_freeze_scroller(const char *pkgname, const char *id)
1128 uri = id_to_uri(id);
1130 ErrPrint("Heap: %s\n", strerror(errno));
1131 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1134 ret = dynamicbox_provider_send_hold_scroll(pkgname, uri, 1);
1139 PUBLIC int dynamicbox_thaw_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, 0);
1155 PUBLIC int dynamicbox_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1157 dynamicbox_buffer_h handle;
1158 const char *pkgname;
1161 uri = id_to_uri(id);
1163 ErrPrint("Heap: %s\n", strerror(errno));
1164 return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
1167 if (!s_info.find_pkgname) {
1168 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_FIND_PKGNAME);
1169 if (!s_info.find_pkgname) {
1170 ErrPrint("Failed to find a \"dynamicbox_find_pkgname\"\n");
1172 return DBOX_STATUS_ERROR_FAULT;
1176 pkgname = s_info.find_pkgname(uri);
1178 ErrPrint("Failed to find a package (%s)\n", uri);
1180 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1183 handle = dynamicbox_provider_buffer_find_buffer(DBOX_TYPE_DBOX, pkgname, uri);
1185 struct dynamicbox_buffer_data *user_data;
1187 user_data = dynamicbox_provider_buffer_user_data(handle);
1189 ErrPrint("User data is not available\n");
1191 return DBOX_STATUS_ERROR_FAULT;
1194 if (content && strlen(content)) {
1197 _content = strdup(content);
1199 if (user_data->content) {
1200 free(user_data->content);
1203 user_data->content = _content;
1205 ErrPrint("Heap: %s\n", strerror(errno));
1209 if (title && strlen(title)) {
1212 _title = strdup(title);
1214 if (user_data->title) {
1215 free(user_data->title);
1218 user_data->title = _title;
1220 ErrPrint("Heap: %s\n", strerror(errno));
1224 if (icon && strlen(icon)) {
1227 _icon = strdup(icon);
1229 if (user_data->icon) {
1230 free(user_data->icon);
1233 user_data->icon = _icon;
1235 ErrPrint("Heap: %s\n", strerror(errno));
1239 if (name && strlen(name)) {
1242 _name = strdup(name);
1244 if (user_data->name) {
1245 free(user_data->name);
1248 user_data->name = _name;
1250 ErrPrint("Heap: %s\n", strerror(errno));
1254 if (dynamicbox_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1255 ErrPrint("Failed to send extra info (%s)\n", id);
1259 return DBOX_STATUS_ERROR_NONE;
1263 if (!s_info.update_extra_info) {
1264 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_DYNAMICBOX_UPDATE_EXTRA_INFO);
1265 if (!s_info.update_extra_info) {
1266 ErrPrint("Failed to find a \"dynamicbox_update_extra_info\"\n");
1267 return DBOX_STATUS_ERROR_INVALID_PARAMETER;
1271 return s_info.update_extra_info(id, content, title, icon, name);