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.
18 #include <sys/types.h>
29 #include <com-core_packet.h>
32 #include <widget_errno.h>
33 #include <widget_service.h> /* WIDGET_ACCESS_STATUS_XXXX */
34 #include <widget_service_internal.h>
35 #include <widget_cmd_list.h>
36 #include <widget_conf.h>
37 #include <widget_util.h>
38 #include <widget_buffer.h>
40 #include "widget_provider.h"
41 #include "widget_provider_buffer.h"
42 #include "provider_buffer_internal.h"
49 #define EAPI __attribute__((visibility("default")))
50 #define SW_ACCEL "use-sw"
59 struct widget_event_table table;
61 int prevent_overwrite;
69 .prevent_overwrite = 0,
73 #define EAPI __attribute__((visibility("default")))
75 static double current_time_get(double timestamp)
79 if (WIDGET_CONF_USE_GETTIMEOFDAY) {
81 if (gettimeofday(&tv, NULL) < 0) {
82 ErrPrint("gettimeofday: %d\n", errno);
85 ret = (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0f);
94 /* pkgname, id, signal_name, source, sx, sy, ex, ey, x, y, down, ret */
95 static struct packet *master_script(pid_t pid, int handle, const struct packet *packet)
97 struct widget_event_arg arg;
100 ret = packet_get(packet, "ssssddddddi",
101 &arg.pkgname, &arg.id,
102 &arg.info.content_event.signal_name, &arg.info.content_event.source,
103 &(arg.info.content_event.info.part.sx), &(arg.info.content_event.info.part.sy),
104 &(arg.info.content_event.info.part.ex), &(arg.info.content_event.info.part.ey),
105 &(arg.info.content_event.info.pointer.x), &(arg.info.content_event.info.pointer.y),
106 &(arg.info.content_event.info.pointer.down));
108 ErrPrint("Parameter is not valid\n");
112 arg.type = WIDGET_EVENT_CONTENT_EVENT;
114 if (s_info.table.content_event) {
115 (void)s_info.table.content_event(&arg, s_info.data);
122 /* pkgname, id, event, timestamp, x, y, ret */
123 static struct packet *master_clicked(pid_t pid, int handle, const struct packet *packet)
126 struct widget_event_arg arg;
128 ret = packet_get(packet, "sssddd",
129 &arg.pkgname, &arg.id,
130 &arg.info.clicked.event,
131 &arg.info.clicked.timestamp,
132 &arg.info.clicked.x, &arg.info.clicked.y);
134 ErrPrint("Parameter is not valid\n");
138 arg.type = WIDGET_EVENT_CLICKED;
140 DbgPrint("Clicked: %s\n", arg.id);
141 if (s_info.table.clicked) {
142 (void)s_info.table.clicked(&arg, s_info.data);
149 /* pkgname, id, signal_name, source, x, y, ex, ey, ret */
150 static struct packet *master_text_signal(pid_t pid, int handle, const struct packet *packet)
152 struct widget_event_arg arg;
155 ret = packet_get(packet, "ssssdddd",
156 &arg.pkgname, &arg.id,
157 &arg.info.text_signal.signal_name, &arg.info.text_signal.source,
158 &(arg.info.text_signal.info.part.sx), &(arg.info.text_signal.info.part.sy),
159 &(arg.info.text_signal.info.part.ex), &(arg.info.text_signal.info.part.ey));
162 ErrPrint("Parameter is not valid\n");
166 arg.info.text_signal.info.pointer.x = 0.0f;
167 arg.info.text_signal.info.pointer.y = 0.0f;
168 arg.info.text_signal.info.pointer.down = 0;
169 arg.type = WIDGET_EVENT_TEXT_SIGNAL;
171 if (s_info.table.text_signal) {
172 (void)s_info.table.text_signal(&arg, s_info.data);
179 /* pkgname, id, ret */
180 static struct packet *master_delete(pid_t pid, int handle, const struct packet *packet)
182 struct packet *result;
183 struct widget_event_arg arg;
187 ret = packet_get(packet, "ssi", &arg.pkgname, &arg.id, &type);
189 ErrPrint("Parameter is not valid\n");
190 ret = WIDGET_ERROR_INVALID_PARAMETER;
194 arg.type = WIDGET_EVENT_DELETE;
195 arg.info.widget_destroy.type = type;
196 DbgPrint("WIDGET Deleted, reason(%d)\n", type);
198 if (s_info.table.widget_destroy) {
199 ret = s_info.table.widget_destroy(&arg, s_info.data);
201 ret = WIDGET_ERROR_NOT_SUPPORTED;
205 result = packet_create_reply(packet, "i", ret);
209 /* pkgname, id, w, h, ret */
210 static struct packet *master_resize(pid_t pid, int handle, const struct packet *packet)
212 struct widget_event_arg arg;
214 struct packet *result;
216 ret = packet_get(packet, "ssii", &arg.pkgname, &arg.id, &arg.info.resize.w, &arg.info.resize.h);
218 ErrPrint("Parameter is not valid\n");
219 ret = WIDGET_ERROR_INVALID_PARAMETER;
223 arg.type = WIDGET_EVENT_RESIZE;
225 if (s_info.table.resize) {
226 ret = s_info.table.resize(&arg, s_info.data);
228 ret = WIDGET_ERROR_NOT_SUPPORTED;
232 result = packet_create_reply(packet, "i", ret);
236 /* pkgname, id, content, timeout, has_Script, period, cluster, category, pinup, width, height, abi, ret */
237 static struct packet *master_renew(pid_t pid, int handle, const struct packet *packet)
239 struct widget_event_arg arg;
241 struct packet *result;
245 arg.info.widget_recreate.out_title = NULL;
246 arg.info.widget_recreate.out_content = NULL;
247 arg.info.widget_recreate.out_is_pinned_up = 0;
249 ret = packet_get(packet, "sssiidssiisiis", &arg.pkgname, &arg.id,
250 &arg.info.widget_recreate.content,
251 &arg.info.widget_recreate.timeout,
252 &arg.info.widget_recreate.has_script,
253 &arg.info.widget_recreate.period,
254 &arg.info.widget_recreate.cluster, &arg.info.widget_recreate.category,
255 &arg.info.widget_recreate.width, &arg.info.widget_recreate.height,
256 &arg.info.widget_recreate.abi,
257 &arg.info.widget_recreate.hold_scroll,
258 &arg.info.widget_recreate.active_update,
259 &arg.info.widget_recreate.direct_addr);
261 ErrPrint("Parameter is not valid\n");
262 ret = WIDGET_ERROR_INVALID_PARAMETER;
266 arg.type = WIDGET_EVENT_RENEW;
268 if (s_info.table.widget_recreate) {
269 ret = s_info.table.widget_recreate(&arg, s_info.data);
271 ret = WIDGET_ERROR_NOT_SUPPORTED;
275 if (arg.info.widget_recreate.out_content) {
276 content = arg.info.widget_recreate.out_content;
281 if (arg.info.widget_recreate.out_title) {
282 title = arg.info.widget_recreate.out_title;
287 result = packet_create_reply(packet, "issi", ret, content, title, arg.info.widget_recreate.out_is_pinned_up);
292 free(arg.info.widget_recreate.out_title);
293 free(arg.info.widget_recreate.out_content);
294 arg.info.widget_recreate.out_title = NULL;
295 arg.info.widget_recreate.out_content = NULL;
299 /* pkgname, id, content, timeout, has_script, period, cluster, category, pinup, skip_need_to_create, abi, result, width, height, priority */
300 static struct packet *master_new(pid_t pid, int handle, const struct packet *packet)
302 struct widget_event_arg arg;
304 struct packet *result;
307 double priority = 0.0f;
311 arg.info.widget_create.out_content = NULL;
312 arg.info.widget_create.out_title = NULL;
313 arg.info.widget_create.out_is_pinned_up = 0;
315 ret = packet_get(packet, "sssiidssisiis", &arg.pkgname, &arg.id,
316 &arg.info.widget_create.content,
317 &arg.info.widget_create.timeout,
318 &arg.info.widget_create.has_script,
319 &arg.info.widget_create.period,
320 &arg.info.widget_create.cluster, &arg.info.widget_create.category,
321 &arg.info.widget_create.skip_need_to_create,
322 &arg.info.widget_create.abi,
323 &arg.info.widget_create.width,
324 &arg.info.widget_create.height,
325 &arg.info.widget_create.direct_addr);
327 ErrPrint("Parameter is not valid\n");
328 ret = WIDGET_ERROR_INVALID_PARAMETER;
332 arg.type = WIDGET_EVENT_NEW;
334 if (s_info.table.widget_create) {
335 ret = s_info.table.widget_create(&arg, &width, &height, &priority, s_info.data);
337 ret = WIDGET_ERROR_NOT_SUPPORTED;
341 if (arg.info.widget_create.out_content) {
342 content = arg.info.widget_create.out_content;
347 if (arg.info.widget_create.out_title) {
348 title = arg.info.widget_create.out_title;
353 result = packet_create_reply(packet, "iiidssi", ret, width, height, priority, content, title, arg.info.widget_create.out_is_pinned_up);
357 * Skip checking the address of out_content, out_title
359 free(arg.info.widget_create.out_content);
360 free(arg.info.widget_create.out_title);
364 /* pkgname, id, period, ret */
365 static struct packet *master_set_period(pid_t pid, int handle, const struct packet *packet)
367 struct widget_event_arg arg;
369 struct packet *result;
371 ret = packet_get(packet, "ssd", &arg.pkgname, &arg.id, &arg.info.set_period.period);
373 ErrPrint("Parameter is not valid\n");
374 ret = WIDGET_ERROR_INVALID_PARAMETER;
378 arg.type = WIDGET_EVENT_SET_PERIOD;
380 if (s_info.table.set_period) {
381 ret = s_info.table.set_period(&arg, s_info.data);
383 ret = WIDGET_ERROR_NOT_SUPPORTED;
387 result = packet_create_reply(packet, "i", ret);
391 /* pkgname, id, cluster, category, ret */
392 static struct packet *master_change_group(pid_t pid, int handle, const struct packet *packet)
394 struct widget_event_arg arg;
396 struct packet *result;
398 ret = packet_get(packet, "ssss", &arg.pkgname, &arg.id,
399 &arg.info.change_group.cluster, &arg.info.change_group.category);
401 ErrPrint("Parameter is not valid\n");
402 ret = WIDGET_ERROR_INVALID_PARAMETER;
406 arg.type = WIDGET_EVENT_CHANGE_GROUP;
408 if (s_info.table.change_group) {
409 ret = s_info.table.change_group(&arg, s_info.data);
411 ret = WIDGET_ERROR_NOT_SUPPORTED;
415 result = packet_create_reply(packet, "i", ret);
419 /* pkgname, id, pinup, ret */
420 static struct packet *master_pinup(pid_t pid, int handle, const struct packet *packet)
422 struct widget_event_arg arg;
424 struct packet *result;
427 ret = packet_get(packet, "ssi", &arg.pkgname, &arg.id, &arg.info.pinup.state);
429 ErrPrint("Parameter is not valid\n");
430 ret = WIDGET_ERROR_INVALID_PARAMETER;
434 arg.type = WIDGET_EVENT_PINUP;
436 if (s_info.table.pinup) {
437 ret = s_info.table.pinup(&arg, s_info.data);
439 ret = WIDGET_ERROR_NOT_SUPPORTED;
444 if (ret == 0 && arg.info.pinup.content_info) {
445 content = arg.info.pinup.content_info;
448 result = packet_create_reply(packet, "is", ret, content);
450 free(arg.info.pinup.content_info);
455 /* pkgname, id, cluster, category, content, ret */
456 static struct packet *master_update_content(pid_t pid, int handle, const struct packet *packet)
458 struct widget_event_arg arg;
461 ret = packet_get(packet, "sssssi", &arg.pkgname, &arg.id, &arg.info.update_content.cluster, &arg.info.update_content.category, &arg.info.update_content.content, &arg.info.update_content.force);
463 ErrPrint("Parameter is not valid\n");
467 arg.type = WIDGET_EVENT_UPDATE_CONTENT;
469 if (s_info.table.update_content) {
470 (void)s_info.table.update_content(&arg, s_info.data);
477 static struct packet *master_widget_pause(pid_t pid, int handle, const struct packet *packet)
479 struct widget_event_arg arg;
482 ret = packet_get(packet, "ss", &arg.pkgname, &arg.id);
484 ErrPrint("Invalid parameter\n");
488 arg.type = WIDGET_EVENT_WIDGET_PAUSE;
490 if (s_info.table.widget_pause) {
491 (void)s_info.table.widget_pause(&arg, s_info.data);
497 static struct packet *master_widget_resume(pid_t pid, int handle, const struct packet *packet)
499 struct widget_event_arg arg;
502 ret = packet_get(packet, "ss", &arg.pkgname, &arg.id);
504 ErrPrint("Invalid parameter\n");
508 arg.type = WIDGET_EVENT_WIDGET_RESUME;
510 if (s_info.table.widget_resume) {
511 (void)s_info.table.widget_resume(&arg, s_info.data);
518 static struct packet *master_pause(pid_t pid, int handle, const struct packet *packet)
520 struct widget_event_arg arg;
521 struct packet *result;
524 ret = packet_get(packet, "d", &arg.info.pause.timestamp);
526 ErrPrint("Parameter is not valid\n");
527 ret = WIDGET_ERROR_INVALID_PARAMETER;
532 arg.type = WIDGET_EVENT_PAUSE;
534 if (s_info.table.pause) {
535 ret = s_info.table.pause(&arg, s_info.data);
537 ret = WIDGET_ERROR_NOT_SUPPORTED;
541 result = packet_create_reply(packet, "i", ret);
545 static struct packet *master_update_mode(pid_t pid, int handle, const struct packet *packet)
547 struct packet *result;
548 struct widget_event_arg arg;
551 ret = packet_get(packet, "ssi", &arg.pkgname, &arg.id, &arg.info.update_mode.active_update);
553 ErrPrint("Invalid parameter\n");
554 ret = WIDGET_ERROR_INVALID_PARAMETER;
558 if (s_info.table.update_mode) {
559 ret = s_info.table.update_mode(&arg, s_info.data);
561 ret = WIDGET_ERROR_NOT_SUPPORTED;
565 result = packet_create_reply(packet, "i", ret);
569 static struct packet *master_widget_mouse_set(pid_t pid, int handle, const struct packet *packet)
579 ret = packet_get(packet, "ssdii", &pkgname, &id, ×tamp, &x, &y);
581 ErrPrint("Parameter is not matched\n");
582 ret = WIDGET_ERROR_INVALID_PARAMETER;
586 fd = packet_fd(packet);
587 DbgPrint("FD: %d\n", fd);
588 if (fd >= 0 || event_input_fd() >= 0) {
589 widget_buffer_h buffer_handler;
591 buffer_handler = widget_provider_buffer_find_buffer(WIDGET_TYPE_WIDGET, pkgname, id);
592 if (!buffer_handler) {
594 ErrPrint("close: %d\n", errno);
597 ErrPrint("Unable to find a buffer handler: %s\n", id);
601 ret = event_add_object(fd, buffer_handler, current_time_get(timestamp), x, y);
608 static struct packet *master_widget_mouse_unset(pid_t pid, int handle, const struct packet *packet)
610 widget_buffer_h buffer_handler;
618 ret = packet_get(packet, "ssdii", &pkgname, &id, ×tamp, &x, &y);
620 ErrPrint("Parameter is not matched\n");
621 ret = WIDGET_ERROR_INVALID_PARAMETER;
625 buffer_handler = widget_provider_buffer_find_buffer(WIDGET_TYPE_WIDGET, pkgname, id);
626 if (buffer_handler) {
627 ret = event_remove_object(buffer_handler);
634 static struct packet *master_gbar_mouse_set(pid_t pid, int handle, const struct packet *packet)
644 ret = packet_get(packet, "ssdii", &pkgname, &id, ×tamp, &x, &y);
646 ErrPrint("Parameter is not matched\n");
647 ret = WIDGET_ERROR_INVALID_PARAMETER;
651 fd = packet_fd(packet);
652 DbgPrint("FD: %d\n", fd);
653 if (fd >= 0 || event_input_fd() >= 0) {
654 widget_buffer_h buffer_handler;
656 buffer_handler = widget_provider_buffer_find_buffer(WIDGET_TYPE_GBAR, pkgname, id);
657 if (!buffer_handler) {
659 ErrPrint("close: %d\n", errno);
662 ErrPrint("Unable to find a buffer handler: %s\n", id);
666 ret = event_add_object(fd, buffer_handler, current_time_get(timestamp), x, y);
673 static struct packet *master_gbar_mouse_unset(pid_t pid, int handle, const struct packet *packet)
675 widget_buffer_h buffer_handler;
683 ret = packet_get(packet, "ssdii", &pkgname, &id, ×tamp, &x, &y);
685 ErrPrint("Parameter is not matched\n");
686 ret = WIDGET_ERROR_INVALID_PARAMETER;
690 buffer_handler = widget_provider_buffer_find_buffer(WIDGET_TYPE_GBAR, pkgname, id);
691 if (buffer_handler) {
692 ret = event_remove_object(buffer_handler);
700 static struct packet *master_resume(pid_t pid, int handle, const struct packet *packet)
702 struct packet *result;
703 struct widget_event_arg arg;
706 ret = packet_get(packet, "d", &arg.info.resume.timestamp);
708 ErrPrint("Parameter is not valid\n");
709 ret = WIDGET_ERROR_INVALID_PARAMETER;
715 arg.type = WIDGET_EVENT_RESUME;
717 if (s_info.table.resume) {
718 ret = s_info.table.resume(&arg, s_info.data);
720 ret = WIDGET_ERROR_NOT_SUPPORTED;
724 result = packet_create_reply(packet, "i", ret);
726 ErrPrint("Failed to create result packet\n");
731 struct packet *master_gbar_create(pid_t pid, int handle, const struct packet *packet)
733 struct widget_event_arg arg;
736 ret = packet_get(packet, "ssiidd", &arg.pkgname, &arg.id, &arg.info.gbar_create.w, &arg.info.gbar_create.h, &arg.info.gbar_create.x, &arg.info.gbar_create.y);
738 ErrPrint("Invalid packet\n");
742 arg.type = WIDGET_EVENT_GBAR_CREATE;
744 DbgPrint("PERF_WIDGET\n");
745 if (s_info.table.gbar_create) {
746 (void)s_info.table.gbar_create(&arg, s_info.data);
753 struct packet *master_disconnect(pid_t pid, int handle, const struct packet *packet)
758 ret = packet_get(packet, "d", ×tamp);
760 ErrPrint("Invalid packet\n");
764 if (s_info.fd >= 0 && s_info.closing_fd == 0) {
765 s_info.closing_fd = 1;
766 com_core_packet_client_fini(s_info.fd);
767 fb_master_disconnected();
769 s_info.closing_fd = 0;
776 struct packet *master_viewer_connected(pid_t pid, int handle, const struct packet *packet)
779 struct widget_event_arg arg;
781 ret = packet_get(packet, "sss", &arg.pkgname, &arg.id, &arg.info.viewer_connected.direct_addr);
783 ErrPrint("Invalid packet\n");
788 * Create a new connection if the direct_path is valid
790 arg.type = WIDGET_EVENT_VIEWER_CONNECTED;
792 if (s_info.table.viewer_connected) {
793 ret = s_info.table.viewer_connected(&arg, s_info.data);
795 ret = WIDGET_ERROR_NOT_SUPPORTED;
802 struct packet *master_viewer_disconnected(pid_t pid, int handle, const struct packet *packet)
805 struct widget_event_arg arg;
807 ret = packet_get(packet, "sss", &arg.pkgname, &arg.id, &arg.info.viewer_disconnected.direct_addr);
809 ErrPrint("Invalid packet\n");
814 * Destroy a connection, maybe it is already destroyed. ;)
816 arg.type = WIDGET_EVENT_VIEWER_DISCONNECTED;
818 if (s_info.table.viewer_disconnected) {
819 ret = s_info.table.viewer_disconnected(&arg, s_info.data);
821 ret = WIDGET_ERROR_NOT_SUPPORTED;
828 struct packet *master_gbar_move(pid_t pid, int handle, const struct packet *packet)
830 struct widget_event_arg arg;
833 ret = packet_get(packet, "ssiidd", &arg.pkgname, &arg.id, &arg.info.gbar_move.w, &arg.info.gbar_move.h, &arg.info.gbar_move.x, &arg.info.gbar_move.y);
835 ErrPrint("Invalid packet\n");
839 arg.type = WIDGET_EVENT_GBAR_MOVE;
841 if (s_info.table.gbar_move) {
842 (void)s_info.table.gbar_move(&arg, s_info.data);
849 struct packet *master_gbar_destroy(pid_t pid, int handle, const struct packet *packet)
851 struct widget_event_arg arg;
854 ret = packet_get(packet, "ssi", &arg.pkgname, &arg.id, &arg.info.gbar_destroy.reason);
856 ErrPrint("Invalid packet\n");
860 arg.type = WIDGET_EVENT_GBAR_DESTROY;
861 if (s_info.table.gbar_destroy) {
862 (void)s_info.table.gbar_destroy(&arg, s_info.data);
869 static struct method s_table[] = {
870 /*!< For the buffer type */
872 .cmd = CMD_STR_GBAR_MOUSE_MOVE,
873 .handler = provider_buffer_gbar_mouse_move,
876 .cmd = CMD_STR_WIDGET_MOUSE_MOVE,
877 .handler = provider_buffer_widget_mouse_move,
880 .cmd = CMD_STR_GBAR_MOUSE_DOWN,
881 .handler = provider_buffer_gbar_mouse_down,
884 .cmd = CMD_STR_GBAR_MOUSE_UP,
885 .handler = provider_buffer_gbar_mouse_up,
888 .cmd = CMD_STR_WIDGET_MOUSE_DOWN,
889 .handler = provider_buffer_widget_mouse_down,
892 .cmd = CMD_STR_WIDGET_MOUSE_UP,
893 .handler = provider_buffer_widget_mouse_up,
896 .cmd = CMD_STR_GBAR_MOUSE_ENTER,
897 .handler = provider_buffer_gbar_mouse_enter,
900 .cmd = CMD_STR_GBAR_MOUSE_LEAVE,
901 .handler = provider_buffer_gbar_mouse_leave,
904 .cmd = CMD_STR_WIDGET_MOUSE_ENTER,
905 .handler = provider_buffer_widget_mouse_enter,
908 .cmd = CMD_STR_WIDGET_MOUSE_LEAVE,
909 .handler = provider_buffer_widget_mouse_leave,
912 .cmd = CMD_STR_WIDGET_MOUSE_ON_SCROLL,
913 .handler = provider_buffer_widget_mouse_on_hold,
916 .cmd = CMD_STR_WIDGET_MOUSE_OFF_SCROLL,
917 .handler = provider_buffer_widget_mouse_off_hold,
920 .cmd = CMD_STR_GBAR_MOUSE_ON_SCROLL,
921 .handler = provider_buffer_gbar_mouse_on_hold,
924 .cmd = CMD_STR_GBAR_MOUSE_OFF_SCROLL,
925 .handler = provider_buffer_gbar_mouse_off_hold,
928 .cmd = CMD_STR_WIDGET_MOUSE_ON_HOLD,
929 .handler = provider_buffer_widget_mouse_on_hold,
932 .cmd = CMD_STR_WIDGET_MOUSE_OFF_HOLD,
933 .handler = provider_buffer_widget_mouse_off_hold,
936 .cmd = CMD_STR_GBAR_MOUSE_ON_HOLD,
937 .handler = provider_buffer_gbar_mouse_on_hold,
940 .cmd = CMD_STR_GBAR_MOUSE_OFF_HOLD,
941 .handler = provider_buffer_gbar_mouse_off_hold,
944 .cmd = CMD_STR_CLICKED,
945 .handler = master_clicked, /* pkgname, id, event, timestamp, x, y, ret */
948 .cmd = CMD_STR_TEXT_SIGNAL,
949 .handler = master_text_signal, /* pkgname, id, signal_name, source, x, y, ex, ey, ret */
952 .cmd = CMD_STR_DELETE,
953 .handler = master_delete, /* pkgname, id, ret */
956 .cmd = CMD_STR_RESIZE,
957 .handler = master_resize, /* pkgname, id, w, h, ret */
961 .handler = master_new, /* pkgname, id, content, timeout, has_script, period, cluster, category, pinup, skip_need_to_create, abi, result, width, height, priority */
964 .cmd = CMD_STR_SET_PERIOD,
965 .handler = master_set_period, /* pkgname, id, period, ret */
968 .cmd = CMD_STR_CHANGE_GROUP,
969 .handler = master_change_group, /* pkgname, id, cluster, category, ret */
972 .cmd = CMD_STR_GBAR_MOVE,
973 .handler = master_gbar_move,
976 .cmd = CMD_STR_GBAR_ACCESS_HL,
977 .handler = provider_buffer_gbar_access_hl,
980 .cmd = CMD_STR_GBAR_ACCESS_ACTIVATE,
981 .handler = provider_buffer_gbar_access_activate,
984 .cmd = CMD_STR_GBAR_ACCESS_ACTION,
985 .handler = provider_buffer_gbar_access_action,
988 .cmd = CMD_STR_GBAR_ACCESS_SCROLL,
989 .handler = provider_buffer_gbar_access_scroll,
992 .cmd = CMD_STR_GBAR_ACCESS_VALUE_CHANGE,
993 .handler = provider_buffer_gbar_access_value_change,
996 .cmd = CMD_STR_GBAR_ACCESS_MOUSE,
997 .handler = provider_buffer_gbar_access_mouse,
1000 .cmd = CMD_STR_GBAR_ACCESS_BACK,
1001 .handler = provider_buffer_gbar_access_back,
1004 .cmd = CMD_STR_GBAR_ACCESS_OVER,
1005 .handler = provider_buffer_gbar_access_over,
1008 .cmd = CMD_STR_GBAR_ACCESS_READ,
1009 .handler = provider_buffer_gbar_access_read,
1012 .cmd = CMD_STR_GBAR_ACCESS_ENABLE,
1013 .handler = provider_buffer_gbar_access_enable,
1016 .cmd = CMD_STR_WIDGET_ACCESS_HL,
1017 .handler = provider_buffer_widget_access_hl,
1020 .cmd = CMD_STR_WIDGET_ACCESS_ACTIVATE,
1021 .handler = provider_buffer_widget_access_activate,
1024 .cmd = CMD_STR_WIDGET_ACCESS_ACTION,
1025 .handler = provider_buffer_widget_access_action,
1028 .cmd = CMD_STR_WIDGET_ACCESS_SCROLL,
1029 .handler = provider_buffer_widget_access_scroll,
1032 .cmd = CMD_STR_WIDGET_ACCESS_VALUE_CHANGE,
1033 .handler = provider_buffer_widget_access_value_change,
1036 .cmd = CMD_STR_WIDGET_ACCESS_MOUSE,
1037 .handler = provider_buffer_widget_access_mouse,
1040 .cmd = CMD_STR_WIDGET_ACCESS_BACK,
1041 .handler = provider_buffer_widget_access_back,
1044 .cmd = CMD_STR_WIDGET_ACCESS_OVER,
1045 .handler = provider_buffer_widget_access_over,
1048 .cmd = CMD_STR_WIDGET_ACCESS_READ,
1049 .handler = provider_buffer_widget_access_read,
1052 .cmd = CMD_STR_WIDGET_ACCESS_ENABLE,
1053 .handler = provider_buffer_widget_access_enable,
1056 .cmd = CMD_STR_WIDGET_KEY_DOWN,
1057 .handler = provider_buffer_widget_key_down,
1060 .cmd = CMD_STR_WIDGET_KEY_UP,
1061 .handler = provider_buffer_widget_key_up,
1064 .cmd = CMD_STR_WIDGET_KEY_FOCUS_IN,
1065 .handler = provider_buffer_widget_key_focus_in,
1068 .cmd = CMD_STR_WIDGET_KEY_FOCUS_OUT,
1069 .handler = provider_buffer_widget_key_focus_out,
1072 .cmd = CMD_STR_GBAR_KEY_DOWN,
1073 .handler = provider_buffer_gbar_key_down,
1076 .cmd = CMD_STR_GBAR_KEY_UP,
1077 .handler = provider_buffer_gbar_key_up,
1080 .cmd = CMD_STR_GBAR_KEY_FOCUS_IN,
1081 .handler = provider_buffer_widget_key_focus_in,
1084 .cmd = CMD_STR_GBAR_KEY_FOCUS_OUT,
1085 .handler = provider_buffer_widget_key_focus_out,
1088 .cmd = CMD_STR_UPDATE_MODE,
1089 .handler = master_update_mode,
1092 .cmd = CMD_STR_WIDGET_MOUSE_SET,
1093 .handler = master_widget_mouse_set,
1096 .cmd = CMD_STR_WIDGET_MOUSE_UNSET,
1097 .handler = master_widget_mouse_unset,
1100 .cmd = CMD_STR_GBAR_MOUSE_SET,
1101 .handler = master_gbar_mouse_set,
1104 .cmd = CMD_STR_GBAR_MOUSE_UNSET,
1105 .handler = master_gbar_mouse_unset,
1108 .cmd = CMD_STR_GBAR_SHOW,
1109 .handler = master_gbar_create,
1112 .cmd = CMD_STR_GBAR_HIDE,
1113 .handler = master_gbar_destroy,
1116 .cmd = CMD_STR_WIDGET_PAUSE,
1117 .handler = master_widget_pause,
1120 .cmd = CMD_STR_WIDGET_RESUME,
1121 .handler = master_widget_resume,
1124 .cmd = CMD_STR_SCRIPT,
1125 .handler = master_script, /* pkgname, id, signal_name, source, sx, sy, ex, ey, x, y, down, ret */
1128 .cmd = CMD_STR_RENEW,
1129 .handler = master_renew, /* pkgname, id, content, timeout, has_script, period, cluster, category, pinup, width, height, abi, ret */
1132 .cmd = CMD_STR_PINUP,
1133 .handler = master_pinup, /* pkgname, id, pinup, ret */
1136 .cmd = CMD_STR_UPDATE_CONTENT,
1137 .handler = master_update_content, /* pkgname, cluster, category, ret */
1140 .cmd = CMD_STR_PAUSE,
1141 .handler = master_pause, /* timestamp, ret */
1144 .cmd = CMD_STR_RESUME,
1145 .handler = master_resume, /* timestamp, ret */
1148 .cmd = CMD_STR_DISCONNECT,
1149 .handler = master_disconnect,
1152 .cmd = CMD_STR_VIEWER_CONNECTED,
1153 .handler = master_viewer_connected,
1156 .cmd = CMD_STR_VIEWER_DISCONNECTED,
1157 .handler = master_viewer_disconnected,
1165 static int connected_cb(int handle, void *data)
1167 DbgPrint("Connected (%p) %d\n", s_info.table.connected, handle);
1169 if (s_info.fd >= 0) {
1170 ErrPrint("Already connected. Ignore this (%d)?\n", handle);
1176 if (s_info.table.connected) {
1177 s_info.table.connected(NULL, s_info.data);
1183 static int disconnected_cb(int handle, void *data)
1185 if (s_info.fd != handle) {
1186 DbgPrint("%d is not my favor (%d)\n", handle, s_info.fd);
1190 DbgPrint("Disconnected (%d)\n", handle);
1191 if (s_info.table.disconnected) {
1192 s_info.table.disconnected(NULL, s_info.data);
1200 static int initialize_provider(void *disp, const char *name, widget_event_table_h table, void *data)
1204 s_info.name = strdup(name);
1206 ErrPrint("Heap: %d\n", errno);
1207 return WIDGET_ERROR_OUT_OF_MEMORY;
1210 memcpy(&s_info.table, table, sizeof(*table));
1213 com_core_add_event_callback(CONNECTOR_DISCONNECTED, disconnected_cb, NULL);
1215 ret = com_core_packet_client_init(SLAVE_SOCKET, 0, s_table);
1217 ErrPrint("Failed to establish the connection with the master\n");
1221 return (ret == -EACCES) ? WIDGET_ERROR_PERMISSION_DENIED : WIDGET_ERROR_FAULT;
1224 widget_provider_buffer_init(disp);
1225 connected_cb(ret, NULL);
1227 DbgPrint("Slave is initialized\n");
1228 return WIDGET_ERROR_NONE;
1231 static char *keep_file_in_safe(const char *id, int uri)
1238 path = uri ? widget_util_uri_to_path(id) : id;
1240 ErrPrint("Invalid path\n");
1244 if (s_info.prevent_overwrite) {
1249 ErrPrint("Heap: %d\n", errno);
1255 if (access(path, R_OK | F_OK) != 0) {
1256 ErrPrint("[%s] %d\n", path, errno);
1263 while (base_idx > 0 && path[base_idx] != '/') base_idx--;
1264 base_idx += (path[base_idx] == '/');
1266 new_path = malloc(len + 10 + 30); /* for "tmp" tv_sec, tv_usec */
1268 ErrPrint("Heap: %d\n", errno);
1272 strncpy(new_path, path, base_idx);
1274 #if defined(_USE_ECORE_TIME_GET)
1277 tval = util_timestamp();
1279 snprintf(new_path + base_idx, len + 10 - base_idx + 30, "reader/%lf.%s", tval, path + base_idx);
1282 if (gettimeofday(&tv, NULL) < 0) {
1283 ErrPrint("gettimeofday: %d\n", errno);
1285 tv.tv_usec = rand();
1288 snprintf(new_path + base_idx, len + 10 - base_idx + 30, "reader/%lu.%lu.%s", tv.tv_sec, tv.tv_usec, path + base_idx);
1292 * To prevent from failing of rename a content file
1294 (void)unlink(new_path);
1296 if (rename(path, new_path) < 0) {
1297 ErrPrint("Failed to keep content in safe: %d (%s -> %s)\n", errno, path, new_path);
1303 const char *provider_name(void)
1308 EAPI int widget_provider_prepare_init(const char *abi, const char *accel, int secured)
1317 s_info.accel = NULL;
1321 s_info.abi = strdup(abi);
1323 ErrPrint("strdup: %d\n", errno);
1324 return WIDGET_ERROR_OUT_OF_MEMORY;
1329 s_info.accel = strdup(accel);
1330 if (!s_info.accel) {
1331 ErrPrint("strdup: %d\n", errno);
1334 return WIDGET_ERROR_OUT_OF_MEMORY;
1338 s_info.secured = secured;
1340 return WIDGET_ERROR_NONE;
1343 EAPI int widget_provider_init(void *disp, const char *name, widget_event_table_h table, void *data, int prevent_overwrite, int com_core_use_thread)
1345 if (!name || !table) {
1346 ErrPrint("Invalid argument\n");
1347 return WIDGET_ERROR_INVALID_PARAMETER;
1351 ErrPrint("Provider is already initialized\n");
1352 return WIDGET_ERROR_ALREADY_STARTED;
1355 s_info.prevent_overwrite = prevent_overwrite;
1356 com_core_packet_use_thread(com_core_use_thread);
1358 return initialize_provider(disp, name, table, data);
1361 EAPI void *widget_provider_fini(void)
1364 static int provider_fini_called = 0;
1366 if (provider_fini_called) {
1367 ErrPrint("Provider finalize is already called\n");
1372 ErrPrint("Connection is not established (or cleared already)\n");
1376 provider_fini_called = 1;
1378 if (s_info.fd >= 0 && s_info.closing_fd == 0) {
1379 s_info.closing_fd = 1;
1380 com_core_packet_client_fini(s_info.fd);
1381 fb_master_disconnected();
1383 s_info.closing_fd = 0;
1386 provider_fini_called = 0;
1388 com_core_del_event_callback(CONNECTOR_DISCONNECTED, disconnected_cb, NULL);
1390 widget_provider_buffer_fini();
1396 s_info.accel = NULL;
1407 EAPI int widget_provider_send_call(const char *pkgname, const char *id, const char *funcname)
1409 struct packet *packet;
1410 unsigned int cmd = CMD_CALL;
1413 if (!pkgname || !id || !funcname) {
1414 ErrPrint("Invalid argument\n");
1415 return WIDGET_ERROR_INVALID_PARAMETER;
1418 packet = packet_create_noack((const char *)&cmd, "sss", pkgname, id, funcname);
1420 ErrPrint("Failed to create a packet\n");
1421 return WIDGET_ERROR_FAULT;
1424 ret = com_core_packet_send_only(s_info.fd, packet);
1425 packet_destroy(packet);
1426 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1429 EAPI int widget_provider_send_ret(const char *pkgname, const char *id, const char *funcname)
1431 struct packet *packet;
1432 unsigned int cmd = CMD_RET;
1435 if (!pkgname || !id || !funcname) {
1436 ErrPrint("Invalid argument\n");
1437 return WIDGET_ERROR_INVALID_PARAMETER;
1440 packet = packet_create_noack((const char *)&cmd, "sss", pkgname, id, funcname);
1442 ErrPrint("Failed to create a packet\n");
1443 return WIDGET_ERROR_FAULT;
1446 ret = com_core_packet_send_only(s_info.fd, packet);
1447 packet_destroy(packet);
1448 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1451 EAPI int widget_provider_send_faulted(const char *pkgname, const char *id, const char *funcname)
1453 struct packet *packet;
1454 unsigned int cmd = CMD_FAULTED;
1457 if (!pkgname || !id || !funcname) {
1458 ErrPrint("Invalid argument\n");
1459 return WIDGET_ERROR_INVALID_PARAMETER;
1462 packet = packet_create_noack((const char *)&cmd, "sss", pkgname, id, funcname);
1464 ErrPrint("Failed to create a packet\n");
1465 return WIDGET_ERROR_FAULT;
1468 ret = com_core_packet_send_only(s_info.fd, packet);
1469 packet_destroy(packet);
1470 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1473 EAPI int widget_provider_send_hello_sync(const char *pkgname)
1475 struct packet *packet;
1476 struct packet *result;
1481 struct widget_event_arg arg;
1484 double priority = 0.0f;
1487 DbgPrint("name[%s]\n", s_info.name);
1490 ErrPrint("Provider is not initialized\n");
1491 return WIDGET_ERROR_INVALID_PARAMETER;
1494 if (s_info.fd < 0) {
1495 ErrPrint("Connection is not established\n");
1496 return WIDGET_ERROR_INVALID_PARAMETER;
1499 accel = s_info.accel ? s_info.accel : SW_ACCEL;
1500 abi = s_info.abi ? s_info.abi : WIDGET_CONF_DEFAULT_ABI;
1501 DbgPrint("Accel[%s], abi[%s]\n", accel, abi);
1503 cmd = CMD_HELLO_SYNC_PREPARE;
1504 sync_ctx = util_timestamp();
1505 packet = packet_create_noack((const char *)&cmd, "d", sync_ctx);
1507 ErrPrint("Failed to create a packet\n");
1508 return WIDGET_ERROR_FAULT;
1511 ret = com_core_packet_send_only(s_info.fd, packet);
1512 packet_destroy(packet);
1514 return WIDGET_ERROR_FAULT;
1517 cmd = CMD_HELLO_SYNC;
1518 packet = packet_create((const char *)&cmd, "dissss", sync_ctx, s_info.secured, s_info.name, pkgname, accel, abi);
1520 ErrPrint("Failed to create a packet\n");
1521 return WIDGET_ERROR_FAULT;
1524 result = com_core_packet_oneshot_send(SLAVE_SOCKET, packet, 0.0f);
1525 packet_destroy(packet);
1527 if (s_info.table.widget_create) {
1528 arg.info.widget_create.out_content = NULL;
1529 arg.info.widget_create.out_title = NULL;
1530 arg.info.widget_create.out_is_pinned_up = 0;
1532 ret = packet_get(result, "sssiidssisiis", &arg.pkgname, &arg.id,
1533 &arg.info.widget_create.content,
1534 &arg.info.widget_create.timeout,
1535 &arg.info.widget_create.has_script,
1536 &arg.info.widget_create.period,
1537 &arg.info.widget_create.cluster, &arg.info.widget_create.category,
1538 &arg.info.widget_create.skip_need_to_create,
1539 &arg.info.widget_create.abi,
1540 &arg.info.widget_create.width,
1541 &arg.info.widget_create.height,
1542 &arg.info.widget_create.direct_addr);
1544 ErrPrint("Parameter is not valid\n");
1545 packet_destroy(result);
1546 return WIDGET_ERROR_INVALID_PARAMETER;
1549 arg.type = WIDGET_EVENT_NEW;
1551 ret = s_info.table.widget_create(&arg, &width, &height, &priority, s_info.data);
1553 ret = WIDGET_ERROR_NOT_SUPPORTED;
1556 ErrPrint("#widget_create return [%d]\n", ret);
1557 packet_destroy(result);
1558 return WIDGET_ERROR_NONE;
1561 EAPI int widget_provider_send_hello(void)
1563 struct packet *packet;
1564 unsigned int cmd = CMD_HELLO;
1569 DbgPrint("name[%s]\n", s_info.name);
1572 ErrPrint("Provider is not initialized\n");
1573 return WIDGET_ERROR_INVALID_PARAMETER;
1576 if (s_info.fd < 0) {
1577 ErrPrint("Connection is not established\n");
1578 return WIDGET_ERROR_INVALID_PARAMETER;
1581 accel = s_info.accel ? s_info.accel : SW_ACCEL;
1582 abi = s_info.abi ? s_info.abi : WIDGET_CONF_DEFAULT_ABI;
1583 DbgPrint("Accel[%s], abi[%s]\n", accel, abi);
1585 packet = packet_create_noack((const char *)&cmd, "isss", s_info.secured, s_info.name, accel, abi);
1587 ErrPrint("Failed to create a packet\n");
1588 return WIDGET_ERROR_FAULT;
1591 ret = com_core_packet_send_only(s_info.fd, packet);
1592 packet_destroy(packet);
1593 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1596 EAPI int widget_provider_send_ping(void)
1598 struct packet *packet;
1599 unsigned int cmd = CMD_PING;
1602 DbgPrint("name[%s]\n", s_info.name);
1604 ErrPrint("Provider is not initialized\n");
1605 return WIDGET_ERROR_INVALID_PARAMETER;
1608 if (s_info.fd < 0) {
1609 ErrPrint("Connection is not established\n");
1610 return WIDGET_ERROR_INVALID_PARAMETER;
1613 packet = packet_create_noack((const char *)&cmd, "s", s_info.name);
1615 ErrPrint("Failed to create a a packet\n");
1616 return WIDGET_ERROR_FAULT;
1619 ret = com_core_packet_send_only(s_info.fd, packet);
1620 packet_destroy(packet);
1621 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1624 EAPI int widget_provider_send_widget_update_begin(const char *pkgname, const char *id, double priority, const char *content_info, const char *title)
1626 struct packet *packet;
1627 unsigned int cmd = CMD_WIDGET_UPDATE_BEGIN;
1630 if (!pkgname || !id) {
1631 ErrPrint("Invalid argument\n");
1632 return WIDGET_ERROR_INVALID_PARAMETER;
1635 if (!content_info) {
1643 if (s_info.fd < 0) {
1644 ErrPrint("Connection is not established\n");
1645 return WIDGET_ERROR_INVALID_PARAMETER;
1648 packet = packet_create_noack((const char *)&cmd, "ssdss",
1649 pkgname, id, priority, content_info, title);
1651 ErrPrint("Failed to build a packet\n");
1652 return WIDGET_ERROR_FAULT;
1655 ret = com_core_packet_send_only(s_info.fd, packet);
1656 packet_destroy(packet);
1658 DbgPrint("[ACTIVE] WIDGET BEGIN: %s (%d)\n", id, ret);
1659 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1662 EAPI int widget_provider_send_widget_update_end(const char *pkgname, const char *id)
1664 struct packet *packet;
1665 unsigned int cmd = CMD_WIDGET_UPDATE_END;
1668 if (!pkgname || !id) {
1669 ErrPrint("Invalid argument\n");
1670 return WIDGET_ERROR_INVALID_PARAMETER;
1673 if (s_info.fd < 0) {
1674 ErrPrint("Connection is not established\n");
1675 return WIDGET_ERROR_INVALID_PARAMETER;
1678 packet = packet_create_noack((const char *)&cmd, "ss", pkgname, id);
1680 ErrPrint("Failed to build a packet\n");
1681 return WIDGET_ERROR_FAULT;
1684 ret = com_core_packet_send_only(s_info.fd, packet);
1685 packet_destroy(packet);
1687 DbgPrint("[ACTIVE] WIDGET END: %s (%d)\n", id, ret);
1688 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1691 EAPI int widget_provider_send_gbar_update_begin(const char *pkgname, const char *id)
1693 struct packet *packet;
1694 unsigned int cmd = CMD_GBAR_UPDATE_BEGIN;
1697 if (!pkgname || !id) {
1698 ErrPrint("Invalid argument\n");
1699 return WIDGET_ERROR_INVALID_PARAMETER;
1702 if (s_info.fd < 0) {
1703 ErrPrint("Connection is not established\n");
1704 return WIDGET_ERROR_INVALID_PARAMETER;
1707 packet = packet_create_noack((const char *)&cmd, "ss", pkgname, id);
1709 ErrPrint("Failed to build a packet\n");
1710 return WIDGET_ERROR_FAULT;
1713 ret = com_core_packet_send_only(s_info.fd, packet);
1714 packet_destroy(packet);
1716 DbgPrint("[ACTIVE] GBAR BEGIN: %s (%d)\n", id, ret);
1717 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1720 EAPI int widget_provider_send_gbar_update_end(const char *pkgname, const char *id)
1722 struct packet *packet;
1723 unsigned int cmd = CMD_GBAR_UPDATE_END;
1726 if (!pkgname || !id) {
1727 ErrPrint("Invalid argument\n");
1728 return WIDGET_ERROR_INVALID_PARAMETER;
1731 if (s_info.fd < 0) {
1732 ErrPrint("Connection is not established\n");
1733 return WIDGET_ERROR_INVALID_PARAMETER;
1736 packet = packet_create_noack((const char *)&cmd, "ss", pkgname, id);
1738 ErrPrint("Failed to build a packet\n");
1739 return WIDGET_ERROR_FAULT;
1742 ret = com_core_packet_send_only(s_info.fd, packet);
1743 packet_destroy(packet);
1745 DbgPrint("[ACTIVE] GBAR END: %s (%d)\n", id, ret);
1746 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1749 EAPI int widget_provider_send_extra_info(const char *pkgname, const char *id, double priority, const char *content_info, const char *title, const char *icon, const char *name)
1751 struct packet *packet;
1752 unsigned int cmd = CMD_EXTRA_INFO;
1755 if (!pkgname || !id) {
1756 ErrPrint("Invalid argument\n");
1757 return WIDGET_ERROR_INVALID_PARAMETER;
1760 if (s_info.fd < 0) {
1761 ErrPrint("Connection is not established\n");
1762 return WIDGET_ERROR_INVALID_PARAMETER;
1765 packet = packet_create_noack((const char *)&cmd, "ssssssd", pkgname, id, content_info, title, icon, name, priority);
1767 ErrPrint("failed to build a packet\n");
1768 return WIDGET_ERROR_FAULT;
1771 ret = com_core_packet_send_only(s_info.fd, packet);
1772 packet_destroy(packet);
1773 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1776 __attribute__((always_inline)) static inline int send_extra_buffer_updated(int fd, const char *pkgname, const char *id, widget_buffer_h info, int idx, widget_damage_region_s *region, int direct, int is_gbar)
1779 struct packet *packet;
1782 if (info->extra_buffer[idx] == 0u) {
1783 return WIDGET_ERROR_INVALID_PARAMETER;
1786 fb_sync_xdamage(info->fb, region);
1788 cmd = CMD_EXTRA_UPDATED;
1791 packet = packet_create_noack((const char *)&cmd, "ssiiiiii", pkgname, id, is_gbar, idx, region->x, region->y, region->w, region->h);
1793 packet = packet_create_noack((const char *)&cmd, "ssiiiiii", pkgname, id, is_gbar, idx, region->x, region->y, region->w, region->h);
1797 ErrPrint("failed to build a packet\n");
1798 return WIDGET_ERROR_FAULT;
1801 ret = com_core_packet_send_only(fd, packet);
1802 packet_destroy(packet);
1807 __attribute__((always_inline)) static inline int send_extra_updated(int fd, const char *pkgname, const char *id, int idx, widget_damage_region_s *region, int direct, int is_gbar)
1809 widget_buffer_h info;
1810 widget_damage_region_s _region = {
1818 if (!pkgname || !id || is_gbar < 0 || idx < 0 || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
1819 ErrPrint("Invalid argument\n");
1820 return WIDGET_ERROR_INVALID_PARAMETER;
1824 ErrPrint("Connection is not established\n");
1825 return WIDGET_ERROR_INVALID_PARAMETER;
1828 info = widget_provider_buffer_find_buffer(WIDGET_TYPE_WIDGET, pkgname, id);
1830 return WIDGET_ERROR_INVALID_PARAMETER;
1835 (void)widget_provider_buffer_get_size(info, &_region.w, &_region.h, &bpp);
1839 ret = send_extra_buffer_updated(fd, pkgname, id, info, idx, region, direct, is_gbar);
1840 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1843 __attribute__((always_inline)) static inline int send_buffer_updated(int fd, const char *pkgname, const char *id, widget_buffer_h info, widget_damage_region_s *region, int direct, int for_gbar, const char *safe_filename)
1845 struct packet *packet;
1846 unsigned int cmd = for_gbar ? CMD_DESC_UPDATED : CMD_UPDATED;
1849 if (direct && info && widget_provider_buffer_uri(info)) {
1850 fb_sync_xdamage(info->fb, region);
1851 packet = packet_create_noack((const char *)&cmd, "ssssiiii", pkgname, id, widget_provider_buffer_uri(info), safe_filename, region->x, region->y, region->w, region->h);
1854 fb_sync_xdamage(info->fb, region);
1856 packet = packet_create_noack((const char *)&cmd, "sssiiii", pkgname, id, safe_filename, region->x, region->y, region->w, region->h);
1860 ErrPrint("failed to build a packet\n");
1861 return WIDGET_ERROR_FAULT;
1864 ret = com_core_packet_send_only(fd, packet);
1865 packet_destroy(packet);
1870 __attribute__((always_inline)) static inline int send_updated(int fd, const char *pkgname, const char *id, widget_damage_region_s *region, int direct, int for_gbar, const char *descfile)
1872 widget_buffer_h info;
1873 char *safe_filename = NULL;
1874 widget_damage_region_s _region = {
1882 if (!pkgname || !id) {
1883 ErrPrint("Invalid argument\n");
1884 return WIDGET_ERROR_INVALID_PARAMETER;
1888 ErrPrint("Connection is not established\n");
1889 return WIDGET_ERROR_INVALID_PARAMETER;
1892 if (for_gbar && !descfile) {
1893 descfile = widget_util_uri_to_path(id); /* In case of the NULL descfilename, use the ID */
1896 info = widget_provider_buffer_find_buffer(for_gbar ? WIDGET_TYPE_GBAR : WIDGET_TYPE_WIDGET, pkgname, id);
1898 safe_filename = keep_file_in_safe(for_gbar ? descfile : id, 1);
1899 if (!safe_filename) {
1900 return WIDGET_ERROR_INVALID_PARAMETER;
1904 safe_filename = strdup(descfile);
1905 if (!safe_filename) {
1906 ErrPrint("strdup: %d\n", errno);
1907 return WIDGET_ERROR_OUT_OF_MEMORY;
1915 (void)widget_provider_buffer_get_size(info, &_region.w, &_region.h, &bpp);
1920 ret = send_buffer_updated(fd, pkgname, id, info, region, direct, for_gbar, safe_filename);
1921 free(safe_filename);
1922 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
1925 EAPI int widget_provider_send_direct_updated(int fd, const char *pkgname, const char *id, int idx, widget_damage_region_s *region, int for_gbar, const char *descfile)
1929 if (idx == WIDGET_PRIMARY_BUFFER) {
1930 ret = send_updated(fd, pkgname, id, region, 1, for_gbar, descfile);
1932 ret = send_extra_updated(fd, pkgname, id, idx, region, 1, for_gbar);
1938 EAPI int widget_provider_send_updated(const char *pkgname, const char *id, int idx, widget_damage_region_s *region, int for_gbar, const char *descfile)
1942 if (idx == WIDGET_PRIMARY_BUFFER) {
1943 ret = send_updated(s_info.fd, pkgname, id, region, 0, for_gbar, descfile);
1945 ret = send_extra_updated(s_info.fd, pkgname, id, idx, region, 0, for_gbar);
1951 EAPI int widget_provider_send_direct_buffer_updated(int fd, widget_buffer_h handle, int idx, widget_damage_region_s *region, int for_gbar, const char *descfile)
1954 const char *pkgname;
1957 pkgname = widget_provider_buffer_pkgname(handle);
1958 id = widget_provider_buffer_id(handle);
1960 if (idx == WIDGET_PRIMARY_BUFFER) {
1961 ret = send_buffer_updated(fd, pkgname, id, handle, region, 1, for_gbar, descfile);
1963 ret = send_extra_buffer_updated(fd, pkgname, id, handle, idx, region, 1, for_gbar);
1969 EAPI int widget_provider_send_buffer_updated(widget_buffer_h handle, int idx, widget_damage_region_s *region, int for_gbar, const char *descfile)
1972 const char *pkgname;
1975 pkgname = widget_provider_buffer_pkgname(handle);
1976 id = widget_provider_buffer_id(handle);
1978 if (idx == WIDGET_PRIMARY_BUFFER) {
1979 ret = send_buffer_updated(s_info.fd, pkgname, id, handle, region, 0, for_gbar, descfile);
1981 ret = send_extra_buffer_updated(s_info.fd, pkgname, id, handle, idx, region, 0, for_gbar);
1987 EAPI int widget_provider_send_deleted(const char *pkgname, const char *id)
1989 struct packet *packet;
1990 unsigned int cmd = CMD_DELETED;
1993 if (!pkgname || !id) {
1994 ErrPrint("Invalid arguement\n");
1995 return WIDGET_ERROR_INVALID_PARAMETER;
1998 if (s_info.fd < 0) {
1999 ErrPrint("Connection is not established\n");
2000 return WIDGET_ERROR_INVALID_PARAMETER;
2003 packet = packet_create_noack((const char *)&cmd, "ss", pkgname, id);
2005 ErrPrint("Failed to build a packet\n");
2006 return WIDGET_ERROR_FAULT;
2009 ret = com_core_packet_send_only(s_info.fd, packet);
2010 packet_destroy(packet);
2011 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2014 EAPI int widget_provider_send_hold_scroll(const char *pkgname, const char *id, int hold)
2016 struct packet *packet;
2017 unsigned int cmd = CMD_SCROLL;
2020 if (!pkgname || !id) {
2021 ErrPrint("Invalid argument\n");
2022 return WIDGET_ERROR_INVALID_PARAMETER;
2025 if (s_info.fd < 0) {
2026 ErrPrint("Connection is not established\n");
2027 return WIDGET_ERROR_INVALID_PARAMETER;
2030 packet = packet_create_noack((const char *)&cmd, "ssi", pkgname, id, !!hold);
2032 ErrPrint("Failed to build a packet\n");
2033 return WIDGET_ERROR_FAULT;
2036 ret = com_core_packet_send_only(s_info.fd, packet);
2037 packet_destroy(packet);
2038 DbgPrint("[HOLD] Send hold: %d (%s) ret(%d)\n", hold, id, ret);
2039 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2042 EAPI int widget_provider_send_access_status(const char *pkgname, const char *id, int status)
2044 struct packet *packet;
2045 unsigned int cmd = CMD_ACCESS_STATUS;
2048 if (!pkgname || !id) {
2049 ErrPrint("Invalid argument\n");
2050 return WIDGET_ERROR_INVALID_PARAMETER;
2053 if (s_info.fd < 0) {
2054 ErrPrint("Connection is not established\n");
2055 return WIDGET_ERROR_INVALID_PARAMETER;
2058 packet = packet_create_noack((const char *)&cmd, "ssi", pkgname, id, status);
2060 ErrPrint("Failed to build a packet\n");
2061 return WIDGET_ERROR_FAULT;
2064 ret = com_core_packet_send_only(s_info.fd, packet);
2065 packet_destroy(packet);
2067 DbgPrint("[ACCESS] Send status: %d (%s) (%d)\n", status, id, ret);
2068 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2071 EAPI int widget_provider_send_key_status(const char *pkgname, const char *id, int status)
2073 struct packet *packet;
2074 unsigned int cmd = CMD_KEY_STATUS;
2077 if (!pkgname || !id) {
2078 ErrPrint("Invalid argument\n");
2079 return WIDGET_ERROR_INVALID_PARAMETER;
2082 if (s_info.fd < 0) {
2083 ErrPrint("Connection is not established\n");
2084 return WIDGET_ERROR_INVALID_PARAMETER;
2087 packet = packet_create_noack((const char *)&cmd, "ssi", pkgname, id, status);
2089 ErrPrint("Failed to build a packet\n");
2090 return WIDGET_ERROR_FAULT;
2093 ret = com_core_packet_send_only(s_info.fd, packet);
2094 packet_destroy(packet);
2096 DbgPrint("[KEY] Send status: %d (%s) (%d)\n", status, id, ret);
2097 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2100 EAPI int widget_provider_send_request_close_gbar(const char *pkgname, const char *id, int reason)
2102 struct packet *packet;
2103 unsigned int cmd = CMD_CLOSE_GBAR;
2106 if (!pkgname || !id) {
2107 ErrPrint("Invalid argument\n");
2108 return WIDGET_ERROR_INVALID_PARAMETER;
2111 if (s_info.fd < 0) {
2112 ErrPrint("Connection is not established\n");
2113 return WIDGET_ERROR_INVALID_PARAMETER;
2116 packet = packet_create_noack((const char *)&cmd, "ssi", pkgname, id, reason);
2118 ErrPrint("Failed to build a packet\n");
2119 return WIDGET_ERROR_FAULT;
2122 ret = com_core_packet_send_only(s_info.fd, packet);
2123 packet_destroy(packet);
2125 DbgPrint("[GBAR] Close GBAR: %d (%s) (%d)\n", reason, id, ret);
2126 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2129 EAPI int widget_provider_control(int ctrl)
2131 struct packet *packet;
2132 unsigned int cmd = CMD_CTRL;
2135 if (s_info.fd < 0) {
2136 ErrPrint("Connection is not established\n");
2137 return WIDGET_ERROR_INVALID_PARAMETER;
2140 packet = packet_create_noack((const char *)&cmd, "i", ctrl);
2142 ErrPrint("Failed to build a packet\n");
2143 return WIDGET_ERROR_FAULT;
2146 ret = com_core_packet_send_only(s_info.fd, packet);
2147 packet_destroy(packet);
2149 DbgPrint("[CTRL] Request: 0x%x\n", (unsigned int)ctrl);
2150 return ret < 0 ? WIDGET_ERROR_FAULT : WIDGET_ERROR_NONE;
2153 EAPI void *widget_provider_callback_data(void)