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 */
26 #include <com-core_packet.h>
28 #include <livebox-service.h>
29 #include <livebox-errno.h>
34 #include "livebox_internal.h"
37 #include "master_rpc.h"
39 #include "critical_log.h"
41 #define EAPI __attribute__((visibility("default")))
42 #define MINIMUM_EVENT s_info.event_filter
49 struct dlist *livebox_list;
50 struct dlist *event_list;
51 struct dlist *fault_list;
53 int prevent_overwrite;
60 .prevent_overwrite = 0,
61 .event_filter = 0.02f,
70 int (*handler)(struct livebox *handler, enum livebox_event_type event, void *data);
75 int (*handler)(enum livebox_fault_type event, const char *pkgname, const char *filename, const char *func, void *data);
79 static inline void default_create_cb(struct livebox *handler, int ret, void *data)
81 DbgPrint("Default created event handler: %d\n", ret);
84 static inline void default_delete_cb(struct livebox *handler, int ret, void *data)
86 DbgPrint("Default deleted event handler: %d\n", ret);
89 static inline void default_pinup_cb(struct livebox *handler, int ret, void *data)
91 DbgPrint("Default pinup event handler: %d\n", ret);
94 static inline void default_group_changed_cb(struct livebox *handler, int ret, void *data)
96 DbgPrint("Default group changed event handler: %d\n", ret);
99 static inline void default_period_changed_cb(struct livebox *handler, int ret, void *data)
101 DbgPrint("Default period changed event handler: %d\n", ret);
104 static inline void default_pd_created_cb(struct livebox *handler, int ret, void *data)
106 DbgPrint("Default PD created event handler: %d\n", ret);
109 static inline void default_pd_destroyed_cb(struct livebox *handler, int ret, void *data)
111 DbgPrint("Default PD destroyed event handler: %d\n", ret);
114 static inline void default_lb_size_changed_cb(struct livebox *handler, int ret, void *data)
116 DbgPrint("Default LB size changed event handler: %d\n", ret);
119 static inline void default_update_mode_cb(struct livebox *handler, int ret, void *data)
121 DbgPrint("Default update mode set event handler: %d\n", ret);
124 static inline void default_access_event_cb(struct livebox *handler, int ret, void *data)
126 DbgPrint("Default access event handler: %d\n", ret);
129 static inline __attribute__((always_inline)) struct cb_info *create_cb_info(ret_cb_t cb, void *data)
131 struct cb_info *info;
133 info = malloc(sizeof(*info));
135 CRITICAL_LOG("Heap: %s\n", strerror(errno));
144 static inline void destroy_cb_info(struct cb_info *info)
149 static void update_mode_cb(struct livebox *handler, const struct packet *result, void *data)
154 ret = LB_STATUS_ERROR_FAULT;
156 } else if (packet_get(result, "i", &ret) != 1) {
157 ErrPrint("Invalid argument\n");
158 ret = LB_STATUS_ERROR_INVALID;
163 DbgPrint("Resize request is failed: %d\n", ret);
170 handler->update_mode_cb(handler, ret, handler->update_mode_cbdata);
171 handler->update_mode_cb = NULL;
172 handler->update_mode_cbdata = NULL;
176 static void resize_cb(struct livebox *handler, const struct packet *result, void *data)
179 struct cb_info *info = data;
185 destroy_cb_info(info);
188 ret = LB_STATUS_ERROR_FAULT;
190 } else if (packet_get(result, "i", &ret) != 1) {
191 ErrPrint("Invalid argument\n");
192 ret = LB_STATUS_ERROR_INVALID;
198 * In case of resize request,
199 * The livebox handler will not have resized value right after this callback,
200 * It can only get the new size when it makes updates.
202 * So the user can only get the resized value(result) from the first update event
203 * after this request.
206 DbgPrint("Resize request is failed: %d\n", ret);
210 DbgPrint("Resize request is successfully sent\n");
214 handler->size_changed_cb(handler, ret, handler->size_cbdata);
215 handler->size_changed_cb = NULL;
216 handler->size_cbdata = NULL;
219 static void text_signal_cb(struct livebox *handler, const struct packet *result, void *data)
223 struct cb_info *info = data;
228 destroy_cb_info(info);
231 ret = LB_STATUS_ERROR_FAULT;
232 } else if (packet_get(result, "i", &ret) != 1) {
233 ErrPrint("Invalid argument\n");
234 ret = LB_STATUS_ERROR_INVALID;
238 cb(handler, ret, cbdata);
242 static void set_group_ret_cb(struct livebox *handler, const struct packet *result, void *data)
247 ret = LB_STATUS_ERROR_FAULT;
249 } else if (packet_get(result, "i", &ret) != 1) {
250 ErrPrint("Invalid argument\n");
251 ret = LB_STATUS_ERROR_INVALID;
261 handler->group_changed_cb(handler, ret, handler->group_cbdata);
262 handler->group_changed_cb = NULL;
263 handler->group_cbdata = NULL;
266 static void period_ret_cb(struct livebox *handler, const struct packet *result, void *data)
271 ret = LB_STATUS_ERROR_FAULT;
273 } else if (packet_get(result, "i", &ret) != 1) {
274 ErrPrint("Invalid argument\n");
275 ret = LB_STATUS_ERROR_INVALID;
282 DbgPrint("Succeed to send period change request, waiting result\n");
286 handler->period_changed_cb(handler, ret, handler->period_cbdata);
287 handler->period_changed_cb = NULL;
288 handler->period_cbdata = NULL;
291 static void del_ret_cb(struct livebox *handler, const struct packet *result, void *data)
293 struct cb_info *info = data;
300 destroy_cb_info(info);
303 ErrPrint("Connection lost?\n");
304 ret = LB_STATUS_ERROR_FAULT;
305 } else if (packet_get(result, "i", &ret) != 1) {
306 ErrPrint("Invalid argument\n");
307 ret = LB_STATUS_ERROR_INVALID;
311 DbgPrint("Returns %d (waiting deleted event)\n", ret);
312 handler->deleted_cb = cb;
313 handler->deleted_cbdata = cbdata;
315 cb(handler, ret, cbdata);
320 * Do not call the deleted callback from here.
321 * master will send the "deleted" event.
322 * Then invoke this callback.
324 * if (handler->deleted_cb)
325 * handler->deleted_cb(handler, ret, handler->deleted_cbdata);
329 static void new_ret_cb(struct livebox *handler, const struct packet *result, void *data)
332 struct cb_info *info = data;
338 destroy_cb_info(info);
341 ret = LB_STATUS_ERROR_FAULT;
342 } else if (packet_get(result, "i", &ret) != 1) {
343 ret = LB_STATUS_ERROR_INVALID;
347 DbgPrint("new request is sent, just waiting the created event\n");
348 handler->created_cb = cb;
349 handler->created_cbdata = cbdata;
353 * Don't go anymore ;)
359 * It means the current instance is not created,
360 * so user has to know about this.
361 * notice it to user using "deleted" event.
363 cb(handler, ret, cbdata);
369 static void pd_create_cb(struct livebox *handler, const struct packet *result, void *data)
374 ret = LB_STATUS_ERROR_FAULT;
376 } else if (packet_get(result, "i", &ret) != 1) {
377 ret = LB_STATUS_ERROR_INVALID;
382 DbgPrint("Failed to create a PD\n");
389 handler->pd_created_cb(handler, ret, handler->pd_created_cbdata);
390 handler->pd_created_cb = NULL;
391 handler->pd_created_cbdata = NULL;
394 static void activated_cb(struct livebox *handler, const struct packet *result, void *data)
397 struct cb_info *info = data;
400 const char *pkgname = "";
404 destroy_cb_info(info);
407 ret = LB_STATUS_ERROR_FAULT;
408 } else if (packet_get(result, "is", &ret, &pkgname) != 2) {
409 ret = LB_STATUS_ERROR_INVALID;
413 cb(handler, ret, cbdata);
416 static void pd_destroy_cb(struct livebox *handler, const struct packet *result, void *data)
421 struct cb_info *info = data;
425 destroy_cb_info(info);
428 DbgPrint("Result is NIL (may connection lost)\n");
429 ret = LB_STATUS_ERROR_FAULT;
430 } else if (packet_get(result, "i", &ret) != 1) {
431 DbgPrint("Invalid parameter\n");
432 ret = LB_STATUS_ERROR_INVALID;
436 DbgPrint("PD Destroyed callback prepared\n");
437 handler->pd_destroyed_cb = cb;
438 handler->pd_destroyed_cbdata = cbdata;
440 DbgPrint("PD is not desroyed (forcely reset, pd flag)\n");
441 handler->is_pd_created = 0;
442 cb(handler, ret, cbdata);
446 static void delete_cluster_cb(struct livebox *handler, const struct packet *result, void *data)
448 struct cb_info *info = data;
455 destroy_cb_info(info);
458 ret = LB_STATUS_ERROR_FAULT;
459 } else if (packet_get(result, "i", &ret) != 1) {
460 ret = LB_STATUS_ERROR_INVALID;
463 DbgPrint("Delete category returns: %d\n", ret);
466 cb(handler, ret, cbdata);
469 static void delete_category_cb(struct livebox *handler, const struct packet *result, void *data)
471 struct cb_info *info = data;
478 destroy_cb_info(info);
481 ret = LB_STATUS_ERROR_FAULT;
482 else if (packet_get(result, "i", &ret) != 1)
483 ret = LB_STATUS_ERROR_INVALID;
485 DbgPrint("Delete category returns: %d\n", ret);
488 cb(handler, ret, cbdata);
491 static void pixmap_acquired_cb(struct livebox *handler, const struct packet *result, void *data)
496 struct cb_info *info = data;
500 destroy_cb_info(info);
503 ret = 0; /* PIXMAP 0 means error */
504 else if (packet_get(result, "i", &ret) != 1)
508 cb(handler, ret, cbdata);
511 static void pinup_done_cb(struct livebox *handler, const struct packet *result, void *data)
516 ret = LB_STATUS_ERROR_FAULT;
518 } else if (packet_get(result, "i", &ret) != 1) {
528 handler->pinup_cb(handler, ret, handler->pinup_cbdata);
529 handler->pinup_cb = NULL;
530 handler->pinup_cbdata = NULL;
533 static void access_ret_cb(struct livebox *handler, const struct packet *result, void *data)
538 ret = LB_STATUS_ERROR_FAULT;
542 if (packet_get(result, "i", &ret) != 1) {
543 ret = LB_STATUS_ERROR_INVALID;
547 if (ret != LB_STATUS_SUCCESS) {
551 DbgPrint("Access event is successfully sent. waiting result\n");
555 handler->access_event_cb(handler, ret, handler->access_event_cbdata);
556 handler->access_event_cb = NULL;
557 handler->access_event_cbdata = NULL;
561 static int send_access_event(struct livebox *handler, const char *event, int x, int y)
563 struct packet *packet;
566 timestamp = util_timestamp();
568 packet = packet_create(event, "ssdii", handler->pkgname, handler->id, timestamp, x, y);
570 ErrPrint("Failed to build packet\n");
571 return LB_STATUS_ERROR_FAULT;
574 DbgPrint("Send: %dx%d\n", x, y);
576 return master_rpc_async_request(handler, packet, 0, access_ret_cb, NULL);
579 static int send_mouse_event(struct livebox *handler, const char *event, int x, int y)
581 struct packet *packet;
584 timestamp = util_timestamp();
585 packet = packet_create_noack(event, "ssdii", handler->pkgname, handler->id, timestamp, x, y);
587 ErrPrint("Failed to build param\n");
588 return LB_STATUS_ERROR_FAULT;
591 DbgPrint("Send: %dx%d\n", x, y);
593 return master_rpc_request_only(handler, packet);
596 EAPI int livebox_init(void *disp)
600 if (s_info.init_count > 0) {
602 return LB_STATUS_SUCCESS;
604 env = getenv("PROVIDER_DISABLE_PREVENT_OVERWRITE");
605 if (env && !strcasecmp(env, "true"))
606 s_info.prevent_overwrite = 1;
608 env = getenv("PROVIDER_EVENT_FILTER");
610 sscanf(env, "%lf", &MINIMUM_EVENT);
613 char filename[BUFSIZ];
614 snprintf(filename, sizeof(filename), "/tmp/%d.box.log", getpid());
615 __file_log_fp = fopen(filename, "w+t");
617 __file_log_fp = fdopen(1, "w+t");
619 critical_log_init("viewer");
620 livebox_service_init();
626 return LB_STATUS_SUCCESS;
629 EAPI int livebox_fini(void)
631 if (s_info.init_count <= 0) {
632 DbgPrint("Didn't initialized\n");
633 return LB_STATUS_ERROR_INVALID;
637 if (s_info.init_count > 0) {
638 DbgPrint("init count : %d\n", s_info.init_count);
639 return LB_STATUS_SUCCESS;
644 livebox_service_fini();
646 return LB_STATUS_SUCCESS;
649 static inline char *lb_pkgname(const char *pkgname)
653 lb = livebox_service_pkgname(pkgname);
655 if (util_validate_livebox_package(pkgname) == 0)
656 return strdup(pkgname);
663 * Just wrapping the livebox_add_with_size function.
665 EAPI struct livebox *livebox_add(const char *pkgname, const char *content, const char *cluster, const char *category, double period, ret_cb_t cb, void *data)
667 return livebox_add_with_size(pkgname, content, cluster, category, period, LB_SIZE_TYPE_UNKNOWN, cb, data);
670 EAPI struct livebox *livebox_add_with_size(const char *pkgname, const char *content, const char *cluster, const char *category, double period, int type, ret_cb_t cb, void *data)
672 struct livebox *handler;
673 struct packet *packet;
677 struct cb_info *cbinfo;
679 if (!pkgname || !cluster || !category) {
680 ErrPrint("Invalid arguments: pkgname[%p], cluster[%p], category[%p]\n",
681 pkgname, cluster, category);
685 if (type != LB_SIZE_TYPE_UNKNOWN)
686 livebox_service_get_size(type, &width, &height);
688 handler = calloc(1, sizeof(*handler));
690 ErrPrint("Error: %s\n", strerror(errno));
694 handler->pkgname = lb_pkgname(pkgname);
695 if (!handler->pkgname) {
700 if (livebox_service_is_enabled(handler->pkgname) == 0) {
701 DbgPrint("Livebox [%s](%s) is disabled package\n", handler->pkgname, pkgname);
702 free(handler->pkgname);
708 handler->content = strdup(content);
709 if (!handler->content) {
710 ErrPrint("Error: %s\n", strerror(errno));
711 free(handler->pkgname);
716 handler->content = livebox_service_content(handler->pkgname);
719 handler->cluster = strdup(cluster);
720 if (!handler->cluster) {
721 ErrPrint("Error: %s\n", strerror(errno));
722 free(handler->content);
723 free(handler->pkgname);
728 handler->category = strdup(category);
729 if (!handler->category) {
730 ErrPrint("Error: %s\n", strerror(errno));
731 free(handler->cluster);
732 free(handler->content);
733 free(handler->pkgname);
739 cb = default_create_cb;
741 /* Data provider will set this */
742 handler->lb.type = _LB_TYPE_FILE;
743 handler->pd.type = _PD_TYPE_SCRIPT;
744 handler->lb.period = period;
746 /* Used for handling the mouse event on a box */
747 handler->lb.mouse_event = livebox_service_mouse_event(handler->pkgname);
749 /* Cluster infomration is not determined yet */
750 handler->nr_of_sizes = 0x01;
752 handler->timestamp = util_timestamp();
753 handler->is_user = 1;
754 handler->visible = LB_SHOW;
756 s_info.livebox_list = dlist_append(s_info.livebox_list, handler);
758 packet = packet_create("new", "dssssdii", handler->timestamp, handler->pkgname, handler->content, cluster, category, period, width, height);
760 ErrPrint("Failed to create a new packet\n");
761 free(handler->category);
762 free(handler->cluster);
763 free(handler->content);
764 free(handler->pkgname);
769 cbinfo = create_cb_info(cb, data);
771 ErrPrint("Failed to create a cbinfo\n");
772 packet_destroy(packet);
773 free(handler->category);
774 free(handler->cluster);
775 free(handler->content);
776 free(handler->pkgname);
781 ret = master_rpc_async_request(handler, packet, 0, new_ret_cb, cbinfo);
783 ErrPrint("Failed to send a new packet\n");
784 destroy_cb_info(cbinfo);
785 free(handler->category);
786 free(handler->cluster);
787 free(handler->content);
788 free(handler->pkgname);
793 DbgPrint("Successfully sent a new request ([%lf] %s)\n", handler->timestamp, handler->pkgname);
794 handler->state = CREATE;
795 return lb_ref(handler);
798 EAPI double livebox_period(struct livebox *handler)
800 if (!handler || handler->state != CREATE || !handler->id) {
801 ErrPrint("Handler is not valid\n");
805 return handler->lb.period;
808 EAPI int livebox_set_period(struct livebox *handler, double period, ret_cb_t cb, void *data)
810 struct packet *packet;
813 if (!handler || handler->state != CREATE || !handler->id) {
814 ErrPrint("Handler is not valid\n");
815 return LB_STATUS_ERROR_INVALID;
818 if (handler->period_changed_cb) {
819 ErrPrint("Previous request for changing period is not finished\n");
820 return LB_STATUS_ERROR_BUSY;
823 if (!handler->is_user) {
824 ErrPrint("CA Livebox is not able to change the period\n");
825 return LB_STATUS_ERROR_PERMISSION;
828 if (handler->lb.period == period) {
829 DbgPrint("No changes\n");
830 return LB_STATUS_ERROR_ALREADY;
833 packet = packet_create("set_period", "ssd", handler->pkgname, handler->id, period);
835 ErrPrint("Failed to build a packet %s\n", handler->pkgname);
836 return LB_STATUS_ERROR_FAULT;
840 cb = default_period_changed_cb;
842 handler->period_changed_cb = cb;
843 handler->period_cbdata = data;
845 ret = master_rpc_async_request(handler, packet, 0, period_ret_cb, NULL);
847 handler->period_changed_cb = NULL;
848 handler->period_cbdata = NULL;
854 EAPI int livebox_del(struct livebox *handler, ret_cb_t cb, void *data)
857 ErrPrint("Handler is NIL\n");
858 return LB_STATUS_ERROR_INVALID;
861 if (handler->state != CREATE) {
862 ErrPrint("Handler is already deleted\n");
863 return LB_STATUS_ERROR_INVALID;
866 handler->state = DELETE;
871 * The id is not determined yet.
872 * It means a user didn't receive created event yet.
873 * Then just stop to delete procedure from here.
874 * Because the "created" event handler will release this.
875 * By the way, if the user adds any callback for getting return status of this,
879 cb(handler, 0, data);
880 return LB_STATUS_SUCCESS;
884 cb = default_delete_cb;
886 return lb_send_delete(handler, cb, data);
889 EAPI int livebox_set_fault_handler(int (*cb)(enum livebox_fault_type, const char *, const char *, const char *, void *), void *data)
891 struct fault_info *info;
894 return LB_STATUS_ERROR_INVALID;
896 info = malloc(sizeof(*info));
898 CRITICAL_LOG("Heap: %s\n", strerror(errno));
899 return LB_STATUS_ERROR_MEMORY;
903 info->user_data = data;
905 s_info.fault_list = dlist_append(s_info.fault_list, info);
906 return LB_STATUS_SUCCESS;
909 EAPI void *livebox_unset_fault_handler(int (*cb)(enum livebox_fault_type, const char *, const char *, const char *, void *))
911 struct fault_info *info;
914 dlist_foreach(s_info.fault_list, l, info) {
915 if (info->handler == cb) {
917 s_info.fault_list = dlist_remove(s_info.fault_list, l);
918 data = info->user_data;
928 EAPI int livebox_set_event_handler(int (*cb)(struct livebox *, enum livebox_event_type, void *), void *data)
930 struct event_info *info;
933 ErrPrint("Invalid argument cb is nil\n");
934 return LB_STATUS_ERROR_INVALID;
937 info = malloc(sizeof(*info));
939 CRITICAL_LOG("Heap: %s\n", strerror(errno));
940 return LB_STATUS_ERROR_MEMORY;
944 info->user_data = data;
946 s_info.event_list = dlist_append(s_info.event_list, info);
947 return LB_STATUS_SUCCESS;
950 EAPI void *livebox_unset_event_handler(int (*cb)(struct livebox *, enum livebox_event_type, void *))
952 struct event_info *info;
955 dlist_foreach(s_info.event_list, l, info) {
956 if (info->handler == cb) {
959 s_info.event_list = dlist_remove(s_info.event_list, l);
960 data = info->user_data;
970 EAPI int livebox_set_update_mode(struct livebox *handler, int active_update, ret_cb_t cb, void *data)
972 struct packet *packet;
976 ErrPrint("Handler is NIL\n");
977 return LB_STATUS_ERROR_INVALID;
980 if (handler->state != CREATE || !handler->id)
981 return LB_STATUS_ERROR_INVALID;
983 if (handler->update_mode_cb) {
984 ErrPrint("Previous update_mode cb is not finished yet\n");
985 return LB_STATUS_ERROR_BUSY;
988 if (handler->is_active_update == active_update)
989 return LB_STATUS_ERROR_ALREADY;
991 if (!handler->is_user)
992 return LB_STATUS_ERROR_PERMISSION;
994 packet = packet_create("update_mode", "ssi", handler->pkgname, handler->id, active_update);
996 return LB_STATUS_ERROR_FAULT;
999 cb = default_update_mode_cb;
1001 handler->update_mode_cb = cb;
1002 handler->update_mode_cbdata = data;
1004 ret = master_rpc_async_request(handler, packet, 0, update_mode_cb, NULL);
1006 handler->update_mode_cb = NULL;
1007 handler->update_mode_cbdata = NULL;
1013 EAPI int livebox_is_active_update(struct livebox *handler)
1016 ErrPrint("Handler is NIL\n");
1017 return LB_STATUS_ERROR_INVALID;
1020 if (handler->state != CREATE || !handler->id)
1021 return LB_STATUS_ERROR_INVALID;
1023 return handler->is_active_update;
1026 EAPI int livebox_resize(struct livebox *handler, int type, ret_cb_t cb, void *data)
1028 struct packet *packet;
1034 ErrPrint("Handler is NIL\n");
1035 return LB_STATUS_ERROR_INVALID;
1038 if (handler->state != CREATE || !handler->id) {
1039 ErrPrint("Handler is not valid\n");
1040 return LB_STATUS_ERROR_INVALID;
1043 if (handler->size_changed_cb) {
1044 ErrPrint("Previous resize request is not finished yet\n");
1045 return LB_STATUS_ERROR_BUSY;
1048 if (!handler->is_user) {
1049 ErrPrint("CA Livebox is not able to be resized\n");
1050 return LB_STATUS_ERROR_PERMISSION;
1053 if (livebox_service_get_size(type, &w, &h) != 0) {
1054 ErrPrint("Invalid size type\n");
1055 return LB_STATUS_ERROR_INVALID;
1058 if (handler->lb.width == w && handler->lb.height == h) {
1059 DbgPrint("No changes\n");
1060 return LB_STATUS_ERROR_ALREADY;;
1063 packet = packet_create("resize", "ssii", handler->pkgname, handler->id, w, h);
1065 ErrPrint("Failed to build param\n");
1066 return LB_STATUS_ERROR_FAULT;
1070 cb = default_lb_size_changed_cb;
1072 handler->size_changed_cb = cb;
1073 handler->size_cbdata = data;
1075 ret = master_rpc_async_request(handler, packet, 0, resize_cb, NULL);
1077 handler->size_changed_cb = NULL;
1078 handler->size_cbdata = NULL;
1084 EAPI int livebox_click(struct livebox *handler, double x, double y)
1086 struct packet *packet;
1091 ErrPrint("Handler is NIL\n");
1092 return LB_STATUS_ERROR_INVALID;
1095 if (handler->state != CREATE || !handler->id) {
1096 ErrPrint("Handler is not valid\n");
1097 return LB_STATUS_ERROR_INVALID;
1100 if (handler->lb.auto_launch) {
1101 DbgPrint("Auto-launch enabled: %s\n", handler->lb.auto_launch);
1102 if (aul_launch_app(handler->lb.auto_launch, NULL) < 0)
1103 ErrPrint("Failed to launch app %s\n", handler->lb.auto_launch);
1106 timestamp = util_timestamp();
1107 packet = packet_create_noack("clicked", "sssddd", handler->pkgname, handler->id, "clicked", timestamp, x, y);
1109 ErrPrint("Failed to build param\n");
1110 return LB_STATUS_ERROR_FAULT;
1113 ret = master_rpc_request_only(handler, packet);
1114 DbgPrint("Click request: %d\n", ret);
1116 if (!handler->lb.mouse_event && (handler->lb.type == _LB_TYPE_BUFFER || handler->lb.type == _LB_TYPE_SCRIPT)) {
1117 int ret; /* Shadow variable */
1118 ret = send_mouse_event(handler, "lb_mouse_down", x * handler->lb.width, y * handler->lb.height);
1120 DbgPrint("Failed to send Down: %d\n", ret);
1122 ret = send_mouse_event(handler, "lb_mouse_move", x * handler->lb.width, y * handler->lb.height);
1124 DbgPrint("Failed to send Move: %d\n", ret);
1126 ret = send_mouse_event(handler, "lb_mouse_up", x * handler->lb.width, y * handler->lb.height);
1128 DbgPrint("Failed to send Up: %d\n", ret);
1134 EAPI int livebox_has_pd(struct livebox *handler)
1137 ErrPrint("Handler is NIL\n");
1138 return LB_STATUS_ERROR_INVALID;
1141 if (handler->state != CREATE || !handler->id) {
1142 ErrPrint("Handler is not valid\n");
1143 return LB_STATUS_ERROR_INVALID;
1146 return !!handler->pd.data.fb;
1149 EAPI int livebox_pd_is_created(struct livebox *handler)
1152 ErrPrint("Handler is NIL\n");
1153 return LB_STATUS_ERROR_INVALID;
1156 if (!handler->pd.data.fb || handler->state != CREATE || !handler->id) {
1157 ErrPrint("Handler is not valid\n");
1158 return LB_STATUS_ERROR_INVALID;
1161 return handler->is_pd_created;
1164 EAPI int livebox_create_pd(struct livebox *handler, ret_cb_t cb, void *data)
1166 return livebox_create_pd_with_position(handler, -1.0, -1.0, cb, data);
1169 EAPI int livebox_create_pd_with_position(struct livebox *handler, double x, double y, ret_cb_t cb, void *data)
1171 struct packet *packet;
1175 ErrPrint("Handler is NIL\n");
1176 return LB_STATUS_ERROR_INVALID;
1179 if (!handler->pd.data.fb || handler->state != CREATE || !handler->id) {
1180 ErrPrint("Handler is not valid\n");
1181 return LB_STATUS_ERROR_INVALID;
1184 if (handler->is_pd_created == 1) {
1185 DbgPrint("PD already created\n");
1186 return LB_STATUS_SUCCESS;
1189 if (handler->pd_created_cb) {
1190 ErrPrint("Previous request is not completed yet\n");
1191 return LB_STATUS_ERROR_BUSY;
1194 packet = packet_create("create_pd", "ssdd", handler->pkgname, handler->id, x, y);
1196 ErrPrint("Failed to build param\n");
1197 return LB_STATUS_ERROR_FAULT;
1201 cb = default_pd_created_cb;
1203 handler->pd_created_cb = cb;
1204 handler->pd_created_cbdata = data;
1206 ret = master_rpc_async_request(handler, packet, 0, pd_create_cb, NULL);
1208 handler->pd_created_cb = NULL;
1209 handler->pd_created_cbdata = NULL;
1215 EAPI int livebox_move_pd(struct livebox *handler, double x, double y)
1217 struct packet *packet;
1220 ErrPrint("Handler is NIL\n");
1221 return LB_STATUS_ERROR_INVALID;
1224 if (!handler->pd.data.fb || handler->state != CREATE || !handler->id) {
1225 ErrPrint("Handler is not valid\n");
1226 return LB_STATUS_ERROR_INVALID;
1229 if (!handler->is_pd_created) {
1230 DbgPrint("PD is not created\n");
1231 return LB_STATUS_ERROR_INVALID;
1234 packet = packet_create_noack("pd_move", "ssdd", handler->pkgname, handler->id, x, y);
1236 ErrPrint("Failed to build param\n");
1237 return LB_STATUS_ERROR_FAULT;
1240 return master_rpc_request_only(handler, packet);
1243 EAPI int livebox_activate(const char *pkgname, ret_cb_t cb, void *data)
1245 struct packet *packet;
1246 struct cb_info *cbinfo;
1250 return LB_STATUS_ERROR_INVALID;
1252 packet = packet_create("activate_package", "s", pkgname);
1254 ErrPrint("Failed to build a param\n");
1255 return LB_STATUS_ERROR_FAULT;
1258 cbinfo = create_cb_info(cb, data);
1260 ErrPrint("Unable to create cbinfo\n");
1261 packet_destroy(packet);
1262 return LB_STATUS_ERROR_FAULT;
1265 ret = master_rpc_async_request(NULL, packet, 0, activated_cb, cbinfo);
1267 destroy_cb_info(cbinfo);
1272 EAPI int livebox_destroy_pd(struct livebox *handler, ret_cb_t cb, void *data)
1274 struct packet *packet;
1275 struct cb_info *cbinfo;
1279 ErrPrint("Handler is NIL\n");
1280 return LB_STATUS_ERROR_INVALID;
1283 if (!handler->pd.data.fb || handler->state != CREATE || !handler->id) {
1284 ErrPrint("Handler is not valid\n");
1285 return LB_STATUS_ERROR_INVALID;
1288 if (!handler->is_pd_created) {
1289 ErrPrint("PD is not created\n");
1290 return LB_STATUS_ERROR_INVALID;
1293 packet = packet_create("destroy_pd", "ss", handler->pkgname, handler->id);
1295 ErrPrint("Failed to build a param\n");
1296 return LB_STATUS_ERROR_FAULT;
1300 cb = default_pd_destroyed_cb;
1302 cbinfo = create_cb_info(cb, data);
1304 packet_destroy(packet);
1305 return LB_STATUS_ERROR_FAULT;
1308 ret = master_rpc_async_request(handler, packet, 0, pd_destroy_cb, cbinfo);
1310 destroy_cb_info(cbinfo);
1315 EAPI int livebox_access_event(struct livebox *handler, enum access_event_type type, double x, double y, ret_cb_t cb, void *data)
1319 char cmd[32] = { '\0', };
1324 ErrPrint("Handler is NIL\n");
1325 return LB_STATUS_ERROR_INVALID;
1328 if (handler->state != CREATE || !handler->id) {
1329 ErrPrint("Handler is not valid\n");
1330 return LB_STATUS_ERROR_INVALID;
1333 if (handler->access_event_cb) {
1334 ErrPrint("Previous access event is not yet done\n");
1335 return LB_STATUS_ERROR_BUSY;
1338 if (type & ACCESS_EVENT_PD_MASK) {
1339 if (!handler->is_pd_created) {
1340 ErrPrint("PD is not created\n");
1341 return LB_STATUS_ERROR_INVALID;
1345 w = handler->pd.width;
1346 h = handler->pd.height;
1347 } else if (type & ACCESS_EVENT_LB_MASK) {
1350 w = handler->lb.width;
1351 h = handler->lb.height;
1353 ErrPrint("Invalid event type\n");
1354 return LB_STATUS_ERROR_INVALID;
1357 switch (type & ~ACCESS_EVENT_PD_MASK) {
1358 case ACCESS_EVENT_HIGHLIGHT:
1359 strcpy(ptr, "_access_hl");
1361 case ACCESS_EVENT_HIGHLIGHT_NEXT:
1362 strcpy(ptr, "_access_hl_next");
1364 case ACCESS_EVENT_HIGHLIGHT_PREV:
1365 strcpy(ptr, "_access_hl_prev");
1367 case ACCESS_EVENT_ACTIVATE:
1368 strcpy(ptr, "_access_activate");
1370 case ACCESS_EVENT_ACTION_DOWN:
1371 strcpy(ptr, "_access_action_down");
1373 case ACCESS_EVENT_ACTION_UP:
1374 strcpy(ptr, "_access_action_up");
1376 case ACCESS_EVENT_UNHIGHLIGHT:
1377 strcpy(ptr, "_access_unhighlight");
1379 case ACCESS_EVENT_SCROLL_DOWN:
1380 strcpy(ptr, "_access_scroll_down");
1382 case ACCESS_EVENT_SCROLL_MOVE:
1383 strcpy(ptr, "_access_scroll_move");
1385 case ACCESS_EVENT_SCROLL_UP:
1386 strcpy(ptr, "_access_scroll_up");
1389 return LB_STATUS_ERROR_INVALID;
1393 cb = default_access_event_cb;
1395 handler->access_event_cb = cb;
1396 handler->access_event_cbdata = data;
1398 ret = send_access_event(handler, cmd, x * w, y * h);
1400 handler->access_event_cb = NULL;
1401 handler->access_event_cbdata = NULL;
1407 EAPI int livebox_content_event(struct livebox *handler, enum content_event_type type, double x, double y)
1411 char cmd[32] = { '\0', };
1415 ErrPrint("Handler is NIL\n");
1416 return LB_STATUS_ERROR_INVALID;
1419 if (handler->state != CREATE || !handler->id) {
1420 ErrPrint("Handler is not valid\n");
1421 return LB_STATUS_ERROR_INVALID;
1424 if (type & CONTENT_EVENT_PD_MASK) {
1427 if (!handler->is_pd_created) {
1428 ErrPrint("PD is not created\n");
1429 return LB_STATUS_ERROR_INVALID;
1432 if (type & CONTENT_EVENT_MOUSE_MASK) {
1433 if (!handler->pd.data.fb) {
1434 ErrPrint("Handler is not valid\n");
1435 return LB_STATUS_ERROR_INVALID;
1438 if (type & CONTENT_EVENT_MOUSE_MOVE) {
1439 if (fabs(x - handler->pd.x) < MINIMUM_EVENT && fabs(y - handler->pd.y) < MINIMUM_EVENT)
1440 return LB_STATUS_ERROR_BUSY;
1441 } else if (type & CONTENT_EVENT_MOUSE_SET) {
1447 w = handler->pd.width;
1448 h = handler->pd.height;
1454 } else if (type & CONTENT_EVENT_LB_MASK) {
1457 if (type & CONTENT_EVENT_MOUSE_MASK) {
1458 if (!handler->lb.mouse_event) {
1459 ErrPrint("Box is not support the mouse event\n");
1460 return LB_STATUS_ERROR_INVALID;
1463 if (!handler->lb.data.fb) {
1464 ErrPrint("Handler is not valid\n");
1465 return LB_STATUS_ERROR_INVALID;
1468 if (type & CONTENT_EVENT_MOUSE_MOVE) {
1469 if (fabs(x - handler->lb.x) < MINIMUM_EVENT && fabs(y - handler->lb.y) < MINIMUM_EVENT)
1470 return LB_STATUS_ERROR_BUSY;
1471 } else if (type & CONTENT_EVENT_MOUSE_SET) {
1477 w = handler->lb.width;
1478 h = handler->lb.height;
1485 ErrPrint("Invalid event type\n");
1486 return LB_STATUS_ERROR_INVALID;
1490 * Must be short than 29 bytes.
1492 switch ((type & ~(CONTENT_EVENT_PD_MASK | CONTENT_EVENT_LB_MASK))) {
1493 case CONTENT_EVENT_MOUSE_ENTER | CONTENT_EVENT_MOUSE_MASK:
1494 strcpy(ptr, "_mouse_enter");
1496 case CONTENT_EVENT_MOUSE_LEAVE | CONTENT_EVENT_MOUSE_MASK:
1497 strcpy(ptr, "_mouse_leave");
1499 case CONTENT_EVENT_MOUSE_UP | CONTENT_EVENT_MOUSE_MASK:
1500 strcpy(ptr, "_mouse_up");
1502 case CONTENT_EVENT_MOUSE_DOWN | CONTENT_EVENT_MOUSE_MASK:
1503 strcpy(ptr, "_mouse_down");
1505 case CONTENT_EVENT_MOUSE_MOVE | CONTENT_EVENT_MOUSE_MASK:
1506 strcpy(ptr, "_mouse_move");
1508 case CONTENT_EVENT_MOUSE_SET | CONTENT_EVENT_MOUSE_MASK:
1509 strcpy(ptr, "_mouse_set");
1511 case CONTENT_EVENT_MOUSE_UNSET | CONTENT_EVENT_MOUSE_MASK:
1512 strcpy(ptr, "_mouse_unset");
1514 case CONTENT_EVENT_KEY_DOWN | CONTENT_EVENT_KEY_MASK:
1515 strcpy(ptr, "_key_down");
1517 case CONTENT_EVENT_KEY_UP | CONTENT_EVENT_KEY_MASK:
1518 strcpy(ptr, "_key_up");
1521 ErrPrint("Invalid event type\n");
1522 return LB_STATUS_ERROR_INVALID;
1525 return send_mouse_event(handler, cmd, x * w, y * h);
1528 EAPI const char *livebox_filename(struct livebox *handler)
1531 ErrPrint("Handler is NIL\n");
1535 if (handler->state != CREATE || !handler->id) {
1536 ErrPrint("Handler is not valid\n");
1540 if (handler->filename)
1541 return handler->filename;
1544 return util_uri_to_path(handler->id);
1547 EAPI int livebox_get_pdsize(struct livebox *handler, int *w, int *h)
1553 ErrPrint("Handler is NIL\n");
1554 return LB_STATUS_ERROR_INVALID;
1557 if (handler->state != CREATE || !handler->id) {
1558 ErrPrint("Handler is not valid\n");
1559 return LB_STATUS_ERROR_INVALID;
1567 if (!handler->is_pd_created) {
1568 DbgPrint("Buffer is not created yet [%dx%d]\n", *w, *h);
1569 *w = handler->pd.default_width;
1570 *h = handler->pd.default_height;
1572 *w = handler->pd.width;
1573 *h = handler->pd.height;
1576 return LB_STATUS_SUCCESS;
1579 EAPI int livebox_size(struct livebox *handler)
1585 ErrPrint("Handler is NIL\n");
1586 return LB_STATUS_ERROR_INVALID;
1589 if (handler->state != CREATE || !handler->id) {
1590 ErrPrint("Handler is not valid\n");
1591 return LB_STATUS_ERROR_INVALID;
1594 w = handler->lb.width;
1595 h = handler->lb.height;
1597 switch (handler->lb.type) {
1598 case _LB_TYPE_BUFFER:
1599 case _LB_TYPE_SCRIPT:
1600 if (!fb_is_created(handler->lb.data.fb)) {
1601 DbgPrint("Buffer is not created yet - reset size\n");
1610 return livebox_service_size_type(w, h);
1613 EAPI int livebox_set_group(struct livebox *handler, const char *cluster, const char *category, ret_cb_t cb, void *data)
1615 struct packet *packet;
1619 ErrPrint("Handler is NIL\n");
1620 return LB_STATUS_ERROR_INVALID;
1623 if (!cluster || !category || handler->state != CREATE || !handler->id) {
1624 ErrPrint("Invalid argument\n");
1625 return LB_STATUS_ERROR_INVALID;
1628 if (handler->group_changed_cb) {
1629 ErrPrint("Previous group changing request is not finished yet\n");
1630 return LB_STATUS_ERROR_BUSY;
1633 if (!handler->is_user) {
1634 ErrPrint("CA Livebox is not able to change the group\n");
1635 return LB_STATUS_ERROR_PERMISSION;
1638 if (!strcmp(handler->cluster, cluster) && !strcmp(handler->category, category)) {
1639 DbgPrint("No changes\n");
1640 return LB_STATUS_ERROR_ALREADY;
1643 packet = packet_create("change_group", "ssss", handler->pkgname, handler->id, cluster, category);
1645 ErrPrint("Failed to build a param\n");
1646 return LB_STATUS_ERROR_FAULT;
1650 cb = default_group_changed_cb;
1652 handler->group_changed_cb = cb;
1653 handler->group_cbdata = data;
1655 ret = master_rpc_async_request(handler, packet, 0, set_group_ret_cb, NULL);
1657 handler->group_changed_cb = NULL;
1658 handler->group_cbdata = NULL;
1664 EAPI int livebox_get_group(struct livebox *handler, char ** const cluster, char ** const category)
1667 ErrPrint("Handler is NIL\n");
1668 return LB_STATUS_ERROR_INVALID;
1671 if (!cluster || !category || handler->state != CREATE || !handler->id) {
1672 ErrPrint("Invalid argument\n");
1673 return LB_STATUS_ERROR_INVALID;
1676 *cluster = handler->cluster;
1677 *category = handler->category;
1678 return LB_STATUS_SUCCESS;
1681 EAPI int livebox_get_supported_sizes(struct livebox *handler, int *cnt, int *size_list)
1686 if (!handler || !size_list) {
1687 ErrPrint("Invalid argument, handler(%p), size_list(%p)\n", handler, size_list);
1688 return LB_STATUS_ERROR_INVALID;
1691 if (!cnt || handler->state != CREATE || !handler->id) {
1692 ErrPrint("Handler is not valid\n");
1693 return LB_STATUS_ERROR_INVALID;
1696 for (j = i = 0; i < NR_OF_SIZE_LIST; i++) {
1697 if (handler->lb.size_list & (0x01 << i)) {
1701 size_list[j++] = (0x01 << i);
1706 return LB_STATUS_SUCCESS;
1709 EAPI const char *livebox_pkgname(struct livebox *handler)
1712 ErrPrint("Handler is NIL\n");
1716 if (handler->state != CREATE) {
1717 ErrPrint("Handler is not valid\n");
1721 return handler->pkgname;
1724 EAPI double livebox_priority(struct livebox *handler)
1727 ErrPrint("Handler is NIL\n");
1731 if (handler->state != CREATE || !handler->id) {
1732 ErrPrint("Handler is not valid (%p)\n", handler);
1736 return handler->lb.priority;
1739 EAPI int livebox_delete_cluster(const char *cluster, ret_cb_t cb, void *data)
1741 struct packet *packet;
1742 struct cb_info *cbinfo;
1745 packet = packet_create("delete_cluster", "s", cluster);
1747 ErrPrint("Failed to build a param\n");
1748 return LB_STATUS_ERROR_FAULT;
1751 cbinfo = create_cb_info(cb, data);
1753 packet_destroy(packet);
1754 return LB_STATUS_ERROR_FAULT;
1757 ret = master_rpc_async_request(NULL, packet, 0, delete_cluster_cb, cbinfo);
1759 destroy_cb_info(cbinfo);
1764 EAPI int livebox_delete_category(const char *cluster, const char *category, ret_cb_t cb, void *data)
1766 struct packet *packet;
1767 struct cb_info *cbinfo;
1770 packet = packet_create("delete_category", "ss", cluster, category);
1772 ErrPrint("Failed to build a param\n");
1773 return LB_STATUS_ERROR_FAULT;
1776 cbinfo = create_cb_info(cb, data);
1778 packet_destroy(packet);
1779 return LB_STATUS_ERROR_FAULT;
1782 ret = master_rpc_async_request(NULL, packet, 0, delete_category_cb, cbinfo);
1784 destroy_cb_info(cbinfo);
1789 EAPI enum livebox_lb_type livebox_lb_type(struct livebox *handler)
1792 ErrPrint("Handler is NIL\n");
1793 return LB_TYPE_INVALID;
1796 if (handler->state != CREATE || !handler->id) {
1797 ErrPrint("Handler is not valid\n");
1798 return LB_TYPE_INVALID;
1801 switch (handler->lb.type) {
1803 return LB_TYPE_IMAGE;
1804 case _LB_TYPE_BUFFER:
1805 case _LB_TYPE_SCRIPT:
1808 id = fb_id(handler->lb.data.fb);
1809 if (id && !strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)))
1810 return LB_TYPE_PIXMAP;
1812 return LB_TYPE_BUFFER;
1814 return LB_TYPE_TEXT;
1819 return LB_TYPE_INVALID;
1822 EAPI enum livebox_pd_type livebox_pd_type(struct livebox *handler)
1825 ErrPrint("Handler is NIL\n");
1826 return PD_TYPE_INVALID;
1829 if (handler->state != CREATE || !handler->id) {
1830 ErrPrint("Handler is not valid\n");
1831 return PD_TYPE_INVALID;
1834 switch (handler->pd.type) {
1836 return PD_TYPE_TEXT;
1837 case _PD_TYPE_BUFFER:
1838 case _PD_TYPE_SCRIPT:
1841 id = fb_id(handler->pd.data.fb);
1842 if (id && !strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)))
1843 return PD_TYPE_PIXMAP;
1845 return PD_TYPE_BUFFER;
1850 return PD_TYPE_INVALID;
1853 EAPI int livebox_set_pd_text_handler(struct livebox *handler, struct livebox_script_operators *ops)
1856 ErrPrint("Handler is NIL\n");
1857 return LB_STATUS_ERROR_INVALID;
1860 if (handler->state != CREATE) {
1861 ErrPrint("Handler is not valid\n");
1862 return LB_STATUS_ERROR_INVALID;
1865 memcpy(&handler->pd.data.ops, ops, sizeof(*ops));
1866 return LB_STATUS_SUCCESS;
1869 EAPI int livebox_set_text_handler(struct livebox *handler, struct livebox_script_operators *ops)
1872 ErrPrint("Handler is NIL\n");
1873 return LB_STATUS_ERROR_INVALID;
1876 if (handler->state != CREATE) {
1877 ErrPrint("Handler is not valid\n");
1878 return LB_STATUS_ERROR_INVALID;
1881 memcpy(&handler->lb.data.ops, ops, sizeof(*ops));
1882 return LB_STATUS_SUCCESS;
1885 EAPI int livebox_acquire_lb_pixmap(struct livebox *handler, ret_cb_t cb, void *data)
1887 struct packet *packet;
1888 struct cb_info *cbinfo;
1893 ErrPrint("Handler is NIL\n");
1894 return LB_STATUS_ERROR_INVALID;
1897 if (handler->state != CREATE || !handler->id) {
1898 ErrPrint("Invalid handle\n");
1899 return LB_STATUS_ERROR_INVALID;
1902 if (handler->lb.type != _LB_TYPE_SCRIPT && handler->lb.type != _LB_TYPE_BUFFER) {
1903 ErrPrint("Handler is not valid type\n");
1904 return LB_STATUS_ERROR_INVALID;
1907 id = fb_id(handler->lb.data.fb);
1908 if (!id || strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)))
1909 return LB_STATUS_ERROR_INVALID;
1911 packet = packet_create("lb_acquire_pixmap", "ss", handler->pkgname, handler->id);
1913 ErrPrint("Failed to build a param\n");
1914 return LB_STATUS_ERROR_FAULT;
1917 cbinfo = create_cb_info(cb, data);
1919 packet_destroy(packet);
1920 return LB_STATUS_ERROR_FAULT;
1923 ret = master_rpc_async_request(handler, packet, 0, pixmap_acquired_cb, cbinfo);
1925 destroy_cb_info(cbinfo);
1930 EAPI int livebox_release_lb_pixmap(struct livebox *handler, int pixmap)
1932 struct packet *packet;
1935 ErrPrint("Handler is NIL\n");
1936 return LB_STATUS_ERROR_INVALID;
1939 if (handler->state != CREATE || !handler->id) {
1940 ErrPrint("Invalid handle\n");
1941 return LB_STATUS_ERROR_INVALID;
1944 if (handler->lb.type != _LB_TYPE_SCRIPT && handler->lb.type != _LB_TYPE_BUFFER) {
1945 ErrPrint("Handler is not valid type\n");
1946 return LB_STATUS_ERROR_INVALID;
1949 packet = packet_create_noack("lb_release_pixmap", "ssi", handler->pkgname, handler->id, pixmap);
1951 ErrPrint("Failed to build a param\n");
1952 return LB_STATUS_ERROR_INVALID;
1955 return master_rpc_request_only(handler, packet);
1958 EAPI int livebox_acquire_pd_pixmap(struct livebox *handler, ret_cb_t cb, void *data)
1960 struct packet *packet;
1961 struct cb_info *cbinfo;
1966 ErrPrint("Handler is NIL\n");
1967 return LB_STATUS_ERROR_INVALID;
1970 if (handler->state != CREATE || !handler->id) {
1971 ErrPrint("Invalid handle\n");
1972 return LB_STATUS_ERROR_INVALID;
1975 if (handler->pd.type != _PD_TYPE_SCRIPT && handler->pd.type != _PD_TYPE_BUFFER) {
1976 ErrPrint("Handler is not valid type\n");
1977 return LB_STATUS_ERROR_INVALID;
1980 id = fb_id(handler->pd.data.fb);
1981 if (!id || strncasecmp(id, SCHEMA_PIXMAP, strlen(SCHEMA_PIXMAP)))
1982 return LB_STATUS_ERROR_INVALID;
1984 packet = packet_create("pd_acquire_pixmap", "ss", handler->pkgname, handler->id);
1986 ErrPrint("Failed to build a param\n");
1987 return LB_STATUS_ERROR_FAULT;
1990 cbinfo = create_cb_info(cb, data);
1992 packet_destroy(packet);
1993 return LB_STATUS_ERROR_FAULT;
1996 ret = master_rpc_async_request(handler, packet, 0, pixmap_acquired_cb, cbinfo);
1998 destroy_cb_info(cbinfo);
2003 EAPI int livebox_pd_pixmap(const struct livebox *handler)
2009 ErrPrint("Handler is NIL\n");
2013 if (handler->state != CREATE || !handler->id) {
2014 ErrPrint("Invalid handler\n");
2018 if (handler->pd.type != _PD_TYPE_SCRIPT && handler->pd.type != _PD_TYPE_BUFFER) {
2019 ErrPrint("Invalid handler\n");
2023 id = fb_id(handler->pd.data.fb);
2024 if (id && sscanf(id, SCHEMA_PIXMAP "%d", &pixmap) != 1) {
2025 ErrPrint("PIXMAP Id is not valid\n");
2032 EAPI int livebox_lb_pixmap(const struct livebox *handler)
2038 ErrPrint("Handler is NIL\n");
2042 if (handler->state != CREATE || !handler->id) {
2043 ErrPrint("Invalid handler\n");
2047 if (handler->lb.type != _LB_TYPE_SCRIPT && handler->lb.type != _LB_TYPE_BUFFER) {
2048 ErrPrint("Invalid handler\n");
2052 id = fb_id(handler->lb.data.fb);
2053 if (id && sscanf(id, SCHEMA_PIXMAP "%d", &pixmap) != 1) {
2054 ErrPrint("PIXMAP Id is not valid\n");
2061 EAPI int livebox_release_pd_pixmap(struct livebox *handler, int pixmap)
2063 struct packet *packet;
2066 ErrPrint("Handler is NIL\n");
2067 return LB_STATUS_ERROR_INVALID;
2070 if (handler->state != CREATE || !handler->id) {
2071 ErrPrint("Invalid handle\n");
2072 return LB_STATUS_ERROR_INVALID;
2075 if (handler->pd.type != _PD_TYPE_SCRIPT && handler->pd.type != _PD_TYPE_BUFFER) {
2076 ErrPrint("Handler is not valid type\n");
2077 return LB_STATUS_ERROR_INVALID;
2080 packet = packet_create_noack("pd_release_pixmap", "ssi", handler->pkgname, handler->id, pixmap);
2082 ErrPrint("Failed to build a param\n");
2083 return LB_STATUS_ERROR_FAULT;
2086 return master_rpc_request_only(handler, packet);
2089 EAPI void *livebox_acquire_fb(struct livebox *handler)
2092 ErrPrint("Handler is NIL\n");
2096 if (handler->state != CREATE || !handler->id) {
2097 ErrPrint("Invalid handle\n");
2101 if (handler->lb.type != _LB_TYPE_SCRIPT && handler->lb.type != _LB_TYPE_BUFFER) {
2102 ErrPrint("Handler is not valid type\n");
2106 return fb_acquire_buffer(handler->lb.data.fb);
2109 EAPI int livebox_release_fb(void *buffer)
2111 return fb_release_buffer(buffer);
2114 EAPI int livebox_fb_refcnt(void *buffer)
2116 return fb_refcnt(buffer);
2119 EAPI void *livebox_acquire_pdfb(struct livebox *handler)
2122 ErrPrint("Handler is NIL\n");
2126 if (handler->state != CREATE || !handler->id) {
2127 ErrPrint("Invalid handler\n");
2131 if (handler->pd.type != _PD_TYPE_SCRIPT && handler->pd.type != _PD_TYPE_BUFFER) {
2132 ErrPrint("Handler is not valid type\n");
2136 return fb_acquire_buffer(handler->pd.data.fb);
2139 EAPI int livebox_release_pdfb(void *buffer)
2141 return fb_release_buffer(buffer);
2144 EAPI int livebox_pdfb_refcnt(void *buffer)
2146 return fb_refcnt(buffer);
2149 EAPI int livebox_pdfb_bufsz(struct livebox *handler)
2152 ErrPrint("Handler is NIL\n");
2153 return LB_STATUS_ERROR_INVALID;
2156 if (handler->state != CREATE || !handler->id) {
2157 ErrPrint("Handler is not valid\n");
2158 return LB_STATUS_ERROR_INVALID;
2161 return fb_size(handler->pd.data.fb);
2164 EAPI int livebox_lbfb_bufsz(struct livebox *handler)
2167 ErrPrint("Handler is NIL\n");
2168 return LB_STATUS_ERROR_INVALID;
2171 if (handler->state != CREATE || !handler->id) {
2172 ErrPrint("Handler is not valid\n");
2173 return LB_STATUS_ERROR_INVALID;
2176 return fb_size(handler->lb.data.fb);
2179 EAPI int livebox_is_user(struct livebox *handler)
2182 ErrPrint("Handler is NIL\n");
2183 return LB_STATUS_ERROR_INVALID;
2186 if (handler->state != CREATE) {
2187 ErrPrint("Handler is invalid\n");
2188 return LB_STATUS_ERROR_INVALID;
2191 return handler->is_user;
2194 EAPI int livebox_set_pinup(struct livebox *handler, int flag, ret_cb_t cb, void *data)
2196 struct packet *packet;
2200 ErrPrint("Handler is NIL\n");
2201 return LB_STATUS_ERROR_INVALID;
2204 if (handler->state != CREATE || !handler->id) {
2205 ErrPrint("Handler is not valid\n");
2206 return LB_STATUS_ERROR_INVALID;
2209 if (handler->pinup_cb) {
2210 ErrPrint("Previous pinup request is not finished\n");
2211 return LB_STATUS_ERROR_BUSY;
2214 if (handler->is_pinned_up == flag) {
2215 DbgPrint("No changes\n");
2216 return LB_STATUS_ERROR_ALREADY;
2219 packet = packet_create("pinup_changed", "ssi", handler->pkgname, handler->id, flag);
2221 ErrPrint("Failed to build a param\n");
2222 return LB_STATUS_ERROR_FAULT;
2226 cb = default_pinup_cb;
2228 handler->pinup_cb = cb;
2229 handler->pinup_cbdata = data;
2231 ret = master_rpc_async_request(handler, packet, 0, pinup_done_cb, NULL);
2233 handler->pinup_cb = NULL;
2234 handler->pinup_cbdata = NULL;
2240 EAPI int livebox_is_pinned_up(struct livebox *handler)
2243 ErrPrint("Handler is NIL\n");
2244 return LB_STATUS_ERROR_INVALID;
2247 if (handler->state != CREATE || !handler->id)
2248 return LB_STATUS_ERROR_INVALID;
2250 return handler->is_pinned_up;
2253 EAPI int livebox_has_pinup(struct livebox *handler)
2256 ErrPrint("Handler is NIL\n");
2257 return LB_STATUS_ERROR_INVALID;
2260 if (handler->state != CREATE || !handler->id)
2261 return LB_STATUS_ERROR_INVALID;
2263 return handler->lb.pinup_supported;
2266 EAPI int livebox_set_data(struct livebox *handler, void *data)
2269 ErrPrint("Handler is NIL\n");
2270 return LB_STATUS_ERROR_INVALID;
2273 if (handler->state != CREATE)
2274 return LB_STATUS_ERROR_INVALID;
2276 handler->data = data;
2277 return LB_STATUS_SUCCESS;
2280 EAPI void *livebox_get_data(struct livebox *handler)
2283 ErrPrint("Handler is NIL\n");
2287 if (handler->state != CREATE)
2290 return handler->data;
2293 EAPI int livebox_is_exists(const char *pkgname)
2297 lb = lb_pkgname(pkgname);
2306 EAPI const char *livebox_content(struct livebox *handler)
2309 ErrPrint("Handler is NIL\n");
2313 if (handler->state != CREATE)
2316 return handler->content;
2319 EAPI const char *livebox_category_title(struct livebox *handler)
2322 ErrPrint("Handler is NIL\n");
2326 if (handler->state != CREATE)
2329 return handler->title;
2332 EAPI int livebox_emit_text_signal(struct livebox *handler, const char *emission, const char *source, double sx, double sy, double ex, double ey, ret_cb_t cb, void *data)
2334 struct packet *packet;
2335 struct cb_info *cbinfo;
2339 ErrPrint("Handler is NIL\n");
2340 return LB_STATUS_ERROR_INVALID;
2343 if ((handler->lb.type != _LB_TYPE_TEXT && handler->pd.type != _PD_TYPE_TEXT) || handler->state != CREATE || !handler->id) {
2344 ErrPrint("Handler is not valid\n");
2345 return LB_STATUS_ERROR_INVALID;
2354 packet = packet_create("text_signal", "ssssdddd",
2355 handler->pkgname, handler->id, emission, source, sx, sy, ex, ey);
2357 ErrPrint("Failed to build a param\n");
2358 return LB_STATUS_ERROR_FAULT;
2361 cbinfo = create_cb_info(cb, data);
2363 packet_destroy(packet);
2364 return LB_STATUS_ERROR_FAULT;
2367 ret = master_rpc_async_request(handler, packet, 0, text_signal_cb, cbinfo);
2369 destroy_cb_info(cbinfo);
2371 return LB_STATUS_ERROR_FAULT;
2374 EAPI int livebox_subscribe_group(const char *cluster, const char *category)
2376 struct packet *packet;
2380 * Validate the group info using DB
2381 * If the group info is not valid, do not send this request
2384 packet = packet_create_noack("subscribe", "ss", cluster ? cluster : "", category ? category : "");
2386 ErrPrint("Failed to create a packet\n");
2387 return LB_STATUS_ERROR_FAULT;
2390 return master_rpc_request_only(NULL, packet);
2393 EAPI int livebox_unsubscribe_group(const char *cluster, const char *category)
2395 struct packet *packet;
2399 * Validate the group info using DB
2400 * If the group info is not valid, do not send this request
2401 * AND Check the subscribed or not too
2404 packet = packet_create_noack("unsubscribe", "ss", cluster ? cluster : "", category ? category : "");
2406 ErrPrint("Failed to create a packet\n");
2407 return LB_STATUS_ERROR_FAULT;
2410 return master_rpc_request_only(NULL, packet);
2413 EAPI int livebox_refresh(struct livebox *handler)
2415 struct packet *packet;
2418 ErrPrint("Hnalder is NIL\n");
2419 return LB_STATUS_ERROR_INVALID;
2422 if (handler->state != CREATE || !handler->id)
2423 return LB_STATUS_ERROR_INVALID;
2425 packet = packet_create_noack("update", "ss", handler->pkgname, handler->id);
2427 ErrPrint("Failed to create a packet\n");
2428 return LB_STATUS_ERROR_FAULT;
2431 return master_rpc_request_only(handler, packet);
2434 EAPI int livebox_refresh_group(const char *cluster, const char *category)
2436 struct packet *packet;
2438 if (!cluster || !category) {
2439 ErrPrint("Invalid argument\n");
2440 return LB_STATUS_ERROR_INVALID;
2443 packet = packet_create_noack("refresh_group", "ss", cluster, category);
2445 ErrPrint("Failed to create a packet\n");
2446 return LB_STATUS_ERROR_FAULT;
2449 return master_rpc_request_only(NULL, packet);
2452 EAPI int livebox_set_visibility(struct livebox *handler, enum livebox_visible_state state)
2454 struct packet *packet;
2458 ErrPrint("Handler is NIL\n");
2459 return LB_STATUS_ERROR_INVALID;
2462 if (handler->state != CREATE || !handler->id)
2463 return LB_STATUS_ERROR_INVALID;
2465 if (!handler->is_user) {
2466 /* System cluster livebox cannot be changed its visible states */
2467 if (state == LB_HIDE_WITH_PAUSE) {
2468 ErrPrint("CA Livebox is not able to change the visibility\n");
2469 return LB_STATUS_ERROR_PERMISSION;
2473 DbgPrint("Change the visibility %d <> %d, %s\n", handler->visible, state, handler->id);
2475 if (handler->visible == state)
2476 return LB_STATUS_ERROR_ALREADY;
2478 packet = packet_create_noack("change,visibility", "ssi", handler->pkgname, handler->id, (int)state);
2480 ErrPrint("Failed to create a packet\n");
2481 return LB_STATUS_ERROR_FAULT;
2484 ret = master_rpc_request_only(handler, packet);
2486 handler->visible = state;
2491 EAPI enum livebox_visible_state livebox_visibility(struct livebox *handler)
2494 ErrPrint("Handler is NIL\n");
2495 return LB_VISIBLE_ERROR;
2498 if (handler->state != CREATE || !handler->id)
2499 return LB_VISIBLE_ERROR;
2501 return handler->visible;
2504 int lb_set_group(struct livebox *handler, const char *cluster, const char *category)
2510 pc = strdup(cluster);
2512 CRITICAL_LOG("Heap: %s (cluster: %s)\n", strerror(errno), cluster);
2513 return LB_STATUS_ERROR_MEMORY;
2518 ps = strdup(category);
2520 CRITICAL_LOG("Heap: %s (category: %s)\n", strerror(errno), category);
2522 return LB_STATUS_ERROR_MEMORY;
2526 if (handler->cluster)
2527 free(handler->cluster);
2529 if (handler->category)
2530 free(handler->category);
2532 handler->cluster = pc;
2533 handler->category = ps;
2535 return LB_STATUS_SUCCESS;
2538 void lb_set_size(struct livebox *handler, int w, int h)
2540 handler->lb.width = w;
2541 handler->lb.height = h;
2544 void lb_set_update_mode(struct livebox *handle, int active_mode)
2546 handle->is_active_update = active_mode;
2549 void lb_set_pdsize(struct livebox *handler, int w, int h)
2551 handler->pd.width = w;
2552 handler->pd.height = h;
2555 void lb_set_default_pdsize(struct livebox *handler, int w, int h)
2557 handler->pd.default_width = w;
2558 handler->pd.default_height = h;
2561 void lb_invoke_fault_handler(enum livebox_fault_type event, const char *pkgname, const char *file, const char *func)
2565 struct fault_info *info;
2567 dlist_foreach_safe(s_info.fault_list, l, n, info) {
2568 if (info->handler(event, pkgname, file, func, info->user_data) == EXIT_FAILURE)
2569 s_info.fault_list = dlist_remove(s_info.fault_list, l);
2573 void lb_invoke_event_handler(struct livebox *handler, enum livebox_event_type event)
2577 struct event_info *info;
2579 dlist_foreach_safe(s_info.event_list, l, n, info) {
2580 if (info->handler(handler, event, info->user_data) == EXIT_FAILURE)
2581 s_info.event_list = dlist_remove(s_info.event_list, l);
2585 struct livebox *lb_find_livebox(const char *pkgname, const char *id)
2588 struct livebox *handler;
2590 dlist_foreach(s_info.livebox_list, l, handler) {
2594 if (!strcmp(handler->pkgname, pkgname) && !strcmp(handler->id, id))
2601 struct livebox *lb_find_livebox_by_timestamp(double timestamp)
2604 struct livebox *handler;
2606 dlist_foreach(s_info.livebox_list, l, handler) {
2607 if (handler->timestamp == timestamp)
2614 static inline char *get_file_kept_in_safe(const char *id)
2621 path = util_uri_to_path(id);
2623 ErrPrint("Invalid URI(%s)\n", id);
2630 if (s_info.prevent_overwrite) {
2631 new_path = strdup(path);
2633 ErrPrint("Heap: %s\n", strerror(errno));
2642 while (base_idx > 0 && path[base_idx] != '/') base_idx--;
2643 base_idx += (path[base_idx] == '/');
2645 new_path = malloc(len + 10);
2647 ErrPrint("Heap: %s\n", strerror(errno));
2651 strncpy(new_path, path, base_idx);
2652 snprintf(new_path + base_idx, len + 10 - base_idx, "reader/%s", path + base_idx);
2656 struct livebox *lb_new_livebox(const char *pkgname, const char *id, double timestamp)
2658 struct livebox *handler;
2660 handler = calloc(1, sizeof(*handler));
2662 ErrPrint("Failed to create a new livebox\n");
2666 handler->pkgname = strdup(pkgname);
2667 if (!handler->pkgname) {
2668 ErrPrint("%s\n", strerror(errno));
2673 handler->id = strdup(id);
2675 ErrPrint("%s\n", strerror(errno));
2676 free(handler->pkgname);
2681 handler->filename = get_file_kept_in_safe(id);
2682 if (!handler->filename) {
2683 handler->filename = strdup(util_uri_to_path(id));
2684 if (!handler->filename)
2685 ErrPrint("Error: %s\n", strerror(errno));
2688 handler->timestamp = timestamp;
2689 handler->lb.type = _LB_TYPE_FILE;
2690 handler->pd.type = _PD_TYPE_SCRIPT;
2691 handler->state = CREATE;
2692 handler->visible = LB_SHOW;
2694 s_info.livebox_list = dlist_append(s_info.livebox_list, handler);
2699 int lb_delete_all(void)
2703 struct livebox *handler;
2705 dlist_foreach_safe(s_info.livebox_list, l, n, handler) {
2706 lb_invoke_event_handler(handler, LB_EVENT_DELETED);
2710 return LB_STATUS_SUCCESS;
2713 int lb_set_content(struct livebox *handler, const char *content)
2715 if (handler->content) {
2716 DbgPrint("Release content: %s\n", content);
2717 free(handler->content);
2718 handler->content = NULL;
2722 DbgPrint("Update Content: [%s]\n", content);
2723 handler->content = strdup(content);
2724 if (!handler->content) {
2725 CRITICAL_LOG("Heap: %s (content: %s)\n", strerror(errno), content);
2726 return LB_STATUS_ERROR_MEMORY;
2730 return LB_STATUS_SUCCESS;
2733 int lb_set_title(struct livebox *handler, const char *title)
2735 if (handler->title) {
2736 free(handler->title);
2737 handler->title = NULL;
2741 handler->title = strdup(title);
2742 if (!handler->title) {
2743 CRITICAL_LOG("Heap: %s (title: %s)\n", strerror(errno), title);
2744 return LB_STATUS_ERROR_MEMORY;
2748 return LB_STATUS_SUCCESS;
2751 void lb_set_size_list(struct livebox *handler, int size_list)
2753 handler->lb.size_list = size_list;
2756 void lb_set_auto_launch(struct livebox *handler, const char *auto_launch)
2758 if (!strlen(auto_launch))
2761 handler->lb.auto_launch = strdup(auto_launch);
2762 if (!handler->lb.auto_launch)
2763 ErrPrint("Heap: %s\n", strerror(errno));
2766 void lb_set_priority(struct livebox *handler, double priority)
2768 handler->lb.priority = priority;
2771 void lb_set_id(struct livebox *handler, const char *id)
2776 handler->id = strdup(id);
2778 ErrPrint("Error: %s\n", strerror(errno));
2780 if (handler->filename)
2781 free(handler->filename);
2783 handler->filename = get_file_kept_in_safe(id);
2784 if (!handler->filename) {
2785 handler->filename = strdup(util_uri_to_path(id));
2786 if (!handler->filename)
2787 ErrPrint("Error: %s\n", strerror(errno));
2791 int lb_set_lb_fb(struct livebox *handler, const char *filename)
2796 return LB_STATUS_ERROR_INVALID;
2798 fb = handler->lb.data.fb;
2799 if (fb && !strcmp(fb_id(fb), filename)) /*!< BUFFER is not changed, */
2800 return LB_STATUS_SUCCESS;
2802 handler->lb.data.fb = NULL;
2804 if (!filename || filename[0] == '\0') {
2807 return LB_STATUS_SUCCESS;
2810 handler->lb.data.fb = fb_create(filename, handler->lb.width, handler->lb.height);
2811 if (!handler->lb.data.fb) {
2812 ErrPrint("Faield to create a FB\n");
2815 return LB_STATUS_ERROR_FAULT;
2821 return LB_STATUS_SUCCESS;
2824 int lb_set_pd_fb(struct livebox *handler, const char *filename)
2829 return LB_STATUS_ERROR_INVALID;
2831 fb = handler->pd.data.fb;
2832 if (fb && !strcmp(fb_id(fb), filename)) {
2833 /* BUFFER is not changed, just update the content */
2834 return LB_STATUS_ERROR_EXIST;
2836 handler->pd.data.fb = NULL;
2838 if (!filename || filename[0] == '\0') {
2841 return LB_STATUS_SUCCESS;
2844 handler->pd.data.fb = fb_create(filename, handler->pd.width, handler->pd.height);
2845 if (!handler->pd.data.fb) {
2846 ErrPrint("Failed to create a FB\n");
2849 return LB_STATUS_ERROR_FAULT;
2854 return LB_STATUS_SUCCESS;
2857 struct fb_info *lb_get_lb_fb(struct livebox *handler)
2859 return handler->lb.data.fb;
2862 struct fb_info *lb_get_pd_fb(struct livebox *handler)
2864 return handler->pd.data.fb;
2867 void lb_set_user(struct livebox *handler, int user)
2869 handler->is_user = user;
2872 void lb_set_pinup(struct livebox *handler, int pinup_supported)
2874 handler->lb.pinup_supported = pinup_supported;
2877 void lb_set_text_lb(struct livebox *handler)
2879 handler->lb.type = _LB_TYPE_TEXT;
2882 void lb_set_text_pd(struct livebox *handler)
2884 handler->pd.type = _PD_TYPE_TEXT;
2887 int lb_text_lb(struct livebox *handler)
2889 return handler->lb.type == _LB_TYPE_TEXT;
2892 int lb_text_pd(struct livebox *handler)
2894 return handler->pd.type == _PD_TYPE_TEXT;
2897 void lb_set_period(struct livebox *handler, double period)
2899 handler->lb.period = period;
2902 struct livebox *lb_ref(struct livebox *handler)
2911 struct livebox *lb_unref(struct livebox *handler)
2917 if (handler->refcnt > 0)
2920 if (handler->created_cb) {
2921 DbgPrint("Clear created event callback\n");
2922 handler->created_cb(handler, LB_STATUS_ERROR_FAULT, handler->created_cbdata);
2923 handler->created_cb = NULL;
2924 handler->created_cbdata = NULL;
2927 if (handler->deleted_cb) {
2928 DbgPrint("Clear deleted event callback\n");
2929 handler->deleted_cb(handler, LB_STATUS_ERROR_FAULT, handler->deleted_cbdata);
2930 handler->deleted_cb = NULL;
2931 handler->deleted_cbdata = NULL;
2934 if (handler->pinup_cb) {
2935 DbgPrint("Clear pinup event callback\n");
2936 handler->pinup_cb(handler, LB_STATUS_ERROR_FAULT, handler->pinup_cbdata);
2937 handler->pinup_cb = NULL;
2938 handler->pinup_cbdata = NULL;
2941 if (handler->group_changed_cb) {
2942 DbgPrint("Clear group changed event callback\n");
2943 handler->group_changed_cb(handler, LB_STATUS_ERROR_FAULT, handler->group_cbdata);
2944 handler->group_changed_cb = NULL;
2945 handler->group_cbdata = NULL;
2948 if (handler->period_changed_cb) {
2949 DbgPrint("Clear period changed event callback\n");
2950 handler->period_changed_cb(handler, LB_STATUS_ERROR_FAULT, handler->period_cbdata);
2951 handler->period_changed_cb = NULL;
2952 handler->period_cbdata = NULL;
2955 if (handler->size_changed_cb) {
2956 DbgPrint("Clear size changed event callback\n");
2957 handler->size_changed_cb(handler, LB_STATUS_ERROR_FAULT, handler->size_cbdata);
2958 handler->size_changed_cb = NULL;
2959 handler->size_cbdata = NULL;
2962 if (handler->pd_created_cb) {
2963 DbgPrint("Clear pd created event callback\n");
2964 handler->pd_created_cb(handler, LB_STATUS_ERROR_FAULT, handler->pd_created_cbdata);
2965 handler->pd_created_cb = NULL;
2966 handler->pd_created_cbdata = NULL;
2969 if (handler->pd_destroyed_cb) {
2970 DbgPrint("Clear pd destroyed event callback\n");
2971 handler->pd_destroyed_cb(handler, LB_STATUS_ERROR_FAULT, handler->pd_destroyed_cbdata);
2972 handler->pd_destroyed_cb = NULL;
2973 handler->pd_destroyed_cbdata = NULL;
2976 if (handler->update_mode_cb) {
2977 DbgPrint("Clear update mode callback\n");
2978 handler->update_mode_cb(handler, LB_STATUS_ERROR_FAULT, handler->update_mode_cbdata);
2979 handler->update_mode_cb = NULL;
2980 handler->update_mode_cbdata = NULL;
2983 if (handler->access_event_cb) {
2984 DbgPrint("Clear access status callback\n");
2985 handler->access_event_cb(handler, LB_STATUS_ERROR_FAULT, handler->access_event_cbdata);
2986 handler->access_event_cb = NULL;
2987 handler->access_event_cbdata = NULL;
2990 if (handler->filename)
2991 util_unlink(handler->filename);
2993 dlist_remove_data(s_info.livebox_list, handler);
2995 handler->state = DESTROYED;
2996 free(handler->cluster);
2997 free(handler->category);
2999 free(handler->pkgname);
3000 free(handler->filename);
3001 free(handler->lb.auto_launch);
3003 if (handler->lb.data.fb) {
3004 fb_destroy(handler->lb.data.fb);
3005 handler->lb.data.fb = NULL;
3008 if (handler->pd.data.fb) {
3009 fb_destroy(handler->pd.data.fb);
3010 handler->pd.data.fb = NULL;
3017 int lb_send_delete(struct livebox *handler, ret_cb_t cb, void *data)
3019 struct packet *packet;
3020 struct cb_info *cbinfo;
3023 if (!cb && !!data) {
3024 ErrPrint("Invalid argument\n");
3025 return LB_STATUS_ERROR_INVALID;
3028 if (handler->deleted_cb) {
3029 ErrPrint("Already in-progress\n");
3030 return LB_STATUS_ERROR_BUSY;
3033 packet = packet_create("delete", "ss", handler->pkgname, handler->id);
3035 ErrPrint("Failed to build a param\n");
3037 cb(handler, LB_STATUS_ERROR_FAULT, data);
3039 return LB_STATUS_ERROR_FAULT;
3043 cb = default_delete_cb;
3045 cbinfo = create_cb_info(cb, data);
3047 packet_destroy(packet);
3048 return LB_STATUS_ERROR_FAULT;
3051 ret = master_rpc_async_request(handler, packet, 0, del_ret_cb, cbinfo);
3053 destroy_cb_info(cbinfo);
3058 EAPI int livebox_client_paused(void)
3060 struct packet *packet;
3062 packet = packet_create_noack("client_paused", "d", util_timestamp());
3064 ErrPrint("Failed to create a pause packet\n");
3065 return LB_STATUS_ERROR_FAULT;
3068 return master_rpc_request_only(NULL, packet);
3071 EAPI int livebox_client_resumed(void)
3073 struct packet *packet;
3075 packet = packet_create_noack("client_resumed", "d", util_timestamp());
3077 ErrPrint("Failed to create a resume packet\n");
3078 return LB_STATUS_ERROR_FAULT;
3081 return master_rpc_request_only(NULL, packet);