2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (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://www.tizenopensource.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 */
24 #include <livebox-service.h>
26 #include <provider_buffer.h>
27 #include <livebox-errno.h>
34 #define EAPI __attribute__((visibility("default")))
36 #define FILE_SCHEMA "file://"
39 * \brief This function is defined by the data-provider-slave
41 extern const char *livebox_find_pkgname(const char *filename);
42 extern int livebox_request_update_by_id(const char *uri);
60 unsigned int last_idx;
62 struct dlist *block_list;
65 struct livebox_buffer_data {
70 EAPI const int DONE = 0x00;
71 EAPI const int OUTPUT_UPDATED = 0x02;
72 EAPI const int USE_NET = 0x04;
74 EAPI const int NEED_TO_SCHEDULE = 0x01;
75 EAPI const int NEED_TO_CREATE = 0x01;
76 EAPI const int NEED_TO_DESTROY = 0x01;
77 EAPI const int NEED_TO_UPDATE = 0x01;
79 EAPI const int LB_SYS_EVENT_FONT_CHANGED = 0x01;
80 EAPI const int LB_SYS_EVENT_LANG_CHANGED = 0x02;
81 EAPI const int LB_SYS_EVENT_TIME_CHANGED = 0x04;
82 EAPI const int LB_SYS_EVENT_REGION_CHANGED = 0x08;
83 EAPI const int LB_SYS_EVENT_PAUSED = 0x0100;
84 EAPI const int LB_SYS_EVENT_RESUMED = 0x0200;
86 EAPI struct livebox_desc *livebox_desc_open(const char *filename, int for_pd)
88 struct livebox_desc *handle;
91 handle = calloc(1, sizeof(*handle));
93 ErrPrint("Error: %s\n", strerror(errno));
99 len = strlen(filename) + strlen(".desc") + 1;
100 new_fname = malloc(len);
102 ErrPrint("Error: %s\n", strerror(errno));
106 snprintf(new_fname, len, "%s.desc", filename);
108 new_fname = strdup(filename);
110 ErrPrint("Error: %s\n", strerror(errno));
116 DbgPrint("Open a new file: %s\n", new_fname);
117 handle->fp = fopen(new_fname, "w+t");
120 ErrPrint("Failed to open a file: %s\n", strerror(errno));
128 EAPI int livebox_desc_close(struct livebox_desc *handle)
135 return LB_STATUS_ERROR_INVALID;
137 DbgPrint("Close and flush\n");
138 dlist_foreach_safe(handle->block_list, l, n, block) {
139 handle->block_list = dlist_remove(handle->block_list, l);
142 fprintf(handle->fp, "{\n");
144 fprintf(handle->fp, "type=%s\n", block->type);
145 DbgPrint("type=%s\n", block->type);
149 fprintf(handle->fp, "part=%s\n", block->part);
150 DbgPrint("part=%s\n", block->part);
154 fprintf(handle->fp, "data=%s\n", block->data);
155 DbgPrint("data=%s\n", block->data);
159 fprintf(handle->fp, "option=%s\n", block->option);
160 DbgPrint("option=%s\n", block->option);
164 fprintf(handle->fp, "id=%s\n", block->id);
165 DbgPrint("id=%s\n", block->id);
168 if (block->target_id) {
169 fprintf(handle->fp, "target=%s\n", block->target_id);
170 DbgPrint("target=%s\n", block->target_id);
173 fprintf(handle->fp, "}\n");
181 free(block->target_id);
187 return LB_STATUS_SUCCESS;
190 EAPI int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category)
194 if (!handle || !category)
195 return LB_STATUS_ERROR_INVALID;
197 block = calloc(1, sizeof(*block));
199 return LB_STATUS_ERROR_MEMORY;
201 block->type = strdup(LB_DESC_TYPE_INFO);
204 return LB_STATUS_ERROR_MEMORY;
207 block->part = strdup("category");
211 return LB_STATUS_ERROR_MEMORY;
214 block->data = strdup(category);
219 return LB_STATUS_ERROR_MEMORY;
223 block->id = strdup(id);
229 return LB_STATUS_ERROR_MEMORY;
233 block->idx = handle->last_idx++;
234 handle->block_list = dlist_append(handle->block_list, block);
238 EAPI int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h)
244 return LB_STATUS_ERROR_INVALID;
246 block = calloc(1, sizeof(*block));
248 return LB_STATUS_ERROR_MEMORY;
250 block->type = strdup(LB_DESC_TYPE_INFO);
253 return LB_STATUS_ERROR_MEMORY;
256 block->part = strdup("size");
260 return LB_STATUS_ERROR_MEMORY;
264 block->id = strdup(id);
269 return LB_STATUS_ERROR_MEMORY;
273 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
274 block->data = strdup(buffer);
279 return LB_STATUS_ERROR_MEMORY;
282 block->idx = handle->last_idx++;
283 handle->block_list = dlist_append(handle->block_list, block);
287 EAPI char *livebox_util_nl2br(const char *str)
301 ret = malloc(len + 1);
314 tmp = realloc(ret, len + 1);
341 EAPI int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id)
346 dlist_foreach(handle->block_list, l, block) {
347 if (block->idx == idx) {
348 if (strcasecmp(block->type, LB_DESC_TYPE_SCRIPT)) {
349 ErrPrint("Invalid block is used\n");
350 return LB_STATUS_ERROR_INVALID;
353 free(block->target_id);
354 block->target_id = NULL;
356 if (!id || !strlen(id))
357 return LB_STATUS_SUCCESS;
359 block->target_id = strdup(id);
360 if (!block->target_id) {
361 ErrPrint("Heap: %s\n", strerror(errno));
362 return LB_STATUS_ERROR_MEMORY;
365 return LB_STATUS_SUCCESS;
369 return LB_STATUS_ERROR_NOT_EXIST;
375 EAPI int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option)
379 if (!handle || !type)
380 return LB_STATUS_ERROR_INVALID;
388 block = calloc(1, sizeof(*block));
390 ErrPrint("Heap: %s\n", strerror(errno));
391 return LB_STATUS_ERROR_MEMORY;
394 block->type = strdup(type);
396 ErrPrint("Heap: %s\n", strerror(errno));
398 return LB_STATUS_ERROR_MEMORY;
401 block->part = strdup(part);
403 ErrPrint("Heap: %s\n", strerror(errno));
406 return LB_STATUS_ERROR_MEMORY;
409 block->data = strdup(data);
411 ErrPrint("Heap: %s\n", strerror(errno));
415 return LB_STATUS_ERROR_MEMORY;
419 block->option = strdup(option);
420 if (!block->option) {
421 ErrPrint("Heap: %s\n", strerror(errno));
426 return LB_STATUS_ERROR_MEMORY;
431 block->id = strdup(id);
433 ErrPrint("Heap: %s\n", strerror(errno));
439 return LB_STATUS_ERROR_MEMORY;
443 block->idx = handle->last_idx++;
444 handle->block_list = dlist_append(handle->block_list, block);
448 EAPI int livebox_desc_del_block(struct livebox_desc *handle, int idx)
453 dlist_foreach(handle->block_list, l, block) {
454 if (block->idx == idx) {
455 handle->block_list = dlist_remove(handle->block_list, l);
461 free(block->target_id);
463 return LB_STATUS_SUCCESS;
467 return LB_STATUS_ERROR_NOT_EXIST;
470 EAPI struct livebox_buffer *livebox_acquire_buffer(const char *filename, int is_pd, int width, int height, int (*handler)(struct livebox_buffer *, enum buffer_event, double, double, double, void *), void *data)
472 struct livebox_buffer_data *user_data;
474 struct livebox_buffer *handle;
478 if (!filename || !width || !height) {
479 ErrPrint("Invalid argument: %p(%dx%d)\n", filename, width, height);
483 user_data = calloc(1, sizeof(*user_data));
485 ErrPrint("Heap: %s\n", strerror(errno));
489 user_data->is_pd = is_pd;
491 uri_len = strlen(filename) + strlen(FILE_SCHEMA) + 1;
492 uri = malloc(uri_len);
494 ErrPrint("Heap: %s\n", strerror(errno));
499 snprintf(uri, uri_len, FILE_SCHEMA "%s", filename);
500 pkgname = livebox_find_pkgname(uri);
502 ErrPrint("Invalid Request\n");
508 handle = provider_buffer_acquire((!!is_pd) ? TYPE_PD : TYPE_LB, pkgname, uri, width, height, sizeof(int), handler, data);
509 DbgPrint("Acquire buffer for PD(%s), %s, %p\n", pkgname, uri, handle);
512 (void)provider_buffer_set_user_data(handle, user_data);
516 EAPI int livebox_request_update(const char *filename)
523 ErrPrint("Invalid argument\n");
524 return LB_STATUS_ERROR_INVALID;
527 uri_len = strlen(filename) + strlen(FILE_SCHEMA) + 1;
528 uri = malloc(uri_len);
530 ErrPrint("Heap: %s\n", strerror(errno));
531 return LB_STATUS_ERROR_MEMORY;
534 snprintf(uri, uri_len, FILE_SCHEMA "%s", filename);
535 ret = livebox_request_update_by_id(uri);
540 EAPI unsigned long livebox_pixmap_id(struct livebox_buffer *handle)
542 return provider_buffer_pixmap_id(handle);
545 EAPI int livebox_release_buffer(struct livebox_buffer *handle)
547 struct livebox_buffer_data *user_data;
550 return LB_STATUS_ERROR_INVALID;
552 user_data = provider_buffer_user_data(handle);
555 provider_buffer_set_user_data(handle, NULL);
558 DbgPrint("Release buffer\n");
559 return provider_buffer_release(handle);
562 EAPI void *livebox_ref_buffer(struct livebox_buffer *handle)
564 struct livebox_buffer_data *user_data;
572 user_data = provider_buffer_user_data(handle);
576 if (user_data->accelerated) {
577 DbgPrint("H/W accelerated buffer is allocated\n");
581 ret = provider_buffer_get_size(handle, &w, &h, &size);
583 data = provider_buffer_ref(handle);
584 if (data && !ret && w > 0 && h > 0 && size > 0) {
585 memset(data, 0, w * h * size);
586 provider_buffer_sync(handle);
589 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
593 EAPI int livebox_unref_buffer(void *buffer)
596 return LB_STATUS_ERROR_INVALID;
598 DbgPrint("Unref buffer\n");
599 return provider_buffer_unref(buffer);
602 EAPI int livebox_sync_buffer(struct livebox_buffer *handle)
604 struct livebox_buffer_data *user_data;
609 return LB_STATUS_ERROR_INVALID;
611 user_data = provider_buffer_user_data(handle);
613 ErrPrint("Invalid buffer\n");
614 return LB_STATUS_ERROR_INVALID;
617 if (user_data->accelerated) {
618 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
619 return LB_STATUS_SUCCESS;
622 pkgname = provider_buffer_pkgname(handle);
624 ErrPrint("Invalid buffer handler\n");
625 return LB_STATUS_ERROR_INVALID;
628 id = provider_buffer_id(handle);
630 ErrPrint("Invalid buffer handler\n");
631 return LB_STATUS_ERROR_INVALID;
634 provider_buffer_sync(handle);
636 if (user_data->is_pd) {
637 if (provider_send_desc_updated(pkgname, id, NULL) < 0)
638 ErrPrint("Failed to send PD updated (%s)\n", id);
644 if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0)
645 ErrPrint("Failed to get size (%s)\n", id);
647 if (provider_send_updated(pkgname, id, w, h, -1.0f, NULL, NULL) < 0)
648 ErrPrint("Failed to send updated (%s)\n", id);
651 return LB_STATUS_SUCCESS;
654 EAPI int livebox_support_hw_buffer(struct livebox_buffer *handle)
657 return LB_STATUS_ERROR_INVALID;
659 return provider_buffer_pixmap_is_support_hw(handle);
662 EAPI int livebox_create_hw_buffer(struct livebox_buffer *handle)
664 struct livebox_buffer_data *user_data;
668 return LB_STATUS_ERROR_INVALID;
670 user_data = provider_buffer_user_data(handle);
672 return LB_STATUS_ERROR_INVALID;
674 if (user_data->accelerated)
677 ret = provider_buffer_pixmap_create_hw(handle);
678 user_data->accelerated = (ret == 0);
682 EAPI int livebox_destroy_hw_buffer(struct livebox_buffer *handle)
684 struct livebox_buffer_data *user_data;
686 return LB_STATUS_ERROR_INVALID;
688 user_data = provider_buffer_user_data(handle);
689 if (!user_data || !user_data->accelerated)
690 return LB_STATUS_ERROR_INVALID;
692 user_data->accelerated = 0;
694 return provider_buffer_pixmap_destroy_hw(handle);
697 EAPI void *livebox_buffer_hw_buffer(struct livebox_buffer *handle)
699 struct livebox_buffer_data *user_data;
704 user_data = provider_buffer_user_data(handle);
705 if (!user_data || !user_data->accelerated)
708 return provider_buffer_pixmap_hw_addr(handle);
711 EAPI int livebox_buffer_pre_render(struct livebox_buffer *handle)
713 struct livebox_buffer_data *user_data;
716 return LB_STATUS_ERROR_INVALID;
718 user_data = provider_buffer_user_data(handle);
720 return LB_STATUS_ERROR_INVALID;
722 if (!user_data->accelerated)
723 return LB_STATUS_SUCCESS;
727 * Do preprocessing for accessing the H/W render buffer
729 return provider_buffer_pre_render(handle);
732 EAPI int livebox_buffer_post_render(struct livebox_buffer *handle)
737 struct livebox_buffer_data *user_data;
740 return LB_STATUS_ERROR_INVALID;
742 user_data = provider_buffer_user_data(handle);
744 return LB_STATUS_ERROR_INVALID;
746 if (!user_data->accelerated)
747 return LB_STATUS_SUCCESS;
749 pkgname = provider_buffer_pkgname(handle);
751 ErrPrint("Invalid buffer handle\n");
752 return LB_STATUS_ERROR_INVALID;
755 id = provider_buffer_id(handle);
757 ErrPrint("Invalid buffer handler\n");
758 return LB_STATUS_ERROR_INVALID;
761 ret = provider_buffer_post_render(handle);
763 ErrPrint("Failed to post render processing\n");
767 if (user_data->is_pd == 1) {
768 if (provider_send_desc_updated(pkgname, id, NULL) < 0)
769 ErrPrint("Failed to send PD updated (%s)\n", id);
775 if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0)
776 ErrPrint("Failed to get size (%s)\n", id);
778 if (provider_send_updated(pkgname, id, w, h, -1.0f, NULL, NULL) < 0)
779 ErrPrint("Failed to send updated (%s)\n", id);
782 return LB_STATUS_SUCCESS;