2 * Copyright (c) 2011 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.
29 #include <app_service.h>
30 #include <app_service_private.h>
36 #define LOG_TAG "CAPI_APPFW_APPLICATION_SERVICE"
38 #ifndef TIZEN_PATH_MAX
39 #define TIZEN_PATH_MAX 1024
42 #define BUNDLE_KEY_PREFIX_AUL "__AUL_"
43 #define BUNDLE_KEY_PREFIX_SERVICE "__APP_SVC_"
45 #define BUNDLE_KEY_OPERATION "__APP_SVC_OP_TYPE__"
46 #define BUNDLE_KEY_URI "__APP_SVC_URI__"
47 #define BUNDLE_KEY_MIME "__APP_SVC_MIME_TYPE__"
48 #define BUNDLE_KEY_DATA "__APP_SVC_DATA__"
49 #define BUNDLE_KEY_PACKAGE "__APP_SVC_PKG_NAME__"
50 #define BUNDLE_KEY_WINDOW "__APP_SVC_K_WIN_ID__"
66 typedef struct service_request_context_s {
68 service_reply_cb reply_cb;
70 } *service_request_context_h;
72 extern int appsvc_allow_transient_app(bundle *b, unsigned int id);
73 extern int appsvc_request_transient_app(bundle *b, unsigned int callee_id, appsvc_host_res_fn cbfunc, void *data);
75 static int service_create_reply(bundle *data, struct service_s **service);
77 static const char* service_error_to_string(service_error_e error)
81 case SERVICE_ERROR_NONE:
84 case SERVICE_ERROR_INVALID_PARAMETER:
85 return "INVALID_PARAMETER";
87 case SERVICE_ERROR_OUT_OF_MEMORY:
88 return "OUT_OF_MEMORY";
90 case SERVICE_ERROR_APP_NOT_FOUND:
91 return "APP_NOT_FOUND";
93 case SERVICE_ERROR_KEY_NOT_FOUND:
94 return "KEY_NOT_FOUND";
96 case SERVICE_ERROR_KEY_REJECTED:
97 return "KEY_REJECTED";
99 case SERVICE_ERROR_INVALID_DATA_TYPE:
100 return "INVALID_DATA_TYPE";
102 case SERVICE_ERROR_LAUNCH_REJECTED:
103 return "LAUNCH_REJECTED";
110 int service_error(service_error_e error, const char* function, const char *description)
114 LOGE("[%s] %s(0x%08x) : %s", function, service_error_to_string(error), error, description);
118 if(error == SERVICE_ERROR_KEY_NOT_FOUND)
119 LOGW("[%s] %s(0x%08x)", function, service_error_to_string(error), error);
121 LOGE("[%s] %s(0x%08x)", function, service_error_to_string(error), error);
127 static int service_validate_extra_data(const char *data)
129 if (data == NULL || data[0] == '\0')
131 return SERVICE_ERROR_INVALID_PARAMETER;
134 return SERVICE_ERROR_NONE;
137 static int service_valiate_service(service_h service)
139 if (service == NULL || service->data == NULL)
141 return SERVICE_ERROR_INVALID_PARAMETER;
144 return SERVICE_ERROR_NONE;
147 static int service_new_id()
153 int service_validate_internal_key(const char *key)
155 if (strncmp(BUNDLE_KEY_PREFIX_AUL, key, strlen(BUNDLE_KEY_PREFIX_AUL)) == 0)
160 if (strncmp(BUNDLE_KEY_PREFIX_SERVICE, key, strlen(BUNDLE_KEY_PREFIX_SERVICE)) == 0)
168 static void service_request_result_broker(bundle *appsvc_bundle, int appsvc_request_code, appsvc_result_val appsvc_result, void *appsvc_data)
170 service_request_context_h request_context;
172 service_h reply = NULL;
173 service_result_e result;
175 service_reply_cb reply_cb;
177 if (appsvc_data == NULL)
179 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service reply");
183 if (service_create_reply(appsvc_bundle, &reply) != 0)
185 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to create service reply");
189 request_context = appsvc_data;
190 request = request_context->service;
192 switch (appsvc_result)
195 result = SERVICE_RESULT_SUCCEEDED;
198 case APPSVC_RES_NOT_OK:
199 result = SERVICE_RESULT_FAILED;
202 case APPSVC_RES_CANCEL:
203 result = SERVICE_RESULT_CANCELED;
207 result = SERVICE_RESULT_CANCELED;
211 user_data = request_context->user_data;
212 reply_cb = request_context->reply_cb;
214 if (reply_cb != NULL)
216 reply_cb(request, reply, result, user_data);
220 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid callback ");
223 service_destroy(reply);
225 if (request_context->service != NULL)
227 service_destroy(request_context->service);
230 free(request_context);
234 int service_create(service_h *service)
236 return service_create_request(NULL, service);
239 int service_create_request(bundle *data, service_h *service)
241 struct service_s *service_request;
245 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
248 service_request = malloc(sizeof(struct service_s));
250 if (service_request == NULL)
252 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
255 service_request->type = SERVICE_TYPE_REQUEST;
259 service_request->data = bundle_dup(data);
263 service_request->data = bundle_create();
266 if (service_request->data == NULL)
268 free(service_request);
269 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a bundle");
272 service_request->id = service_new_id();
273 service_request->launch_pid = -1;
275 *service = service_request;
277 return SERVICE_ERROR_NONE;
280 int service_create_event(bundle *data, struct service_s **service)
282 struct service_s *service_event;
284 const char *operation;
286 if (data == NULL || service == NULL)
288 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
291 service_event = malloc(sizeof(struct service_s));
293 if (service_event == NULL)
295 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
298 service_event->type = SERVICE_TYPE_EVENT;
299 service_event->data = bundle_dup(data);
300 service_event->id = service_new_id();
302 operation = appsvc_get_operation(service_event->data);
304 if (operation == NULL)
306 appsvc_set_operation(service_event->data, SERVICE_OPERATION_DEFAULT);
309 *service = service_event;
311 return SERVICE_ERROR_NONE;
314 static int service_create_reply(bundle *data, struct service_s **service)
316 struct service_s *service_reply;
318 if (data == NULL || service == NULL)
320 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
323 service_reply = malloc(sizeof(struct service_s));
325 if (service_reply == NULL)
327 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
330 service_reply->type = SERVICE_TYPE_REPLY;
331 service_reply->data = bundle_dup(data);
332 service_reply->id = service_new_id();
334 *service = service_reply;
336 return SERVICE_ERROR_NONE;
339 int service_destroy(service_h service)
341 if (service_valiate_service(service))
343 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
346 bundle_free(service->data);
347 service->data = NULL;
350 return SERVICE_ERROR_NONE;
353 int service_to_bundle(service_h service, bundle **data)
355 if (service_valiate_service(service) || data == NULL)
357 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
360 *data = service->data;
362 return SERVICE_ERROR_NONE;
365 int service_set_operation(service_h service, const char *operation)
367 if (service_valiate_service(service))
369 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
372 if (operation != NULL)
374 if (appsvc_set_operation(service->data, operation) != 0)
376 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid operation");
381 bundle_del(service->data, BUNDLE_KEY_OPERATION);
384 return SERVICE_ERROR_NONE;
387 int service_get_operation(service_h service, char **operation)
389 const char *operation_value;
391 if (service_valiate_service(service) || operation == NULL)
393 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
396 operation_value = appsvc_get_operation(service->data);
398 if (operation_value != NULL)
400 *operation = strdup(operation_value);
407 return SERVICE_ERROR_NONE;
411 int service_set_uri(service_h service, const char *uri)
413 if (service_valiate_service(service))
415 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
420 if (appsvc_set_uri(service->data, uri) != 0)
422 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid URI");
427 bundle_del(service->data, BUNDLE_KEY_URI);
430 return SERVICE_ERROR_NONE;
434 int service_get_uri(service_h service, char **uri)
436 const char *uri_value;
438 if (service_valiate_service(service) || uri == NULL)
440 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
443 uri_value = appsvc_get_uri(service->data);
445 if (uri_value != NULL)
447 *uri = strdup(uri_value);
454 return SERVICE_ERROR_NONE;
458 int service_set_mime(service_h service, const char *mime)
460 if (service_valiate_service(service))
462 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
467 if (appsvc_set_mime(service->data, mime) != 0)
469 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid MIME type");
474 bundle_del(service->data, BUNDLE_KEY_MIME);
477 return SERVICE_ERROR_NONE;
481 int service_get_mime(service_h service, char **mime)
483 const char *mime_value;
485 if (service_valiate_service(service) || mime == NULL)
487 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
490 mime_value = appsvc_get_mime(service->data);
492 if (mime_value != NULL)
494 *mime = strdup(mime_value);
501 return SERVICE_ERROR_NONE;
505 int service_set_category(service_h service, const char *category)
507 if (service_valiate_service(service))
509 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
512 if (category != NULL)
514 if (appsvc_set_category(service->data, category) != 0)
516 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid MIME type");
521 bundle_del(service->data, BUNDLE_KEY_MIME);
524 return SERVICE_ERROR_NONE;
528 int service_get_category(service_h service, char **category)
530 const char *category_value;
532 if (service_valiate_service(service) || category == NULL)
534 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
537 category_value = appsvc_get_category(service->data);
539 if (category_value != NULL)
541 *category = strdup(category_value);
548 return SERVICE_ERROR_NONE;
552 int service_set_package(service_h service, const char *package)
554 // TODO: this function must be deprecated
555 return service_set_app_id(service, package);
558 int service_get_package(service_h service, char **package)
560 // TODO: this function must be deprecated
561 return service_get_app_id(service, package);
565 int service_set_app_id(service_h service, const char *app_id)
567 if (service_valiate_service(service))
569 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
574 if (appsvc_set_appid(service->data, app_id) != 0)
576 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid application ID");
581 bundle_del(service->data, BUNDLE_KEY_PACKAGE);
584 return SERVICE_ERROR_NONE;
588 int service_get_app_id(service_h service, char **app_id)
590 const char *app_id_value;
592 if (service_valiate_service(service) || app_id == NULL)
594 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
597 app_id_value = appsvc_get_appid(service->data);
599 if (app_id_value != NULL)
601 *app_id = strdup(app_id_value);
608 return SERVICE_ERROR_NONE;
611 int service_set_window(service_h service, unsigned int id)
613 if (service_valiate_service(service))
615 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
620 if (appsvc_allow_transient_app(service->data, id) != 0)
622 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid id");
627 bundle_del(service->data, BUNDLE_KEY_WINDOW);
630 return SERVICE_ERROR_NONE;
633 int service_get_window(service_h service, unsigned int *id)
635 const char *window_id;
637 if (service_valiate_service(service) || id == NULL)
639 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
642 window_id = bundle_get_val(service->data, BUNDLE_KEY_WINDOW);
644 if (window_id != NULL)
646 *id = atoi(window_id);
653 return SERVICE_ERROR_NONE;
656 int service_clone(service_h *clone, service_h service)
658 service_h service_clone;
660 if (service_valiate_service(service) || clone == NULL)
662 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
665 service_clone = malloc(sizeof(struct service_s));
667 if (service_clone == NULL)
669 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
672 service_clone->id = service_new_id();
673 service_clone->type = service->type;
674 service_clone->data = bundle_dup(service->data);
676 *clone = service_clone;
678 return SERVICE_ERROR_NONE;
682 int service_send_launch_request(service_h service, service_reply_cb callback, void *user_data)
684 const char *operation;
687 bool implicit_default_operation = false;
690 service_request_context_h request_context = NULL;
692 if (service_valiate_service(service))
694 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
697 operation = appsvc_get_operation(service->data);
699 if (operation == NULL)
701 implicit_default_operation = true;
702 operation = SERVICE_OPERATION_DEFAULT;
705 appid = appsvc_get_appid(service->data);
707 // operation : default
708 if (!strcmp(operation, SERVICE_OPERATION_DEFAULT))
712 return service_error(SERVICE_ERROR_APP_NOT_FOUND, __FUNCTION__, "package must be specified if the operation is default value");
716 if (callback != NULL)
718 service_h request_clone = NULL;
720 request_context = calloc(1, sizeof(struct service_request_context_s));
722 if (request_context == NULL)
724 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
727 request_context->reply_cb = callback;
729 if (service_clone(&request_clone, service) != SERVICE_ERROR_NONE)
731 free(request_context);
732 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to clone the service request handle");
735 request_context->service = request_clone;
736 request_context->user_data = user_data;
739 if (implicit_default_operation == true)
741 appsvc_set_operation(service->data, SERVICE_OPERATION_DEFAULT);
744 launch_pid = appsvc_run_service(service->data, service->id, callback ? service_request_result_broker : NULL, request_context);
746 if (implicit_default_operation == true)
748 bundle_del(service->data, BUNDLE_KEY_OPERATION);
753 if (launch_pid == APPSVC_RET_ENOMATCH)
755 return service_error(SERVICE_ERROR_APP_NOT_FOUND, __FUNCTION__, NULL);
757 else if (launch_pid == APPSVC_RET_EILLACC)
759 return service_error(SERVICE_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
763 return service_error(SERVICE_ERROR_LAUNCH_REJECTED, __FUNCTION__, NULL);
767 service->launch_pid = launch_pid;
769 return SERVICE_ERROR_NONE;
773 int service_send_terminate_request(service_h service)
775 if (service_valiate_service(service))
777 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
780 if(service->type != SERVICE_TYPE_REQUEST || service->launch_pid < 0)
782 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
785 appsvc_subapp_terminate_request_pid(service->launch_pid);
787 return SERVICE_ERROR_NONE;
790 static bool service_copy_reply_data_cb(service_h service, const char *key, void *user_data)
792 bundle *reply_data = user_data;
794 char **value_array = NULL;
795 int value_array_length = 0;
796 int value_array_index = 0;
798 if (reply_data == NULL)
800 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
804 if (appsvc_data_is_array(service->data, key))
806 service_get_extra_data_array(service, key, &value_array, &value_array_length);
807 appsvc_add_data_array(reply_data, key, (const char**)value_array, value_array_length);
809 for (value_array_index=0; value_array_index < value_array_length; value_array_index++)
811 free(value_array[value_array_index]);
818 service_get_extra_data(service, key, &value);
819 appsvc_add_data(reply_data, key, value);
826 int service_reply_to_launch_request(service_h reply, service_h request, service_result_e result)
831 if (service_valiate_service(reply) || service_valiate_service(request))
833 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
836 if (appsvc_create_result_bundle(request->data, &reply_data) != 0)
838 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to create a result bundle");
841 service_foreach_extra_data(reply, service_copy_reply_data_cb, reply_data);
845 case SERVICE_RESULT_SUCCEEDED:
846 appsvc_result = APPSVC_RES_OK;
849 case SERVICE_RESULT_FAILED:
850 appsvc_result = APPSVC_RES_NOT_OK;
853 case SERVICE_RESULT_CANCELED:
854 appsvc_result = APPSVC_RES_CANCEL;
858 appsvc_result = APPSVC_RES_CANCEL;
862 appsvc_send_result(reply_data, appsvc_result);
864 return SERVICE_ERROR_NONE;
868 int service_add_extra_data(service_h service, const char *key, const char *value)
870 if (service_valiate_service(service) || service_validate_extra_data(key) || service_validate_extra_data(value))
872 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
875 if (service_validate_internal_key(key))
877 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
880 if (appsvc_get_data(service->data, key) != NULL)
882 // overwrite any existing value
883 bundle_del(service->data, key);
886 if (appsvc_add_data(service->data, key, value) != 0)
888 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "failed to add data to the appsvc handle");
891 return SERVICE_ERROR_NONE;
895 int service_add_extra_data_array(service_h service, const char *key, const char* value[], int length)
897 if (service_valiate_service(service) || service_validate_extra_data(key))
899 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
902 if (value == NULL || length <= 0)
904 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid array");
907 if (service_validate_internal_key(key))
909 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
912 if (appsvc_get_data_array(service->data, key, NULL) != NULL)
914 // overwrite any existing value
915 bundle_del(service->data,key);
918 if (appsvc_add_data_array(service->data, key, value, length) != 0)
920 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "failed to add array data to the appsvc handle");
923 return SERVICE_ERROR_NONE;
927 int service_remove_extra_data(service_h service, const char *key)
929 if (service_valiate_service(service) || service_validate_extra_data(key))
931 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
934 if (service_validate_internal_key(key))
936 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
939 if (bundle_del(service->data, key))
941 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
944 return SERVICE_ERROR_NONE;
948 int service_get_extra_data(service_h service, const char *key, char **value)
950 const char *data_value;
952 if (service_valiate_service(service) || service_validate_extra_data(key) || value == NULL)
954 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
958 if (service_validate_internal_key(key))
960 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
963 data_value = appsvc_get_data(service->data, key);
965 if (data_value == NULL)
967 if (errno == ENOTSUP)
969 return service_error(SERVICE_ERROR_INVALID_DATA_TYPE, __FUNCTION__, NULL);
973 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
977 *value = strdup(data_value);
979 return SERVICE_ERROR_NONE;
983 int service_get_extra_data_array(service_h service, const char *key, char ***value, int *length)
985 const char **array_data;
986 int array_data_length;
987 char **array_data_clone;
990 if (service_valiate_service(service) || service_validate_extra_data(key))
992 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
995 if (value == NULL || length == 0)
997 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1000 if (service_validate_internal_key(key))
1002 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
1005 array_data = appsvc_get_data_array(service->data, key, &array_data_length);
1007 if (array_data == NULL)
1009 if (errno == ENOTSUP)
1011 return service_error(SERVICE_ERROR_INVALID_DATA_TYPE, __FUNCTION__, NULL);
1015 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
1019 array_data_clone = calloc(array_data_length, sizeof(char*));
1021 if (array_data_clone == NULL)
1023 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1026 for (i=0; i<array_data_length; i++)
1028 if (array_data[i] != NULL)
1030 array_data_clone[i] = strdup(array_data[i]);
1034 *value = array_data_clone;
1035 *length = array_data_length;
1037 return SERVICE_ERROR_NONE;
1041 int service_is_extra_data_array(service_h service, const char *key, bool *array)
1043 if (service_valiate_service(service) || service_validate_extra_data(key) || array == NULL)
1045 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1048 if (service_validate_internal_key(key))
1050 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
1053 if (!appsvc_data_is_array(service->data, key))
1062 return SERVICE_ERROR_NONE;
1068 service_extra_data_cb callback;
1071 } foreach_context_extra_data_t;
1073 static void service_cb_broker_bundle_iterator(const char *key, const int type, const bundle_keyval_t *kv, void *user_data)
1075 foreach_context_extra_data_t* foreach_context = NULL;
1076 service_extra_data_cb extra_data_cb;
1078 if (key == NULL || !(type == BUNDLE_TYPE_STR || type == BUNDLE_TYPE_STR_ARRAY))
1083 foreach_context = (foreach_context_extra_data_t*)user_data;
1085 if (foreach_context->foreach_break == true)
1090 if (service_validate_internal_key(key))
1095 extra_data_cb = foreach_context->callback;
1097 if (extra_data_cb != NULL)
1099 bool stop_foreach = false;
1101 stop_foreach = !extra_data_cb(foreach_context->service, key, foreach_context->user_data);
1103 foreach_context->foreach_break = stop_foreach;
1109 int service_foreach_extra_data(service_h service, service_extra_data_cb callback, void *user_data)
1111 foreach_context_extra_data_t foreach_context = {
1113 .callback = callback,
1114 .user_data = user_data,
1115 .foreach_break = false
1118 if (service_valiate_service(service) || callback == NULL)
1120 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1123 bundle_foreach(service->data, service_cb_broker_bundle_iterator, &foreach_context);
1125 return SERVICE_ERROR_NONE;
1130 service_app_matched_cb callback;
1133 } foreach_context_launchable_app_t;
1135 int service_cb_broker_foreach_app_matched(const char *package, void *data)
1137 foreach_context_launchable_app_t *foreach_context;
1138 service_app_matched_cb app_matched_cb;
1140 if (package == NULL || data == NULL)
1142 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1146 foreach_context = (foreach_context_launchable_app_t*)data;
1148 if (foreach_context->foreach_break == true)
1153 app_matched_cb = foreach_context->callback;
1155 if (app_matched_cb != NULL)
1157 bool stop_foreach = false;
1159 stop_foreach = !app_matched_cb(foreach_context->service, package, foreach_context->user_data);
1161 foreach_context->foreach_break = stop_foreach;
1167 int service_foreach_app_matched(service_h service, service_app_matched_cb callback, void *user_data)
1169 foreach_context_launchable_app_t foreach_context = {
1171 .callback = callback,
1172 .user_data = user_data,
1173 .foreach_break = false
1176 if (service_valiate_service(service) || callback == NULL)
1178 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1181 appsvc_get_list(service->data, service_cb_broker_foreach_app_matched, &foreach_context);
1183 return SERVICE_ERROR_NONE;
1187 int service_get_caller(service_h service, char **package)
1189 const char *bundle_value;
1192 if (service_valiate_service(service) || package == NULL)
1194 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1197 if (service->type != SERVICE_TYPE_EVENT)
1199 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service handle type");
1202 bundle_value = bundle_get_val(service->data, AUL_K_CALLER_APPID);
1203 if (bundle_value == NULL)
1205 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to retrieve the appid of the caller");
1208 package_dup = strdup(bundle_value);
1210 if (package_dup == NULL)
1212 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1215 *package = package_dup;
1217 return SERVICE_ERROR_NONE;
1221 int service_is_reply_requested(service_h service, bool *requested)
1223 const char *bundle_value;
1225 if (service_valiate_service(service) || requested == NULL)
1227 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1230 if (service->type != SERVICE_TYPE_EVENT)
1232 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service handle type");
1235 bundle_value = bundle_get_val(service->data, AUL_K_WAIT_RESULT);
1237 if (bundle_value != NULL)
1246 return SERVICE_ERROR_NONE;
1249 int service_import_from_bundle(service_h service, bundle *data)
1251 bundle *data_dup = NULL;
1253 if (service_valiate_service(service) || data == NULL)
1255 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1258 data_dup = bundle_dup(data);
1260 if (data_dup == NULL)
1262 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to duplicate the bundle");
1265 if (service->data != NULL)
1267 bundle_free(service->data);
1270 service->data = data_dup;
1272 return SERVICE_ERROR_NONE;
1275 int service_export_as_bundle(service_h service, bundle **data)
1277 bundle *data_dup = NULL;
1279 if (service_valiate_service(service) || data == NULL)
1281 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1284 data_dup = bundle_dup(service->data);
1286 if (data_dup == NULL)
1288 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to duplicate the bundle");
1293 return SERVICE_ERROR_NONE;
1297 int service_request_transient_app(service_h service, unsigned int callee_id, service_host_res_fn cbfunc, void *data)
1301 if (service_valiate_service(service))
1303 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1306 ret = appsvc_request_transient_app(service->data, callee_id, (appsvc_host_res_fn)cbfunc, data);
1310 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1313 return SERVICE_ERROR_NONE;