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__"
65 typedef struct service_request_context_s {
67 service_reply_cb reply_cb;
69 } *service_request_context_h;
71 extern int appsvc_allow_transient_app(bundle *b, unsigned int id);
73 static int service_create_reply(bundle *data, struct service_s **service);
75 static const char* service_error_to_string(service_error_e error)
79 case SERVICE_ERROR_NONE:
82 case SERVICE_ERROR_INVALID_PARAMETER:
83 return "INVALID_PARAMETER";
85 case SERVICE_ERROR_OUT_OF_MEMORY:
86 return "OUT_OF_MEMORY";
88 case SERVICE_ERROR_APP_NOT_FOUND:
89 return "APP_NOT_FOUND";
91 case SERVICE_ERROR_KEY_NOT_FOUND:
92 return "KEY_NOT_FOUND";
94 case SERVICE_ERROR_KEY_REJECTED:
95 return "KEY_REJECTED";
97 case SERVICE_ERROR_INVALID_DATA_TYPE:
98 return "INVALID_DATA_TYPE";
100 case SERVICE_ERROR_LAUNCH_REJECTED:
101 return "LAUNCH_REJECTED";
108 int service_error(service_error_e error, const char* function, const char *description)
112 LOGE("[%s] %s(0x%08x) : %s", function, service_error_to_string(error), error, description);
116 LOGE("[%s] %s(0x%08x)", function, service_error_to_string(error), error);
122 static int service_validate_extra_data(const char *data)
124 if (data == NULL || data[0] == '\0')
126 return SERVICE_ERROR_INVALID_PARAMETER;
129 return SERVICE_ERROR_NONE;
132 static int service_valiate_service(service_h service)
134 if (service == NULL || service->data == NULL)
136 return SERVICE_ERROR_INVALID_PARAMETER;
139 return SERVICE_ERROR_NONE;
142 static int service_new_id()
148 int service_validate_internal_key(const char *key)
150 if (strncmp(BUNDLE_KEY_PREFIX_AUL, key, strlen(BUNDLE_KEY_PREFIX_AUL)) == 0)
155 if (strncmp(BUNDLE_KEY_PREFIX_SERVICE, key, strlen(BUNDLE_KEY_PREFIX_SERVICE)) == 0)
163 static void service_request_result_broker(bundle *appsvc_bundle, int appsvc_request_code, appsvc_result_val appsvc_result, void *appsvc_data)
165 service_request_context_h request_context;
167 service_h reply = NULL;
168 service_result_e result;
170 service_reply_cb reply_cb;
172 if (appsvc_data == NULL)
174 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service reply");
178 if (service_create_reply(appsvc_bundle, &reply) != 0)
180 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to create service reply");
184 request_context = appsvc_data;
185 request = request_context->service;
187 switch (appsvc_result)
190 result = SERVICE_RESULT_SUCCEEDED;
193 case APPSVC_RES_NOT_OK:
194 result = SERVICE_RESULT_FAILED;
197 case APPSVC_RES_CANCEL:
198 result = SERVICE_RESULT_CANCELED;
202 result = SERVICE_RESULT_CANCELED;
206 user_data = request_context->user_data;
207 reply_cb = request_context->reply_cb;
209 if (reply_cb != NULL)
211 reply_cb(request, reply, result, user_data);
215 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid callback ");
218 service_destroy(reply);
220 if (request_context->service != NULL)
222 service_destroy(request_context->service);
225 free(request_context);
229 int service_create(service_h *service)
231 return service_create_request(NULL, service);
234 int service_create_request(bundle *data, service_h *service)
236 struct service_s *service_request;
240 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
243 service_request = malloc(sizeof(struct service_s));
245 if (service_request == NULL)
247 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
250 service_request->type = SERVICE_TYPE_REQUEST;
254 service_request->data = bundle_dup(data);
258 service_request->data = bundle_create();
261 if (service_request->data == NULL)
263 free(service_request);
264 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a bundle");
267 service_request->id = service_new_id();
269 *service = service_request;
271 return SERVICE_ERROR_NONE;
274 int service_create_event(bundle *data, struct service_s **service)
276 struct service_s *service_event;
278 const char *operation;
280 if (data == NULL || service == NULL)
282 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
285 service_event = malloc(sizeof(struct service_s));
287 if (service_event == NULL)
289 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
292 service_event->type = SERVICE_TYPE_EVENT;
293 service_event->data = bundle_dup(data);
294 service_event->id = service_new_id();
296 operation = appsvc_get_operation(service_event->data);
298 if (operation == NULL)
300 appsvc_set_operation(service_event->data, SERVICE_OPERATION_DEFAULT);
303 *service = service_event;
305 return SERVICE_ERROR_NONE;
308 static int service_create_reply(bundle *data, struct service_s **service)
310 struct service_s *service_reply;
312 if (data == NULL || service == NULL)
314 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
317 service_reply = malloc(sizeof(struct service_s));
319 if (service_reply == NULL)
321 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
324 service_reply->type = SERVICE_TYPE_REPLY;
325 service_reply->data = bundle_dup(data);
326 service_reply->id = service_new_id();
328 *service = service_reply;
330 return SERVICE_ERROR_NONE;
333 int service_destroy(service_h service)
335 if (service_valiate_service(service))
337 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
340 bundle_free(service->data);
341 service->data = NULL;
344 return SERVICE_ERROR_NONE;
347 int service_to_bundle(service_h service, bundle **data)
349 if (service_valiate_service(service) || data == NULL)
351 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
354 *data = service->data;
356 return SERVICE_ERROR_NONE;
359 int service_set_operation(service_h service, const char *operation)
361 if (service_valiate_service(service))
363 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
366 if (operation != NULL)
368 if (appsvc_set_operation(service->data, operation) != 0)
370 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid operation");
375 bundle_del(service->data, BUNDLE_KEY_OPERATION);
378 return SERVICE_ERROR_NONE;
381 int service_get_operation(service_h service, char **operation)
383 const char *operation_value;
385 if (service_valiate_service(service) || operation == NULL)
387 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
390 operation_value = appsvc_get_operation(service->data);
392 if (operation_value != NULL)
394 *operation = strdup(operation_value);
401 return SERVICE_ERROR_NONE;
405 int service_set_uri(service_h service, const char *uri)
407 if (service_valiate_service(service))
409 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
414 if (appsvc_set_uri(service->data, uri) != 0)
416 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid URI");
421 bundle_del(service->data, BUNDLE_KEY_URI);
424 return SERVICE_ERROR_NONE;
428 int service_get_uri(service_h service, char **uri)
430 const char *uri_value;
432 if (service_valiate_service(service) || uri == NULL)
434 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
437 uri_value = appsvc_get_uri(service->data);
439 if (uri_value != NULL)
441 *uri = strdup(uri_value);
448 return SERVICE_ERROR_NONE;
452 int service_set_mime(service_h service, const char *mime)
454 if (service_valiate_service(service))
456 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
461 if (appsvc_set_mime(service->data, mime) != 0)
463 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid MIME type");
468 bundle_del(service->data, BUNDLE_KEY_MIME);
471 return SERVICE_ERROR_NONE;
475 int service_get_mime(service_h service, char **mime)
477 const char *mime_value;
479 if (service_valiate_service(service) || mime == NULL)
481 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
484 mime_value = appsvc_get_mime(service->data);
486 if (mime_value != NULL)
488 *mime = strdup(mime_value);
495 return SERVICE_ERROR_NONE;
499 int service_set_category(service_h service, const char *category)
501 if (service_valiate_service(service))
503 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
506 if (category != NULL)
508 if (appsvc_set_category(service->data, category) != 0)
510 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid MIME type");
515 bundle_del(service->data, BUNDLE_KEY_MIME);
518 return SERVICE_ERROR_NONE;
522 int service_get_category(service_h service, char **category)
524 const char *category_value;
526 if (service_valiate_service(service) || category == NULL)
528 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
531 category_value = appsvc_get_category(service->data);
533 if (category_value != NULL)
535 *category = strdup(category_value);
542 return SERVICE_ERROR_NONE;
546 int service_set_package(service_h service, const char *package)
548 // TODO: this function must be deprecated
549 return service_set_app_id(service, package);
552 int service_get_package(service_h service, char **package)
554 // TODO: this function must be deprecated
555 return service_get_app_id(service, package);
559 int service_set_app_id(service_h service, const char *app_id)
561 if (service_valiate_service(service))
563 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
568 if (appsvc_set_appid(service->data, app_id) != 0)
570 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid application ID");
575 bundle_del(service->data, BUNDLE_KEY_PACKAGE);
578 return SERVICE_ERROR_NONE;
582 int service_get_app_id(service_h service, char **app_id)
584 const char *app_id_value;
586 if (service_valiate_service(service) || app_id == NULL)
588 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
591 app_id_value = appsvc_get_appid(service->data);
593 if (app_id_value != NULL)
595 *app_id = strdup(app_id_value);
602 return SERVICE_ERROR_NONE;
605 int service_set_window(service_h service, unsigned int id)
607 if (service_valiate_service(service))
609 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
614 if (appsvc_allow_transient_app(service->data, id) != 0)
616 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid id");
621 bundle_del(service->data, BUNDLE_KEY_WINDOW);
624 return SERVICE_ERROR_NONE;
627 int service_get_window(service_h service, unsigned int *id)
629 const char *window_id;
631 if (service_valiate_service(service) || id == NULL)
633 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
636 window_id = bundle_get_val(service->data, BUNDLE_KEY_WINDOW);
638 if (window_id != NULL)
640 *id = atoi(window_id);
647 return SERVICE_ERROR_NONE;
650 int service_clone(service_h *clone, service_h service)
652 service_h service_clone;
654 if (service_valiate_service(service) || clone == NULL)
656 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
659 service_clone = malloc(sizeof(struct service_s));
661 if (service_clone == NULL)
663 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, "failed to create a service handle");
666 service_clone->id = service_new_id();
667 service_clone->type = service->type;
668 service_clone->data = bundle_dup(service->data);
670 *clone = service_clone;
672 return SERVICE_ERROR_NONE;
676 int service_send_launch_request(service_h service, service_reply_cb callback, void *user_data)
678 const char *operation;
681 bool implicit_default_operation = false;
684 service_request_context_h request_context = NULL;
686 if (service_valiate_service(service))
688 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
691 operation = appsvc_get_operation(service->data);
693 if (operation == NULL)
695 implicit_default_operation = true;
696 operation = SERVICE_OPERATION_DEFAULT;
699 appid = appsvc_get_appid(service->data);
701 // operation : default
702 if (!strcmp(operation, SERVICE_OPERATION_DEFAULT))
706 return service_error(SERVICE_ERROR_APP_NOT_FOUND, __FUNCTION__, "package must be specified if the operation is default value");
710 if (callback != NULL)
712 service_h request_clone = NULL;
714 request_context = calloc(1, sizeof(struct service_request_context_s));
716 if (request_context == NULL)
718 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
721 request_context->reply_cb = callback;
723 if (service_clone(&request_clone, service) != SERVICE_ERROR_NONE)
725 free(request_context);
726 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to clone the service request handle");
729 request_context->service = request_clone;
730 request_context->user_data = user_data;
733 if (implicit_default_operation == true)
735 appsvc_set_operation(service->data, SERVICE_OPERATION_DEFAULT);
738 launch_pid = appsvc_run_service(service->data, service->id, callback ? service_request_result_broker : NULL, request_context);
740 if (implicit_default_operation == true)
742 bundle_del(service->data, BUNDLE_KEY_OPERATION);
747 if (launch_pid == APPSVC_RET_ENOMATCH)
749 return service_error(SERVICE_ERROR_APP_NOT_FOUND, __FUNCTION__, NULL);
753 return service_error(SERVICE_ERROR_LAUNCH_REJECTED, __FUNCTION__, NULL);
757 return SERVICE_ERROR_NONE;
760 static bool service_copy_reply_data_cb(service_h service, const char *key, void *user_data)
762 bundle *reply_data = user_data;
764 char **value_array = NULL;
765 int value_array_length = 0;
766 int value_array_index = 0;
768 if (reply_data == NULL)
770 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
774 if (appsvc_data_is_array(service->data, key))
776 service_get_extra_data_array(service, key, &value_array, &value_array_length);
777 appsvc_add_data_array(reply_data, key, (const char**)value_array, value_array_length);
779 for (value_array_index=0; value_array_index < value_array_length; value_array_index++)
781 free(value_array[value_array_index]);
788 service_get_extra_data(service, key, &value);
789 appsvc_add_data(reply_data, key, value);
796 int service_reply_to_launch_request(service_h reply, service_h request, service_result_e result)
801 if (service_valiate_service(reply) || service_valiate_service(request))
803 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
806 if (appsvc_create_result_bundle(request->data, &reply_data) != 0)
808 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to create a result bundle");
811 service_foreach_extra_data(reply, service_copy_reply_data_cb, reply_data);
815 case SERVICE_RESULT_SUCCEEDED:
816 appsvc_result = APPSVC_RES_OK;
819 case SERVICE_RESULT_FAILED:
820 appsvc_result = APPSVC_RES_NOT_OK;
823 case SERVICE_RESULT_CANCELED:
824 appsvc_result = APPSVC_RES_CANCEL;
828 appsvc_result = APPSVC_RES_CANCEL;
832 appsvc_send_result(reply_data, appsvc_result);
834 return SERVICE_ERROR_NONE;
838 int service_add_extra_data(service_h service, const char *key, const char *value)
840 if (service_valiate_service(service) || service_validate_extra_data(key) || service_validate_extra_data(value))
842 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
845 if (service_validate_internal_key(key))
847 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
850 if (appsvc_get_data(service->data, key) != NULL)
852 // overwrite any existing value
853 bundle_del(service->data, key);
856 if (appsvc_add_data(service->data, key, value) != 0)
858 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "failed to add data to the appsvc handle");
861 return SERVICE_ERROR_NONE;
865 int service_add_extra_data_array(service_h service, const char *key, const char* value[], int length)
867 if (service_valiate_service(service) || service_validate_extra_data(key))
869 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
872 if (value == NULL || length <= 0)
874 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid array");
877 if (service_validate_internal_key(key))
879 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
882 if (appsvc_get_data_array(service->data, key, NULL) != NULL)
884 // overwrite any existing value
885 bundle_del(service->data,key);
888 if (appsvc_add_data_array(service->data, key, value, length) != 0)
890 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "failed to add array data to the appsvc handle");
893 return SERVICE_ERROR_NONE;
897 int service_remove_extra_data(service_h service, const char *key)
899 if (service_valiate_service(service) || service_validate_extra_data(key))
901 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
904 if (service_validate_internal_key(key))
906 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
909 if (bundle_del(service->data, key))
911 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
914 return SERVICE_ERROR_NONE;
918 int service_get_extra_data(service_h service, const char *key, char **value)
920 const char *data_value;
922 if (service_valiate_service(service) || service_validate_extra_data(key) || value == NULL)
924 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
928 if (service_validate_internal_key(key))
930 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
933 data_value = appsvc_get_data(service->data, key);
935 if (data_value == NULL)
937 if (errno == ENOTSUP)
939 return service_error(SERVICE_ERROR_INVALID_DATA_TYPE, __FUNCTION__, NULL);
943 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
947 *value = strdup(data_value);
949 return SERVICE_ERROR_NONE;
953 int service_get_extra_data_array(service_h service, const char *key, char ***value, int *length)
955 const char **array_data;
956 int array_data_length;
957 char **array_data_clone;
960 if (service_valiate_service(service) || service_validate_extra_data(key))
962 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
965 if (value == NULL || length == 0)
967 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
970 if (service_validate_internal_key(key))
972 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
975 array_data = appsvc_get_data_array(service->data, key, &array_data_length);
977 if (array_data == NULL)
979 if (errno == ENOTSUP)
981 return service_error(SERVICE_ERROR_INVALID_DATA_TYPE, __FUNCTION__, NULL);
985 return service_error(SERVICE_ERROR_KEY_NOT_FOUND, __FUNCTION__, NULL);
989 array_data_clone = calloc(array_data_length, sizeof(char*));
991 if (array_data_clone == NULL)
993 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
996 for (i=0; i<array_data_length; i++)
998 if (array_data[i] != NULL)
1000 array_data_clone[i] = strdup(array_data[i]);
1004 *value = array_data_clone;
1005 *length = array_data_length;
1007 return SERVICE_ERROR_NONE;
1011 int service_is_extra_data_array(service_h service, const char *key, bool *array)
1013 if (service_valiate_service(service) || service_validate_extra_data(key) || array == NULL)
1015 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1018 if (service_validate_internal_key(key))
1020 return service_error(SERVICE_ERROR_KEY_REJECTED, __FUNCTION__, "the given key is reserved as internal use");
1023 if (!appsvc_data_is_array(service->data, key))
1032 return SERVICE_ERROR_NONE;
1038 service_extra_data_cb callback;
1041 } foreach_context_extra_data_t;
1043 static void service_cb_broker_bundle_iterator(const char *key, const int type, const bundle_keyval_t *kv, void *user_data)
1045 foreach_context_extra_data_t* foreach_context = NULL;
1046 service_extra_data_cb extra_data_cb;
1048 if (key == NULL || !(type == BUNDLE_TYPE_STR || type == BUNDLE_TYPE_STR_ARRAY))
1053 foreach_context = (foreach_context_extra_data_t*)user_data;
1055 if (foreach_context->foreach_break == true)
1060 if (service_validate_internal_key(key))
1065 extra_data_cb = foreach_context->callback;
1067 if (extra_data_cb != NULL)
1069 bool stop_foreach = false;
1071 stop_foreach = !extra_data_cb(foreach_context->service, key, foreach_context->user_data);
1073 foreach_context->foreach_break = stop_foreach;
1079 int service_foreach_extra_data(service_h service, service_extra_data_cb callback, void *user_data)
1081 foreach_context_extra_data_t foreach_context = {
1083 .callback = callback,
1084 .user_data = user_data,
1085 .foreach_break = false
1088 if (service_valiate_service(service) || callback == NULL)
1090 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1093 bundle_foreach(service->data, service_cb_broker_bundle_iterator, &foreach_context);
1095 return SERVICE_ERROR_NONE;
1100 service_app_matched_cb callback;
1103 } foreach_context_launchable_app_t;
1105 int service_cb_broker_foreach_app_matched(const char *package, void *data)
1107 foreach_context_launchable_app_t *foreach_context;
1108 service_app_matched_cb app_matched_cb;
1110 if (package == NULL || data == NULL)
1112 service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1116 foreach_context = (foreach_context_launchable_app_t*)data;
1118 if (foreach_context->foreach_break == true)
1123 app_matched_cb = foreach_context->callback;
1125 if (app_matched_cb != NULL)
1127 bool stop_foreach = false;
1129 stop_foreach = !app_matched_cb(foreach_context->service, package, foreach_context->user_data);
1131 foreach_context->foreach_break = stop_foreach;
1137 int service_foreach_app_matched(service_h service, service_app_matched_cb callback, void *user_data)
1139 foreach_context_launchable_app_t foreach_context = {
1141 .callback = callback,
1142 .user_data = user_data,
1143 .foreach_break = false
1146 if (service_valiate_service(service) || callback == NULL)
1148 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1151 appsvc_get_list(service->data, service_cb_broker_foreach_app_matched, &foreach_context);
1153 return SERVICE_ERROR_NONE;
1157 int service_get_caller(service_h service, char **package)
1159 const char *bundle_value;
1161 char package_buf[TIZEN_PATH_MAX] = {0, };
1164 if (service_valiate_service(service) || package == NULL)
1166 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1169 if (service->type != SERVICE_TYPE_EVENT)
1171 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service handle type");
1174 bundle_value = bundle_get_val(service->data, AUL_K_ORG_CALLER_PID);
1176 if (bundle_value == NULL)
1178 bundle_value = bundle_get_val(service->data, AUL_K_CALLER_PID);
1181 if (bundle_value == NULL)
1183 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to retrieve the pid of the caller");
1186 caller_pid = atoi(bundle_value);
1188 if (caller_pid <= 0)
1190 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid pid of the caller");
1193 if (aul_app_get_appid_bypid(caller_pid, package_buf, sizeof(package_buf)) != AUL_R_OK)
1195 return service_error(SERVICE_ERROR_APP_NOT_FOUND, __FUNCTION__, "failed to get the package name of the caller");
1198 package_dup = strdup(package_buf);
1200 if (package_dup == NULL)
1202 return service_error(SERVICE_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1205 *package = package_dup;
1207 return SERVICE_ERROR_NONE;
1211 int service_is_reply_requested(service_h service, bool *requested)
1213 const char *bundle_value;
1215 if (service_valiate_service(service) || requested == NULL)
1217 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1220 if (service->type != SERVICE_TYPE_EVENT)
1222 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "invalid service handle type");
1225 bundle_value = bundle_get_val(service->data, AUL_K_WAIT_RESULT);
1227 if (bundle_value != NULL)
1236 return SERVICE_ERROR_NONE;
1239 int service_import_from_bundle(service_h service, bundle *data)
1241 bundle *data_dup = NULL;
1243 if (service_valiate_service(service) || data == NULL)
1245 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1248 data_dup = bundle_dup(data);
1250 if (data_dup == NULL)
1252 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to duplicate the bundle");
1255 if (service->data != NULL)
1257 bundle_free(service->data);
1260 service->data = data_dup;
1262 return SERVICE_ERROR_NONE;
1265 int service_export_as_bundle(service_h service, bundle **data)
1267 bundle *data_dup = NULL;
1269 if (service_valiate_service(service) || data == NULL)
1271 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1274 data_dup = bundle_dup(service->data);
1276 if (data_dup == NULL)
1278 return service_error(SERVICE_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to duplicate the bundle");
1283 return SERVICE_ERROR_NONE;