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 */
22 #include <unistd.h> /* access */
25 #include <livebox-service.h>
27 #include <provider_buffer.h>
28 #include <livebox-errno.h>
35 #define PUBLIC __attribute__((visibility("default")))
37 #define FILE_SCHEMA "file://"
40 * \brief This function is defined by the data-provider-slave
42 extern const char *livebox_find_pkgname(const char *filename);
43 extern int livebox_request_update_by_id(const char *uri);
61 unsigned int last_idx;
63 struct dlist *block_list;
66 struct livebox_buffer_data {
71 PUBLIC const int DONE = 0x00;
72 PUBLIC const int OUTPUT_UPDATED = 0x02;
73 PUBLIC const int USE_NET = 0x04;
75 PUBLIC const int NEED_TO_SCHEDULE = 0x01;
76 PUBLIC const int NEED_TO_CREATE = 0x01;
77 PUBLIC const int NEED_TO_DESTROY = 0x01;
78 PUBLIC const int NEED_TO_UPDATE = 0x01;
80 PUBLIC const int LB_SYS_EVENT_FONT_CHANGED = 0x01;
81 PUBLIC const int LB_SYS_EVENT_LANG_CHANGED = 0x02;
82 PUBLIC const int LB_SYS_EVENT_TIME_CHANGED = 0x04;
83 PUBLIC const int LB_SYS_EVENT_REGION_CHANGED = 0x08;
84 PUBLIC const int LB_SYS_EVENT_PAUSED = 0x0100;
85 PUBLIC const int LB_SYS_EVENT_RESUMED = 0x0200;
87 PUBLIC struct livebox_desc *livebox_desc_open(const char *filename, int for_pd)
89 struct livebox_desc *handle;
92 handle = calloc(1, sizeof(*handle));
94 ErrPrint("Error: %s\n", strerror(errno));
100 len = strlen(filename) + strlen(".desc") + 1;
101 new_fname = malloc(len);
103 ErrPrint("Error: %s\n", strerror(errno));
107 snprintf(new_fname, len, "%s.desc", filename);
109 new_fname = strdup(filename);
111 ErrPrint("Error: %s\n", strerror(errno));
117 DbgPrint("Open a file %s with merge mode %s\n",
119 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
121 handle->fp = fopen(new_fname, "at");
124 ErrPrint("Failed to open a file: %s\n", strerror(errno));
132 PUBLIC int livebox_desc_close(struct livebox_desc *handle)
139 return LB_STATUS_ERROR_INVALID;
141 DbgPrint("Close and flush\n");
142 dlist_foreach_safe(handle->block_list, l, n, block) {
143 handle->block_list = dlist_remove(handle->block_list, l);
146 fprintf(handle->fp, "{\n");
148 fprintf(handle->fp, "type=%s\n", block->type);
149 DbgPrint("type=%s\n", block->type);
153 fprintf(handle->fp, "part=%s\n", block->part);
154 DbgPrint("part=%s\n", block->part);
158 fprintf(handle->fp, "data=%s\n", block->data);
159 DbgPrint("data=%s\n", block->data);
163 fprintf(handle->fp, "option=%s\n", block->option);
164 DbgPrint("option=%s\n", block->option);
168 fprintf(handle->fp, "id=%s\n", block->id);
169 DbgPrint("id=%s\n", block->id);
172 if (block->target_id) {
173 fprintf(handle->fp, "target=%s\n", block->target_id);
174 DbgPrint("target=%s\n", block->target_id);
177 fprintf(handle->fp, "}\n");
185 free(block->target_id);
191 return LB_STATUS_SUCCESS;
194 PUBLIC int livebox_desc_set_category(struct livebox_desc *handle, const char *id, const char *category)
198 if (!handle || !category)
199 return LB_STATUS_ERROR_INVALID;
201 block = calloc(1, sizeof(*block));
203 return LB_STATUS_ERROR_MEMORY;
205 block->type = strdup(LB_DESC_TYPE_INFO);
208 return LB_STATUS_ERROR_MEMORY;
211 block->part = strdup("category");
215 return LB_STATUS_ERROR_MEMORY;
218 block->data = strdup(category);
223 return LB_STATUS_ERROR_MEMORY;
227 block->id = strdup(id);
233 return LB_STATUS_ERROR_MEMORY;
237 block->idx = handle->last_idx++;
238 handle->block_list = dlist_append(handle->block_list, block);
242 PUBLIC int livebox_desc_set_size(struct livebox_desc *handle, const char *id, int w, int h)
248 return LB_STATUS_ERROR_INVALID;
250 block = calloc(1, sizeof(*block));
252 return LB_STATUS_ERROR_MEMORY;
254 block->type = strdup(LB_DESC_TYPE_INFO);
257 return LB_STATUS_ERROR_MEMORY;
260 block->part = strdup("size");
264 return LB_STATUS_ERROR_MEMORY;
268 block->id = strdup(id);
273 return LB_STATUS_ERROR_MEMORY;
277 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
278 block->data = strdup(buffer);
283 return LB_STATUS_ERROR_MEMORY;
286 block->idx = handle->last_idx++;
287 handle->block_list = dlist_append(handle->block_list, block);
291 PUBLIC char *livebox_util_nl2br(const char *str)
305 ret = malloc(len + 1);
318 tmp = realloc(ret, len + 1);
345 PUBLIC int livebox_desc_set_id(struct livebox_desc *handle, int idx, const char *id)
350 dlist_foreach(handle->block_list, l, block) {
351 if (block->idx == idx) {
352 if (strcasecmp(block->type, LB_DESC_TYPE_SCRIPT)) {
353 ErrPrint("Invalid block is used\n");
354 return LB_STATUS_ERROR_INVALID;
357 free(block->target_id);
358 block->target_id = NULL;
360 if (!id || !strlen(id))
361 return LB_STATUS_SUCCESS;
363 block->target_id = strdup(id);
364 if (!block->target_id) {
365 ErrPrint("Heap: %s\n", strerror(errno));
366 return LB_STATUS_ERROR_MEMORY;
369 return LB_STATUS_SUCCESS;
373 return LB_STATUS_ERROR_NOT_EXIST;
379 PUBLIC int livebox_desc_add_block(struct livebox_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option)
383 if (!handle || !type)
384 return LB_STATUS_ERROR_INVALID;
392 block = calloc(1, sizeof(*block));
394 ErrPrint("Heap: %s\n", strerror(errno));
395 return LB_STATUS_ERROR_MEMORY;
398 block->type = strdup(type);
400 ErrPrint("Heap: %s\n", strerror(errno));
402 return LB_STATUS_ERROR_MEMORY;
405 block->part = strdup(part);
407 ErrPrint("Heap: %s\n", strerror(errno));
410 return LB_STATUS_ERROR_MEMORY;
413 block->data = strdup(data);
415 ErrPrint("Heap: %s\n", strerror(errno));
419 return LB_STATUS_ERROR_MEMORY;
423 block->option = strdup(option);
424 if (!block->option) {
425 ErrPrint("Heap: %s\n", strerror(errno));
430 return LB_STATUS_ERROR_MEMORY;
435 block->id = strdup(id);
437 ErrPrint("Heap: %s\n", strerror(errno));
443 return LB_STATUS_ERROR_MEMORY;
447 block->idx = handle->last_idx++;
448 handle->block_list = dlist_append(handle->block_list, block);
452 PUBLIC int livebox_desc_del_block(struct livebox_desc *handle, int idx)
457 dlist_foreach(handle->block_list, l, block) {
458 if (block->idx == idx) {
459 handle->block_list = dlist_remove(handle->block_list, l);
465 free(block->target_id);
467 return LB_STATUS_SUCCESS;
471 return LB_STATUS_ERROR_NOT_EXIST;
474 PUBLIC 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)
476 struct livebox_buffer_data *user_data;
478 struct livebox_buffer *handle;
482 if (!filename || !width || !height) {
483 ErrPrint("Invalid argument: %p(%dx%d)\n", filename, width, height);
487 user_data = calloc(1, sizeof(*user_data));
489 ErrPrint("Heap: %s\n", strerror(errno));
493 user_data->is_pd = is_pd;
495 uri_len = strlen(filename) + strlen(FILE_SCHEMA) + 1;
496 uri = malloc(uri_len);
498 ErrPrint("Heap: %s\n", strerror(errno));
503 snprintf(uri, uri_len, FILE_SCHEMA "%s", filename);
504 pkgname = livebox_find_pkgname(uri);
506 ErrPrint("Invalid Request\n");
512 handle = provider_buffer_acquire((!!is_pd) ? TYPE_PD : TYPE_LB, pkgname, uri, width, height, sizeof(int), handler, data);
513 DbgPrint("Acquire buffer for PD(%s), %s, %p\n", pkgname, uri, handle);
516 (void)provider_buffer_set_user_data(handle, user_data);
520 PUBLIC int livebox_request_update(const char *filename)
527 ErrPrint("Invalid argument\n");
528 return LB_STATUS_ERROR_INVALID;
531 uri_len = strlen(filename) + strlen(FILE_SCHEMA) + 1;
532 uri = malloc(uri_len);
534 ErrPrint("Heap: %s\n", strerror(errno));
535 return LB_STATUS_ERROR_MEMORY;
538 snprintf(uri, uri_len, FILE_SCHEMA "%s", filename);
539 ret = livebox_request_update_by_id(uri);
544 PUBLIC unsigned long livebox_pixmap_id(struct livebox_buffer *handle)
546 return provider_buffer_pixmap_id(handle);
549 PUBLIC int livebox_release_buffer(struct livebox_buffer *handle)
551 struct livebox_buffer_data *user_data;
554 return LB_STATUS_ERROR_INVALID;
556 user_data = provider_buffer_user_data(handle);
559 provider_buffer_set_user_data(handle, NULL);
562 DbgPrint("Release buffer\n");
563 return provider_buffer_release(handle);
566 PUBLIC void *livebox_ref_buffer(struct livebox_buffer *handle)
568 struct livebox_buffer_data *user_data;
576 user_data = provider_buffer_user_data(handle);
580 if (user_data->accelerated) {
581 DbgPrint("H/W accelerated buffer is allocated\n");
585 ret = provider_buffer_get_size(handle, &w, &h, &size);
587 data = provider_buffer_ref(handle);
588 if (data && !ret && w > 0 && h > 0 && size > 0) {
589 memset(data, 0, w * h * size);
590 provider_buffer_sync(handle);
593 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
597 PUBLIC int livebox_unref_buffer(void *buffer)
600 return LB_STATUS_ERROR_INVALID;
602 DbgPrint("Unref buffer\n");
603 return provider_buffer_unref(buffer);
606 PUBLIC int livebox_sync_buffer(struct livebox_buffer *handle)
608 struct livebox_buffer_data *user_data;
613 return LB_STATUS_ERROR_INVALID;
615 user_data = provider_buffer_user_data(handle);
617 ErrPrint("Invalid buffer\n");
618 return LB_STATUS_ERROR_INVALID;
621 if (user_data->accelerated) {
622 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
623 return LB_STATUS_SUCCESS;
626 pkgname = provider_buffer_pkgname(handle);
628 ErrPrint("Invalid buffer handler\n");
629 return LB_STATUS_ERROR_INVALID;
632 id = provider_buffer_id(handle);
634 ErrPrint("Invalid buffer handler\n");
635 return LB_STATUS_ERROR_INVALID;
638 provider_buffer_sync(handle);
640 if (user_data->is_pd) {
641 if (provider_send_desc_updated(pkgname, id, NULL) < 0)
642 ErrPrint("Failed to send PD updated (%s)\n", id);
648 if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0)
649 ErrPrint("Failed to get size (%s)\n", id);
651 if (provider_send_updated(pkgname, id, w, h, -1.0f, NULL, NULL) < 0)
652 ErrPrint("Failed to send updated (%s)\n", id);
655 return LB_STATUS_SUCCESS;
658 PUBLIC int livebox_support_hw_buffer(struct livebox_buffer *handle)
661 return LB_STATUS_ERROR_INVALID;
663 return provider_buffer_pixmap_is_support_hw(handle);
666 PUBLIC int livebox_create_hw_buffer(struct livebox_buffer *handle)
668 struct livebox_buffer_data *user_data;
672 return LB_STATUS_ERROR_INVALID;
674 user_data = provider_buffer_user_data(handle);
676 return LB_STATUS_ERROR_INVALID;
678 if (user_data->accelerated)
681 ret = provider_buffer_pixmap_create_hw(handle);
682 user_data->accelerated = (ret == 0);
686 PUBLIC int livebox_destroy_hw_buffer(struct livebox_buffer *handle)
688 struct livebox_buffer_data *user_data;
690 return LB_STATUS_ERROR_INVALID;
692 user_data = provider_buffer_user_data(handle);
693 if (!user_data || !user_data->accelerated)
694 return LB_STATUS_ERROR_INVALID;
696 user_data->accelerated = 0;
698 return provider_buffer_pixmap_destroy_hw(handle);
701 PUBLIC void *livebox_buffer_hw_buffer(struct livebox_buffer *handle)
703 struct livebox_buffer_data *user_data;
708 user_data = provider_buffer_user_data(handle);
709 if (!user_data || !user_data->accelerated)
712 return provider_buffer_pixmap_hw_addr(handle);
715 PUBLIC int livebox_buffer_pre_render(struct livebox_buffer *handle)
717 struct livebox_buffer_data *user_data;
720 return LB_STATUS_ERROR_INVALID;
722 user_data = provider_buffer_user_data(handle);
724 return LB_STATUS_ERROR_INVALID;
726 if (!user_data->accelerated)
727 return LB_STATUS_SUCCESS;
731 * Do preprocessing for accessing the H/W render buffer
733 return provider_buffer_pre_render(handle);
736 PUBLIC int livebox_buffer_post_render(struct livebox_buffer *handle)
741 struct livebox_buffer_data *user_data;
744 return LB_STATUS_ERROR_INVALID;
746 user_data = provider_buffer_user_data(handle);
748 return LB_STATUS_ERROR_INVALID;
750 if (!user_data->accelerated)
751 return LB_STATUS_SUCCESS;
753 pkgname = provider_buffer_pkgname(handle);
755 ErrPrint("Invalid buffer handle\n");
756 return LB_STATUS_ERROR_INVALID;
759 id = provider_buffer_id(handle);
761 ErrPrint("Invalid buffer handler\n");
762 return LB_STATUS_ERROR_INVALID;
765 ret = provider_buffer_post_render(handle);
767 ErrPrint("Failed to post render processing\n");
771 if (user_data->is_pd == 1) {
772 if (provider_send_desc_updated(pkgname, id, NULL) < 0)
773 ErrPrint("Failed to send PD updated (%s)\n", id);
779 if (provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0)
780 ErrPrint("Failed to get size (%s)\n", id);
782 if (provider_send_updated(pkgname, id, w, h, -1.0f, NULL, NULL) < 0)
783 ErrPrint("Failed to send updated (%s)\n", id);
786 return LB_STATUS_SUCCESS;