2 * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
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 <service_app.h>
23 #include <app_manager.h>
26 #include "autofill_daemon_dlog.h"
27 #include "autofill_stub.h"
28 #include "autofill_service_proxy.h"
29 #include "autofill_manager_stub.h"
30 #include "autofill_config.h"
32 #define RECONNECT_PERIOD 1.0
34 static rpc_port_proxy_AutofillSvcPort_h svc_rpc_h = NULL;
35 static rpc_port_AutofillSvcPort_autofill_svc_fill_response_cb_h fill_response_received_cb_h = NULL;
36 static rpc_port_AutofillSvcPort_autofill_svc_auth_info_cb_h auth_info_cb_h = NULL;
37 static rpc_port_AutofillSvcPort_autofill_svc_send_error_cb_h error_info_cb_h = NULL;
43 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_h auth_info_cb;
44 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_h fill_response_received_cb;
45 rpc_port_AutofillAppPort_autofill_error_info_received_cb_h error_info_cb;
48 static GList *__client_list = NULL;
49 static Ecore_Timer *g_connect_timer = NULL;
50 static bool g_connected = false;
52 static bool connect_service();
53 static void terminate_autofill_service();
55 static autofill_client_s *
56 get_autofill_client(const char *app_id, int context_id)
59 autofill_client_s *client;
65 iter = g_list_next(iter);
68 LOGW("Warning: value is NULL");
72 if ((client->context_id == context_id) &&
73 client->app_id && strcmp(client->app_id, app_id) == 0) {
81 static autofill_client_s *__create_client(const char *app_id, int context_id,
82 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_h auth_info_cb,
83 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_h fill_response_received_cb,
84 rpc_port_AutofillAppPort_autofill_error_info_received_cb_h error_info_cb)
87 autofill_client_s *handle;
89 handle = calloc(1, sizeof(autofill_client_s));
91 LOGE("Out of memory");
95 handle->app_id = strdup(app_id);
96 if (!handle->app_id) {
97 LOGE("Out of memory");
102 handle->context_id = context_id;
104 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_clone(auth_info_cb, &handle->auth_info_cb);
105 if (!handle->auth_info_cb) {
106 LOGE("Out of memory");
107 free(handle->app_id);
112 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_clone(fill_response_received_cb, &handle->fill_response_received_cb);
114 if (!handle->fill_response_received_cb) {
115 LOGE("Out of memory");
116 free(handle->app_id);
117 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_destroy(handle->auth_info_cb);
122 rpc_port_AutofillAppPort_autofill_error_info_received_cb_clone(error_info_cb, &handle->error_info_cb);
123 if (!handle->error_info_cb) {
124 LOGE("Out of memory");
125 free(handle->app_id);
126 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_destroy(handle->auth_info_cb);
127 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_destroy(handle->fill_response_received_cb);
135 static void __destroy_client(gpointer data)
138 autofill_client_s *handle = data;
143 if (handle->auth_info_cb) {
144 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_destroy(handle->auth_info_cb);
145 handle->auth_info_cb = NULL;
148 if (handle->fill_response_received_cb) {
149 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_destroy(handle->fill_response_received_cb);
150 handle->fill_response_received_cb = NULL;
153 if (handle->error_info_cb) {
154 rpc_port_AutofillAppPort_autofill_error_info_received_cb_destroy(handle->error_info_cb);
155 handle->error_info_cb = NULL;
158 if (handle->app_id) {
159 free(handle->app_id);
160 handle->app_id = NULL;
166 static void __remove_client(rpc_port_stub_AutofillAppPort_context_h context)
168 autofill_client_s *client = NULL;
169 rpc_port_stub_AutofillAppPort_context_get_tag(context, (void *)&client);
173 rpc_port_stub_AutofillAppPort_context_set_tag(context, NULL);
175 LOGI("name(%s)", client->app_id);
177 __client_list = g_list_remove(__client_list, client);
178 __destroy_client(client);
180 if (g_list_length(__client_list) == 0) {
181 terminate_autofill_service();
183 LOGI("terminate autofill daemon");
188 static void __client_create(rpc_port_stub_AutofillAppPort_context_h context,
191 LOGD("context : %p", context);
194 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
198 LOGD("sender(%s)", sender);
202 static gboolean __client_remove_cb(void *data)
204 rpc_port_stub_AutofillAppPort_context_h context = data;
206 LOGD("client remove callback (%p)", context);
208 __remove_client(context);
213 static void __client_terminate(rpc_port_stub_AutofillAppPort_context_h context,
216 LOGD("context : %p", context);
219 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
223 LOGD("[__RPC_PORT__] sender(%s)", sender);
226 g_idle_add(__client_remove_cb, context);
229 static int __client_register(rpc_port_stub_AutofillAppPort_context_h context,
231 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_h auth_info_cb,
232 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_h fill_response_received_cb,
233 rpc_port_AutofillAppPort_autofill_error_info_received_cb_h error_info_cb,
236 LOGD("context : %p", context);
238 autofill_client_s *client = NULL;
240 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
244 LOGD("sender(%s)", sender);
246 client = __create_client(sender, context_id, auth_info_cb, fill_response_received_cb, error_info_cb);
252 __client_list = g_list_append(__client_list, client);
254 rpc_port_stub_AutofillAppPort_context_set_tag(context, client);
259 static void __client_unregister(rpc_port_stub_AutofillAppPort_context_h context, int context_id, void *user_data)
261 LOGD("context : %p", context);
262 __remove_client(context);
265 static void __manager_create(rpc_port_stub_AutofillManagerPort_context_h context,
271 static void __manager_terminate(rpc_port_stub_AutofillManagerPort_context_h context,
277 bool __view_info_item_cb(rpc_port_autofill_item_h items, void *user_data)
285 rpc_port_autofill_svc_view_info_h svi = (rpc_port_autofill_svc_view_info_h)user_data;
287 rpc_port_autofill_svc_item_h svc_item = NULL;
289 if (rpc_port_autofill_svc_item_create(&svc_item) != 0) {
290 LOGW("Failed to create autofill item");
294 rpc_port_autofill_item_get_id(items, &id);
295 rpc_port_autofill_svc_item_set_id(svc_item, id);
300 rpc_port_autofill_item_get_label(items, &label);
301 rpc_port_autofill_svc_item_set_label(svc_item, label);
306 rpc_port_autofill_item_get_value(items, &value);
307 rpc_port_autofill_svc_item_set_value(svc_item, value);
312 rpc_port_autofill_item_get_autofill_hint(items, &autofill_hint);
313 rpc_port_autofill_svc_item_set_autofill_hint(svc_item, autofill_hint);
315 rpc_port_autofill_item_get_is_sensitive_data(items, &sensitive_data);
316 rpc_port_autofill_svc_item_set_is_sensitive_data(svc_item, sensitive_data);
318 if (rpc_port_autofill_svc_view_info_add_items(svi, svc_item) != 0) {
319 LOGW("Failed to add item");
322 rpc_port_autofill_svc_item_destroy(svc_item);
327 bool __save_item_cb(rpc_port_autofill_save_item_h items, void *user_data)
335 rpc_port_autofill_svc_save_view_info_h svi = (rpc_port_autofill_svc_save_view_info_h)user_data;
337 rpc_port_autofill_svc_save_item_h svc_save_item = NULL;
339 if (rpc_port_autofill_svc_save_item_create(&svc_save_item) != 0)
342 rpc_port_autofill_save_item_get_id(items, &id);
343 rpc_port_autofill_svc_save_item_set_id(svc_save_item, id);
348 rpc_port_autofill_save_item_get_label(items, &label);
349 rpc_port_autofill_svc_save_item_set_label(svc_save_item, label);
354 rpc_port_autofill_save_item_get_value(items, &value);
355 rpc_port_autofill_svc_save_item_set_value(svc_save_item, value);
360 rpc_port_autofill_save_item_get_autofill_hint(items, &autofill_hint);
361 rpc_port_autofill_svc_save_item_set_autofill_hint(svc_save_item, autofill_hint);
363 rpc_port_autofill_save_item_get_is_sensitive_data(items, &sensitive_data);
364 rpc_port_autofill_svc_save_item_set_is_sensitive_data(svc_save_item, sensitive_data);
366 rpc_port_autofill_svc_save_view_info_add_items(svi, svc_save_item);
368 rpc_port_autofill_svc_save_item_destroy(svc_save_item);
373 static int __auth_info_request_cb(rpc_port_stub_AutofillAppPort_context_h context, int context_id, rpc_port_autofill_view_info_h vi, void *user_data)
376 char *view_id = NULL;
379 LOGW("Not connected to autofill service");
384 LOGW("RPC port for autofill service is not created");
388 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
390 rpc_port_autofill_view_info_get_view_id(vi, &view_id);
391 LOGD("app id : %s, view id : %s", sender, view_id);
393 /* create view info */
394 rpc_port_autofill_svc_view_info_h svi = NULL;
395 if (rpc_port_autofill_svc_view_info_create(&svi) != 0) {
399 rpc_port_autofill_svc_view_info_set_app_id(svi, sender);
400 rpc_port_autofill_svc_view_info_set_view_id(svi, view_id);
402 rpc_port_autofill_view_info_foreach_items(vi, __view_info_item_cb, svi);
404 rpc_port_proxy_AutofillSvcPort_invoke_request_auth_info(svc_rpc_h, context_id, svi);
406 rpc_port_autofill_svc_view_info_destroy(svi);
420 static int __autofill_fill_request_cb(rpc_port_stub_AutofillAppPort_context_h context, int context_id, rpc_port_autofill_view_info_h vi, void *user_data)
423 char *view_id = NULL;
426 LOGW("Not connected to autofill service");
431 LOGW("RPC port for autofill service is not created");
435 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
436 rpc_port_autofill_view_info_get_view_id(vi, &view_id);
438 LOGD("app id : %s, view id : %s, context id : %d", sender, view_id, context_id);
440 rpc_port_autofill_svc_view_info_h svi = NULL;
441 if (rpc_port_autofill_svc_view_info_create(&svi) != 0) {
445 rpc_port_autofill_svc_view_info_set_app_id(svi, sender);
446 rpc_port_autofill_svc_view_info_set_view_id(svi, view_id);
448 rpc_port_autofill_view_info_foreach_items(vi, __view_info_item_cb, svi);
450 rpc_port_proxy_AutofillSvcPort_invoke_send_fill_request(svc_rpc_h, context_id, svi);
452 rpc_port_autofill_svc_view_info_destroy(svi);
464 static int __autofill_cancel_fill_request_cb(rpc_port_stub_AutofillAppPort_context_h context, int context_id, rpc_port_autofill_view_info_h vi, void *user_data)
467 char *view_id = NULL;
470 LOGW("Not connected to autofill service");
475 LOGW("RPC port for autofill service is not created");
479 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
480 rpc_port_autofill_view_info_get_view_id(vi, &view_id);
482 LOGD("app id : %s, view id : %s, context id : %d", sender, view_id, context_id);
484 rpc_port_autofill_svc_view_info_h svi = NULL;
485 if (rpc_port_autofill_svc_view_info_create(&svi) != 0) {
489 rpc_port_autofill_svc_view_info_set_app_id(svi, sender);
490 rpc_port_autofill_svc_view_info_set_view_id(svi, view_id);
492 rpc_port_autofill_view_info_foreach_items(vi, __view_info_item_cb, svi);
494 rpc_port_proxy_AutofillSvcPort_invoke_cancel_fill_request(svc_rpc_h, context_id, svi);
496 rpc_port_autofill_svc_view_info_destroy(svi);
508 static int __commit_cb(rpc_port_stub_AutofillAppPort_context_h context, int context_id, rpc_port_autofill_save_view_info_h vi, void *user_data)
511 char *view_id = NULL;
512 char *view_title = NULL;
515 LOGW("Not connected to autofill service");
520 LOGW("RPC port for autofill service is not created");
524 rpc_port_autofill_svc_save_view_info_h svi = NULL;
525 if (rpc_port_autofill_svc_save_view_info_create(&svi) != 0) {
529 rpc_port_stub_AutofillAppPort_context_get_sender(context, &sender);
532 rpc_port_autofill_svc_save_view_info_set_app_id(svi, sender);
533 LOGD("sender(%s)", sender);
537 rpc_port_autofill_save_view_info_get_view_id(vi, &view_id);
538 rpc_port_autofill_save_view_info_get_view_title(vi, &view_title);
540 LOGI("view id : '%s', view title : '%s'", view_id, view_title);
541 rpc_port_autofill_svc_save_view_info_set_view_id(svi, view_id);
542 rpc_port_autofill_svc_save_view_info_set_view_title(svi, view_title);
544 rpc_port_autofill_save_view_info_foreach_items(vi, __save_item_cb, svi);
546 rpc_port_proxy_AutofillSvcPort_invoke_commit(svc_rpc_h, context_id, svi);
554 rpc_port_autofill_svc_save_view_info_destroy(svi);
559 bool fill_response_item_cb(rpc_port_autofill_svc_response_item_h response_items, void *user_data)
561 rpc_port_autofill_response_group_h res_group = (rpc_port_autofill_response_group_h)user_data;
564 char *presentation_text = NULL;
568 rpc_port_autofill_response_item_h res_item = NULL;
570 if (rpc_port_autofill_response_item_create(&res_item) != 0) {
574 rpc_port_autofill_svc_response_item_get_id(response_items, &id);
575 rpc_port_autofill_response_item_set_id(res_item, id);
577 rpc_port_autofill_svc_response_item_get_presentation_text(response_items, &presentation_text);
578 rpc_port_autofill_response_item_set_presentation_text(res_item, presentation_text);
580 rpc_port_autofill_svc_response_item_get_value(response_items, &value);
581 rpc_port_autofill_response_item_set_value(res_item, value);
583 rpc_port_autofill_svc_response_item_get_autofill_hint(response_items, &autofill_hint);
584 rpc_port_autofill_response_item_set_autofill_hint(res_item, autofill_hint);
586 rpc_port_autofill_response_group_add_response_items(res_group, res_item);
591 if (presentation_text)
592 free(presentation_text);
597 rpc_port_autofill_response_item_destroy(res_item);
602 bool fill_response_group_cb(rpc_port_autofill_svc_response_group_h response_groups, void *user_data)
604 rpc_port_autofill_fill_response_h fr_h = (rpc_port_autofill_fill_response_h)user_data;
606 rpc_port_autofill_response_group_h res_group = NULL;
607 if (rpc_port_autofill_response_group_create(&res_group) != 0)
610 rpc_port_autofill_svc_response_group_foreach_response_items(response_groups, fill_response_item_cb, res_group);
612 rpc_port_autofill_fill_response_add_response_groups(fr_h, res_group);
614 rpc_port_autofill_response_group_destroy(res_group);
619 static void __fill_response_recv_cb(void *user_data, int context_id, rpc_port_autofill_svc_fill_response_h response_h)
621 // recv fill response from service
622 char *view_id = NULL;
625 /* create autofill response */
626 rpc_port_autofill_fill_response_h fill_response_h = NULL;
627 if (rpc_port_autofill_fill_response_create(&fill_response_h) != 0)
630 rpc_port_autofill_svc_fill_response_get_app_id(response_h, &app_id);
631 rpc_port_autofill_svc_fill_response_get_view_id(response_h, &view_id);
633 rpc_port_autofill_fill_response_set_app_id(fill_response_h, app_id);
634 rpc_port_autofill_fill_response_set_view_id(fill_response_h, view_id);
636 rpc_port_autofill_svc_fill_response_foreach_response_groups(response_h, fill_response_group_cb, fill_response_h);
638 autofill_client_s *sender_client = get_autofill_client(app_id, context_id);
640 rpc_port_AutofillAppPort_autofill_fill_response_received_cb_invoke(sender_client->fill_response_received_cb, fill_response_h);
642 rpc_port_autofill_fill_response_destroy(fill_response_h);
651 static void __auth_info_recv_cb(void *user_data, int context_id, rpc_port_autofill_svc_auth_info_h svc_auth_info_h)
653 bool exist_autofill_data = false;
654 bool need_authentication = false;
655 char *service_name = NULL;
656 char *service_logo_image_path = NULL;
657 char *service_message = NULL;
659 char *view_id = NULL;
661 rpc_port_autofill_svc_auth_info_get_app_id(svc_auth_info_h, &app_id);
662 rpc_port_autofill_svc_auth_info_get_view_id(svc_auth_info_h, &view_id);
663 rpc_port_autofill_svc_auth_info_get_exist_autofill_data(svc_auth_info_h, &exist_autofill_data);
664 rpc_port_autofill_svc_auth_info_get_need_authentication(svc_auth_info_h, &need_authentication);
665 rpc_port_autofill_svc_auth_info_get_service_name(svc_auth_info_h, &service_name);
666 rpc_port_autofill_svc_auth_info_get_service_logo_image_path(svc_auth_info_h, &service_logo_image_path);
667 rpc_port_autofill_svc_auth_info_get_service_message(svc_auth_info_h, &service_message);
669 LOGD("app id : %s, service name : %s, message : %s, logo path : %s", app_id, service_name, service_message, service_logo_image_path);
671 /* transfer auth info */
672 rpc_port_autofill_auth_info_h auth_info_h = NULL;
673 rpc_port_autofill_auth_info_create(&auth_info_h);
674 rpc_port_autofill_auth_info_set_app_id(auth_info_h, app_id);
675 rpc_port_autofill_auth_info_set_view_id(auth_info_h, view_id);
676 rpc_port_autofill_auth_info_set_exist_autofill_data(auth_info_h, exist_autofill_data);
677 rpc_port_autofill_auth_info_set_need_authentication(auth_info_h, need_authentication);
678 rpc_port_autofill_auth_info_set_service_name(auth_info_h, service_name);
679 rpc_port_autofill_auth_info_set_service_message(auth_info_h, service_message);
680 rpc_port_autofill_auth_info_set_service_logo_image_path(auth_info_h, service_logo_image_path);
682 autofill_client_s *sender_client = get_autofill_client(app_id, context_id);
684 rpc_port_AutofillAppPort_autofill_auth_info_received_cb_invoke(sender_client->auth_info_cb, auth_info_h);
686 rpc_port_autofill_auth_info_destroy(auth_info_h);
697 if (service_logo_image_path)
698 free(service_logo_image_path);
701 free(service_message);
704 static void __error_info_recv_cb(void *user_data, int context_id, rpc_port_autofill_svc_error_info_h svc_error_info_h)
709 rpc_port_autofill_svc_error_info_get_app_id(svc_error_info_h, &app_id);
710 rpc_port_autofill_svc_error_info_get_error_code(svc_error_info_h, &error_code);
712 /* transfer error info */
713 rpc_port_autofill_error_info_h error_info_h = NULL;
714 rpc_port_autofill_error_info_create(&error_info_h);
715 rpc_port_autofill_error_info_set_app_id(error_info_h, app_id);
716 rpc_port_autofill_error_info_set_error_code(error_info_h, error_code);
718 autofill_client_s *sender_client = get_autofill_client(app_id, context_id);
720 rpc_port_AutofillAppPort_autofill_error_info_received_cb_invoke(sender_client->error_info_cb, error_info_h);
722 rpc_port_autofill_error_info_destroy(error_info_h);
724 LOGI("error code : %#x, message : '%s'", error_code, get_error_message(error_code));
730 static void __on_connected(rpc_port_proxy_AutofillSvcPort_h h, void *user_data)
732 LOGI("Autofill service connected");
734 if (g_connect_timer) {
735 ecore_timer_del(g_connect_timer);
736 g_connect_timer = NULL;
739 if (fill_response_received_cb_h) {
740 free(fill_response_received_cb_h);
743 if (auth_info_cb_h) {
744 free(auth_info_cb_h);
747 if (error_info_cb_h) {
748 free(error_info_cb_h);
751 fill_response_received_cb_h = rpc_port_AutofillSvcPort_autofill_svc_fill_response_cb_create(__fill_response_recv_cb, false, NULL);
752 auth_info_cb_h = rpc_port_AutofillSvcPort_autofill_svc_auth_info_cb_create(__auth_info_recv_cb, false, NULL);
753 error_info_cb_h = rpc_port_AutofillSvcPort_autofill_svc_send_error_cb_create(__error_info_recv_cb, false, NULL);
755 int r = rpc_port_proxy_AutofillSvcPort_invoke_Register(h, auth_info_cb_h, fill_response_received_cb_h, error_info_cb_h);
757 LOGW("Failed to invoke Register");
762 static Eina_Bool connect_timer_cb(void *data)
764 if (connect_service()) {
765 g_connect_timer = NULL;
766 return ECORE_CALLBACK_CANCEL;
769 return ECORE_CALLBACK_RENEW;
772 static void retry_connect_service()
776 if (fill_response_received_cb_h) {
777 free(fill_response_received_cb_h);
778 fill_response_received_cb_h = NULL;
781 if (auth_info_cb_h) {
782 free(auth_info_cb_h);
783 auth_info_cb_h = NULL;
786 if (error_info_cb_h) {
787 free(error_info_cb_h);
788 error_info_cb_h = NULL;
793 // try to connect again
794 if (!connect_service()) {
796 ecore_timer_del(g_connect_timer);
798 g_connect_timer = ecore_timer_add(RECONNECT_PERIOD, connect_timer_cb, NULL);
803 static void __on_disconnected(rpc_port_proxy_AutofillSvcPort_h h, void *user_data)
805 LOGW("Autofill service is disconnected");
807 retry_connect_service();
810 static void __on_rejected(rpc_port_proxy_AutofillSvcPort_h h, void *user_data)
812 LOGW("Rejected to connect autofill service");
814 retry_connect_service();
818 static void terminate_autofill_service()
821 LOGI("Send terminate message to autofill service");
823 rpc_port_proxy_AutofillSvcPort_invoke_request_terminate(svc_rpc_h);
825 int ret = rpc_port_proxy_AutofillSvcPort_destroy(svc_rpc_h);
826 LOGD("ret : %#x", ret);
827 if (ret == RPC_PORT_ERROR_NONE) {
828 fill_response_received_cb_h = NULL;
829 auth_info_cb_h = NULL;
830 error_info_cb_h = NULL;
839 static bool __manager_set_autofill_service_cb(rpc_port_stub_AutofillManagerPort_context_h context, const char *app_id, void *user_data)
841 LOGI("autofill service app id: '%s'", app_id);
844 autofill_config_set_autofill_service_app_id(app_id);
846 terminate_autofill_service();
853 static char * __manager_get_autofill_service_cb(rpc_port_stub_AutofillManagerPort_context_h context, void *user_data)
856 LOGW("Not initialized");
861 autofill_config_get_autofill_service_app_id(&app_id, NULL);
863 LOGI("app id : %s", app_id);
868 bool add_autofill_service_cb(app_info_h app_info, void *user_data)
871 rpc_port_list_string_h service_info_list = (rpc_port_list_string_h)user_data;
873 int ret = app_info_get_app_id(app_info, &app_id);
874 if (ret != APP_MANAGER_ERROR_NONE) {
875 LOGW("app_info_get_app_id failed (%#x)", ret);
879 LOGI("Find autofill service : %s", app_id);
881 rpc_port_list_string_add_list_strings(service_info_list, app_id);
890 static bool __manager_get_autofill_service_list_cb(rpc_port_stub_AutofillManagerPort_context_h context, rpc_port_list_string_h *service_info_list, void *user_data)
893 app_info_metadata_filter_h handle = NULL;
895 // Get the Autofill service list
896 ret = app_info_metadata_filter_create(&handle);
897 if (ret != APP_MANAGER_ERROR_NONE) {
898 LOGW("app_info_metadata_filter_create failed (%#x)", ret);
899 app_info_metadata_filter_destroy(handle);
903 ret = app_info_metadata_filter_add(handle, "autofill-service", "true");
904 if (ret != APP_MANAGER_ERROR_NONE) {
905 LOGW("app_info_metadata_filter_add failed (%#x)", ret);
906 app_info_metadata_filter_destroy(handle);
910 rpc_port_list_string_h app_id_list_h = NULL;
911 rpc_port_list_string_create(&app_id_list_h);
913 ret = app_info_metadata_filter_foreach(handle, add_autofill_service_cb, app_id_list_h);
914 if (ret != APP_MANAGER_ERROR_NONE) {
915 LOGW("app_info_metadata_filter_foreach failed (%#x)", ret);
918 *service_info_list = app_id_list_h;
920 app_info_metadata_filter_destroy(handle);
925 static bool connect_service()
928 size_t service_id_len = 0;
929 char *active_autofill_service_id = NULL;
930 bool sys_config = false;
932 rpc_port_proxy_AutofillSvcPort_callback_s rpc_callback = {
933 .connected = __on_connected,
934 .disconnected = __on_disconnected,
935 .rejected = __on_rejected
939 LOGI("connecting..\n");
944 LOGI("already connected\n");
948 LOGD("get autofill service app id");
949 autofill_config_get_autofill_service_app_id(&active_autofill_service_id, &sys_config);
950 LOGI("active autofill service app id: '%s'", active_autofill_service_id);
952 if (!active_autofill_service_id) {
953 active_autofill_service_id = strdup(AUTOFILL_SERVICE_APP_ID);
956 if (!active_autofill_service_id)
960 autofill_config_set_autofill_service_app_id(active_autofill_service_id);
962 service_id_len = strlen(active_autofill_service_id);
964 if (service_id_len > 0) {
965 ret = rpc_port_proxy_AutofillSvcPort_create(active_autofill_service_id, &rpc_callback, NULL, &svc_rpc_h);
967 else if (service_id_len == 0) {
968 LOGW("No Autofill service to connect");
969 free(active_autofill_service_id);
973 if (ret != RPC_PORT_ERROR_NONE) {
974 LOGW("Failed to create rpc port. error code: %#x, message: %s", ret, get_error_message(ret));
975 free(active_autofill_service_id);
979 LOGI("Connect to autofill service: '%s'", active_autofill_service_id);
980 free(active_autofill_service_id);
981 ret = rpc_port_proxy_AutofillSvcPort_connect(svc_rpc_h);
982 if (ret != RPC_PORT_ERROR_NONE) {
983 LOGW("Failed to connect. error code: %#x, message: %s", ret, get_error_message(ret));
984 rpc_port_proxy_AutofillSvcPort_destroy(svc_rpc_h);
992 bool service_app_create(void *data)
994 // Todo: add your code here.
999 rpc_port_stub_AutofillAppPort_callback_s callback = {
1003 __client_unregister,
1004 __auth_info_request_cb,
1005 __autofill_fill_request_cb,
1007 __autofill_cancel_fill_request_cb
1010 ret = rpc_port_stub_AutofillAppPort_register(&callback, NULL);
1012 LOGW("Failed to register app port");
1014 LOGI("Succeeded to register app port");
1016 // register manager port
1017 rpc_port_stub_AutofillManagerPort_callback_s manager_callback = {
1019 __manager_terminate,
1020 __manager_set_autofill_service_cb,
1021 __manager_get_autofill_service_cb,
1022 __manager_get_autofill_service_list_cb,
1025 ret = rpc_port_stub_AutofillManagerPort_register(&manager_callback, NULL);
1027 LOGW("Failed to register manager port");
1029 LOGI("Succeeded to register manager port");
1036 void service_app_terminate(void *data)
1038 // Todo: add your code here.
1041 if (__client_list) {
1042 g_list_free_full(__client_list, __destroy_client);
1043 __client_list = NULL;
1046 if (g_connect_timer) {
1047 ecore_timer_del(g_connect_timer);
1048 g_connect_timer = NULL;
1051 rpc_port_stub_AutofillAppPort_unregister();
1056 void service_app_control(app_control_h app_control, void *data)
1058 // Todo: add your code here.
1063 service_app_lang_changed(app_event_info_h event_info, void *user_data)
1065 /*APP_EVENT_LANGUAGE_CHANGED*/
1070 service_app_region_changed(app_event_info_h event_info, void *user_data)
1072 /*APP_EVENT_REGION_FORMAT_CHANGED*/
1076 service_app_low_battery(app_event_info_h event_info, void *user_data)
1078 /*APP_EVENT_LOW_BATTERY*/
1082 service_app_low_memory(app_event_info_h event_info, void *user_data)
1084 /*APP_EVENT_LOW_MEMORY*/
1088 * Entry point for this application.
1090 int main(int argc, char *argv[])
1095 service_app_lifecycle_callback_s event_callback;
1096 app_event_handler_h handlers[5] = {NULL, };
1098 event_callback.create = service_app_create;
1099 event_callback.terminate = service_app_terminate;
1100 event_callback.app_control = service_app_control;
1102 service_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, service_app_low_battery, &ad);
1103 service_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, service_app_low_memory, &ad);
1104 service_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, service_app_lang_changed, &ad);
1105 service_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, service_app_region_changed, &ad);
1107 return service_app_main(argc, argv, &event_callback, ad);