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>
35 #define LOG_TAG "TIZEN_N_SERVICE"
37 #define BUNDLE_KEY_PREFIX_AUL "__AUL_"
38 #define BUNDLE_KEY_PREFIX_SERVICE "__APP_SVC_"
40 #define BUNDLE_KEY_OPERATION "__APP_SVC_OP_TYPE__"
41 #define BUNDLE_KEY_URI "__APP_SVC_URI__"
42 #define BUNDLE_KEY_MIME "__APP_SVC_MIME_TYPE__"
43 #define BUNDLE_KEY_DATA "__APP_SVC_DATA__"
44 #define BUNDLE_KEY_PACKAGE "__APP_SVC_PKG_NAME__"
58 typedef struct service_request_context_s {
60 service_reply_cb reply_cb;
62 } *service_request_context_h;
64 static int service_create_request(service_h *service);
66 static int service_create_reply(bundle *data, struct service_s **service);
68 static int service_validate_extra_data(const char *data)
70 if (data == NULL || data[0] == '\0')
72 return SERVICE_ERROR_INVALID_PARAMETER;
75 return SERVICE_ERROR_NONE;
78 static int service_valiate_service(service_h service)
80 if (service == NULL || service->data == NULL)
82 return SERVICE_ERROR_INVALID_PARAMETER;
85 return SERVICE_ERROR_NONE;
88 static int service_new_id()
94 int service_validate_internal_key(const char *key)
96 if (strncmp(BUNDLE_KEY_PREFIX_AUL, key, strlen(BUNDLE_KEY_PREFIX_AUL)) == 0)
101 if (strncmp(BUNDLE_KEY_PREFIX_SERVICE, key, strlen(BUNDLE_KEY_PREFIX_SERVICE)) == 0)
109 static void service_request_result_broker(bundle *appsvc_bundle, int appsvc_request_code, appsvc_result_val appsvc_result, void *appsvc_data)
111 service_request_context_h request_context;
114 service_result_e result;
116 service_reply_cb reply_cb;
118 if (appsvc_data == NULL)
120 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid service reply", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
124 if (service_create_reply(appsvc_bundle, &reply) != 0)
126 LOGE("[%s] INVALID_PARAMETER(0x%08x) : failed to create service reply", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
130 request_context = appsvc_data;
131 request = request_context->service;
133 switch (appsvc_result)
136 result = SERVICE_RESULT_SUCCEEDED;
139 case APPSVC_RES_NOT_OK:
140 result = SERVICE_RESULT_FAILED;
143 case APPSVC_RES_CANCEL:
144 result = SERVICE_RESULT_CANCELED;
148 result = SERVICE_RESULT_CANCELED;
152 user_data = request_context->user_data;
154 reply_cb = request_context->reply_cb;
156 if (reply_cb != NULL)
158 reply_cb(request, reply, result, user_data);
162 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
168 int service_create(service_h *service)
170 return service_create_request(service);
173 static int service_create_request(service_h *service)
175 struct service_s *service_request;
179 LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
180 return SERVICE_ERROR_INVALID_PARAMETER;
183 service_request = malloc(sizeof(struct service_s));
185 if (service_request == NULL)
187 LOGE("[%s] OUT_OF_MEMORY(0x%08x) : failed to create a service handle", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
188 return SERVICE_ERROR_OUT_OF_MEMORY;
191 service_request->type = SERVICE_TYPE_USER;
193 service_request->data = bundle_create();
195 if (service_request->data == NULL)
197 free(service_request);
198 LOGE("[%s] OUT_OF_MEMORY(0x%08x) : failed to create a bundle handle", __FUNCTION__);
199 return SERVICE_ERROR_OUT_OF_MEMORY;
202 service_request->id = service_new_id();
204 *service = service_request;
206 return SERVICE_ERROR_NONE;
209 int service_create_event(bundle *data, struct service_s **service)
211 struct service_s *service_event;
213 const char *operation;
215 if (data == NULL || service == NULL)
217 LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
218 return SERVICE_ERROR_INVALID_PARAMETER;
221 service_event = malloc(sizeof(struct service_s));
223 if (service_event == NULL)
225 LOGE("[%s] OUT_OF_MEMORY(0x%08x) : failed to create a service handle", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
226 return SERVICE_ERROR_OUT_OF_MEMORY;
229 service_event->type = SERVICE_TYPE_EVENT;
230 service_event->data = bundle_dup(data);
231 service_event->id = service_new_id();
233 operation = appsvc_get_operation(service_event->data);
235 if (operation == NULL)
237 appsvc_set_operation(service_event->data, SERVICE_OPERATION_DEFAULT);
240 *service = service_event;
242 return SERVICE_ERROR_NONE;
245 int service_impl_create_event(bundle *data, struct service_s **service)
247 return service_create_event(data, service);
250 static int service_create_reply(bundle *data, struct service_s **service)
252 struct service_s *service_reply;
254 if (data == NULL || service == NULL)
256 LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
257 return SERVICE_ERROR_INVALID_PARAMETER;
260 service_reply = malloc(sizeof(struct service_s));
262 if (service_reply == NULL)
264 LOGE("[%s] OUT_OF_MEMORY(0x%08x) : failed to create a service handle", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
265 return SERVICE_ERROR_OUT_OF_MEMORY;
268 service_reply->type = SERVICE_TYPE_REPLY;
269 service_reply->data = bundle_dup(data);
270 service_reply->id = service_new_id();
272 *service = service_reply;
274 return SERVICE_ERROR_NONE;
277 int service_destroy(service_h service)
279 if (service_valiate_service(service))
281 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
282 return SERVICE_ERROR_INVALID_PARAMETER;
285 bundle_free(service->data);
286 service->data = NULL;
289 return SERVICE_ERROR_NONE;
292 int service_to_bundle(service_h service, bundle **data)
294 if (service_valiate_service(service))
296 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
297 return SERVICE_ERROR_INVALID_PARAMETER;
302 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
303 return SERVICE_ERROR_INVALID_PARAMETER;
306 *data = service->data;
308 return SERVICE_ERROR_NONE;
311 int service_set_operation(service_h service, const char *operation)
313 if (service_valiate_service(service))
315 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
316 return SERVICE_ERROR_INVALID_PARAMETER;
319 if (operation != NULL)
321 if (appsvc_set_operation(service->data, operation) != 0)
323 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid operation", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
324 return SERVICE_ERROR_INVALID_PARAMETER;
329 bundle_del(service->data, BUNDLE_KEY_OPERATION);
332 return SERVICE_ERROR_NONE;
335 int service_get_operation(service_h service, char **operation)
337 const char *operation_value;
339 if (service_valiate_service(service))
341 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
342 return SERVICE_ERROR_INVALID_PARAMETER;
345 if (operation == NULL)
347 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid operation", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
348 return SERVICE_ERROR_INVALID_PARAMETER;
351 operation_value = appsvc_get_operation(service->data);
353 if (operation_value != NULL)
355 *operation = strdup(operation_value);
362 return SERVICE_ERROR_NONE;
366 int service_set_uri(service_h service, const char *uri)
368 if (service_valiate_service(service))
370 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
371 return SERVICE_ERROR_INVALID_PARAMETER;
376 if (appsvc_set_uri(service->data, uri) != 0)
378 LOGE("[%s] INVALID_PARAMETER(0x%08x : invalid URI)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
379 return SERVICE_ERROR_INVALID_PARAMETER;
384 bundle_del(service->data, BUNDLE_KEY_URI);
387 return SERVICE_ERROR_NONE;
391 int service_get_uri(service_h service, char **uri)
393 const char *uri_value;
395 if (service_valiate_service(service))
397 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
398 return SERVICE_ERROR_INVALID_PARAMETER;
403 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid URI", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
404 return SERVICE_ERROR_INVALID_PARAMETER;
407 uri_value = appsvc_get_uri(service->data);
409 if (uri_value != NULL)
411 *uri = strdup(uri_value);
418 return SERVICE_ERROR_NONE;
422 int service_set_mime(service_h service, const char *mime)
424 if (service_valiate_service(service))
426 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
427 return SERVICE_ERROR_INVALID_PARAMETER;
432 if (appsvc_set_mime(service->data, mime) != 0)
434 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid MIME type", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
435 return SERVICE_ERROR_INVALID_PARAMETER;
440 bundle_del(service->data, BUNDLE_KEY_MIME);
443 return SERVICE_ERROR_NONE;
447 int service_get_mime(service_h service, char **mime)
449 const char *mime_value;
451 if (service_valiate_service(service))
453 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
454 return SERVICE_ERROR_INVALID_PARAMETER;
459 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid MIME type", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
460 return SERVICE_ERROR_INVALID_PARAMETER;
463 mime_value = appsvc_get_mime(service->data);
465 if (mime_value != NULL)
467 *mime = strdup(mime_value);
474 return SERVICE_ERROR_NONE;
478 int service_set_package(service_h service, const char *package)
480 if (service_valiate_service(service))
482 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
483 return SERVICE_ERROR_INVALID_PARAMETER;
488 if (appsvc_set_pkgname(service->data, package) != 0)
490 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
491 return SERVICE_ERROR_INVALID_PARAMETER;
496 bundle_del(service->data, BUNDLE_KEY_PACKAGE);
499 return SERVICE_ERROR_NONE;
502 int service_get_package(service_h service, char **package)
504 const char *package_value;
506 if (service_valiate_service(service))
508 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
509 return SERVICE_ERROR_INVALID_PARAMETER;
514 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
515 return SERVICE_ERROR_INVALID_PARAMETER;
518 package_value = appsvc_get_pkgname(service->data);
520 if (package_value != NULL)
522 *package = strdup(package_value);
529 return SERVICE_ERROR_NONE;
532 int service_clone(service_h *clone, service_h service)
534 service_h service_clone;
536 if (service_valiate_service(service))
538 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
539 return SERVICE_ERROR_INVALID_PARAMETER;
544 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
545 return SERVICE_ERROR_INVALID_PARAMETER;
548 service_clone = malloc(sizeof(struct service_s));
550 if (service_clone == NULL)
552 LOGE("[%s] OUT_OF_MEMORY(0x%08x) : failed to create a service handle", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
553 return SERVICE_ERROR_OUT_OF_MEMORY;
556 service_clone->id = service_new_id();
557 service_clone->type = service->type;
558 service_clone->data = bundle_dup(service->data);
560 *clone = service_clone;
562 return SERVICE_ERROR_NONE;
566 int service_send_launch_request(service_h service, service_reply_cb callback, void *user_data)
568 const char *operation;
573 bool implicit_default_operation = false;
576 if (service_valiate_service(service))
578 LOGE("[%s] INVALID_PARAMETER : invalid handle", __FUNCTION__);
579 return SERVICE_ERROR_INVALID_PARAMETER;
582 operation = appsvc_get_operation(service->data);
584 if (operation == NULL)
586 implicit_default_operation = true;
587 operation = SERVICE_OPERATION_DEFAULT;
590 uri = appsvc_get_uri(service->data);
591 mime = appsvc_get_mime(service->data);
592 package = appsvc_get_pkgname(service->data);
594 // operation : default
595 if (!strcmp(operation, SERVICE_OPERATION_DEFAULT))
597 if (package == NULL || package[0] == '\0')
599 LOGE("[%s] APP_NOT_FOUND(0x%08x) : package must be specified if the operation is default", __FUNCTION__, SERVICE_ERROR_APP_NOT_FOUND);
600 return SERVICE_ERROR_APP_NOT_FOUND;
604 if (package != NULL && package[0] != '\0')
606 if (aul_app_is_running(package))
608 if (aul_open_app(package) <= 0)
610 LOGE("[%s] APP_NOT_FOUND(0x%08x) : resume the application(%s)", __FUNCTION__, SERVICE_ERROR_APP_NOT_FOUND, package);
611 return SERVICE_ERROR_APP_NOT_FOUND;
616 service_request_context_h request_context = NULL;
618 if (callback != NULL)
620 request_context = calloc(1, sizeof(struct service_request_context_s));
621 // request_context will be deallocated from service_request_result_broker()
623 if (request_context == NULL)
625 LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
626 return SERVICE_ERROR_OUT_OF_MEMORY;
629 request_context->reply_cb = callback;
630 request_context->service = service;
631 request_context->user_data = user_data;
634 if (implicit_default_operation == true)
636 appsvc_set_operation(service->data, SERVICE_OPERATION_DEFAULT);
639 launch_pid = appsvc_run_service(service->data, service->id, callback ? service_request_result_broker : NULL, request_context);
641 if (implicit_default_operation == true)
643 bundle_del(service->data, BUNDLE_KEY_OPERATION);
648 LOGE("[%s] APP_NOT_FOUND(0x%08x) : operation(%s) package(%s) uri(%s) mime(%s)",
649 __FUNCTION__, SERVICE_ERROR_APP_NOT_FOUND, operation, package, uri, mime);
650 return SERVICE_ERROR_APP_NOT_FOUND;
653 return SERVICE_ERROR_NONE;
656 static bool service_copy_reply_data_cb(service_h service, const char *key, void *user_data)
661 if (user_data == NULL)
663 LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
667 reply_data = user_data;
669 service_get_extra_data(service, key, &value);
671 appsvc_add_data(reply_data, key, value);
676 int service_reply_to_launch_request(service_h reply, service_h request, service_result_e result)
681 if (service_valiate_service(reply))
683 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid reply handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
684 return SERVICE_ERROR_INVALID_PARAMETER;
687 if (service_valiate_service(request))
689 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid request handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
690 return SERVICE_ERROR_INVALID_PARAMETER;
693 if (appsvc_create_result_bundle(request->data, &reply_data) != 0)
695 LOGE("[%s] INVALID_PARAMETER(0x%08x) : failed to create result bundle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
696 return SERVICE_ERROR_INVALID_PARAMETER;
699 service_foreach_extra_data(reply, service_copy_reply_data_cb, reply_data);
703 case SERVICE_RESULT_SUCCEEDED:
704 appsvc_result = APPSVC_RES_OK;
707 case SERVICE_RESULT_FAILED:
708 appsvc_result = APPSVC_RES_NOT_OK;
711 case SERVICE_RESULT_CANCELED:
712 appsvc_result = APPSVC_RES_CANCEL;
716 appsvc_result = APPSVC_RES_CANCEL;
720 appsvc_send_result(reply_data, appsvc_result);
722 return SERVICE_ERROR_NONE;
726 int service_add_extra_data(service_h service, const char *key, const char *value)
728 if (service_valiate_service(service))
730 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
731 return SERVICE_ERROR_INVALID_PARAMETER;
734 if (service_validate_extra_data(key))
736 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
737 return SERVICE_ERROR_INVALID_PARAMETER;
740 if (service_validate_internal_key(key))
742 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
743 return SERVICE_ERROR_KEY_REJECTED;
746 if (service_validate_extra_data(value))
748 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid value", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
749 return SERVICE_ERROR_INVALID_PARAMETER;
752 if (appsvc_get_data(service->data, key) != NULL)
754 // overwrite any existing value
755 bundle_del(service->data, key);
758 if (appsvc_add_data(service->data, key, value) != 0)
760 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s)/value(%s) is rejected from appsvc",
761 __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key, value);
762 return SERVICE_ERROR_KEY_REJECTED;
765 return SERVICE_ERROR_NONE;
769 int service_add_extra_data_array(service_h service, const char *key, const char* value[], int length)
771 if (service_valiate_service(service))
773 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
774 return SERVICE_ERROR_INVALID_PARAMETER;
777 if (service_validate_extra_data(key))
779 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
780 return SERVICE_ERROR_INVALID_PARAMETER;
783 if (service_validate_internal_key(key))
785 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER, key);
786 return SERVICE_ERROR_KEY_REJECTED;
789 if (value == NULL || length <= 0)
791 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid array", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
792 return SERVICE_ERROR_INVALID_PARAMETER;
795 if (appsvc_get_data_array(service->data, key, NULL) != NULL)
797 // overwrite any existing value
798 bundle_del(service->data,key);
801 if (appsvc_add_data_array(service->data, key, value, length) != 0)
803 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) is rejected from appsvc", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
804 return SERVICE_ERROR_KEY_REJECTED;
807 return SERVICE_ERROR_NONE;
811 int service_remove_extra_data(service_h service, const char *key)
813 if (service_valiate_service(service))
815 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
816 return SERVICE_ERROR_INVALID_PARAMETER;
819 if (service_validate_extra_data(key))
821 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
822 return SERVICE_ERROR_INVALID_PARAMETER;
825 if (service_validate_internal_key(key))
827 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
828 return SERVICE_ERROR_KEY_REJECTED;
831 if (bundle_del(service->data, key))
833 LOGE("[%s] KEY_NOT_FOUND(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_KEY_NOT_FOUND, key);
834 return SERVICE_ERROR_KEY_NOT_FOUND;
837 return SERVICE_ERROR_NONE;
841 int service_get_extra_data(service_h service, const char *key, char **value)
843 const char *data_value;
845 if (service_valiate_service(service))
847 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
848 return SERVICE_ERROR_INVALID_PARAMETER;
851 if (service_validate_extra_data(key))
853 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
854 return SERVICE_ERROR_INVALID_PARAMETER;
857 if (service_validate_internal_key(key))
859 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
860 return SERVICE_ERROR_KEY_REJECTED;
865 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid value", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
866 return SERVICE_ERROR_INVALID_PARAMETER;
869 data_value = appsvc_get_data(service->data, key);
871 if (data_value == NULL)
873 if (errno == ENOTSUP)
875 LOGE("[%s] INVALID_DATA_TYPE(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_INVALID_DATA_TYPE, key);
876 return SERVICE_ERROR_INVALID_DATA_TYPE;
880 LOGE("[%s] KEY_NOT_FOUND(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_INVALID_DATA_TYPE, key);
881 return SERVICE_ERROR_KEY_NOT_FOUND;
885 *value = strdup(data_value);
887 return SERVICE_ERROR_NONE;
891 int service_get_extra_data_array(service_h service, const char *key, char ***value, int *length)
893 const char **array_data;
894 int array_data_length;
895 char **array_data_clone;
898 if (service_valiate_service(service))
900 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
901 return SERVICE_ERROR_INVALID_PARAMETER;
904 if (service_validate_extra_data(key))
906 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
907 return SERVICE_ERROR_INVALID_PARAMETER;
910 if (service_validate_internal_key(key))
912 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
913 return SERVICE_ERROR_KEY_REJECTED;
916 if (value == NULL || length == 0)
918 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid value", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
919 return SERVICE_ERROR_INVALID_PARAMETER;
922 array_data = appsvc_get_data_array(service->data, key, &array_data_length);
924 if (array_data == NULL)
926 if (errno == ENOTSUP)
928 LOGE("[%s] INVALID_DATA_TYPE(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_INVALID_DATA_TYPE, key);
929 return SERVICE_ERROR_INVALID_DATA_TYPE;
933 LOGE("[%s] KEY_NOT_FOUND(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_KEY_NOT_FOUND, key);
934 return SERVICE_ERROR_KEY_NOT_FOUND;
938 array_data_clone = calloc(array_data_length, sizeof(char*));
940 if (array_data_clone == NULL)
942 LOGE("[%s] OUT_OF_MEMORY(0x%08x)", __FUNCTION__, SERVICE_ERROR_OUT_OF_MEMORY);
943 return SERVICE_ERROR_OUT_OF_MEMORY;
946 for (i=0; i<array_data_length; i++)
948 if (array_data[i] != NULL)
950 array_data_clone[i] = strdup(array_data[i]);
954 *value = array_data_clone;
955 *length = array_data_length;
957 return SERVICE_ERROR_NONE;
961 int service_is_extra_data_array(service_h service, const char *key, bool *array)
965 if (service_valiate_service(service))
967 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
968 return SERVICE_ERROR_INVALID_PARAMETER;
971 if (service_validate_extra_data(key))
973 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
974 return SERVICE_ERROR_INVALID_PARAMETER;
979 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
980 return SERVICE_ERROR_INVALID_PARAMETER;
983 if (service_validate_internal_key(key))
985 LOGE("[%s] KEY_REJECTED(0x%08x) : key(%s) rejected", __FUNCTION__, SERVICE_ERROR_KEY_REJECTED, key);
986 return SERVICE_ERROR_KEY_REJECTED;
989 retval = appsvc_data_is_array(service->data, key);
995 else if (retval == 1)
1001 LOGE("[%s] KEY_NOT_FOUND(0x%08x) : key(%s)", __FUNCTION__, SERVICE_ERROR_KEY_NOT_FOUND, key);
1002 return SERVICE_ERROR_KEY_NOT_FOUND;
1005 return SERVICE_ERROR_NONE;
1011 service_extra_data_cb callback;
1013 bool* foreach_break;
1014 } foreach_context_extra_data_t;
1016 static void service_cb_broker_bundle_iterate(const char *key, const char *val, void *data)
1018 foreach_context_extra_data_t* foreach_context = NULL;
1019 service_extra_data_cb extra_data_cb;
1021 if (key == NULL || val == NULL || data == NULL)
1026 foreach_context = (foreach_context_extra_data_t*)data;
1028 if ( *(foreach_context->foreach_break) == true)
1033 if (service_validate_internal_key(key))
1038 extra_data_cb = foreach_context->callback;
1040 if (extra_data_cb != NULL)
1042 bool stop_foreach = false;
1044 stop_foreach = !extra_data_cb(foreach_context->service, key, foreach_context->user_data);
1046 *(foreach_context->foreach_break) = stop_foreach;
1051 int service_foreach_extra_data(service_h service, service_extra_data_cb callback, void *user_data)
1053 bool foreach_break = false;
1055 if (service_valiate_service(service))
1057 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
1058 return SERVICE_ERROR_INVALID_PARAMETER;
1061 if (callback == NULL)
1063 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
1064 return SERVICE_ERROR_INVALID_PARAMETER;
1067 foreach_context_extra_data_t foreach_context = {
1069 .callback = callback,
1070 .user_data = user_data,
1071 .foreach_break = &foreach_break
1074 bundle_iterate(service->data, service_cb_broker_bundle_iterate, &foreach_context);
1076 return SERVICE_ERROR_NONE;
1081 service_app_matched_cb callback;
1083 bool* foreach_break;
1084 } foreach_context_launchable_app_t;
1086 int service_cb_broker_foreach_app_matched(const char *package, void *data)
1088 foreach_context_launchable_app_t *foreach_context;
1089 service_app_matched_cb app_matched_cb;
1091 if (package == NULL || data == NULL)
1093 LOGE("[%s] INVALID_PARAMETER(0x%08x)", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
1097 foreach_context = (foreach_context_launchable_app_t*)data;
1099 if ( *(foreach_context->foreach_break) == true)
1104 app_matched_cb = foreach_context->callback;
1106 if (app_matched_cb != NULL)
1108 bool stop_foreach = false;
1110 stop_foreach = !app_matched_cb(foreach_context->service, package, foreach_context->user_data);
1112 *(foreach_context->foreach_break) = stop_foreach;
1118 int service_foreach_app_matched(service_h service, service_app_matched_cb callback, void *user_data)
1120 bool foreach_break = false;
1122 if (service_valiate_service(service))
1124 LOGE( "[%s] INVALID_PARAMETER(0x%08x) : invalid handle", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
1125 return SERVICE_ERROR_INVALID_PARAMETER;
1128 if (callback == NULL)
1130 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid callback", __FUNCTION__, SERVICE_ERROR_INVALID_PARAMETER);
1131 return SERVICE_ERROR_INVALID_PARAMETER;
1134 foreach_context_launchable_app_t foreach_context = {
1136 .callback = callback,
1137 .user_data = user_data,
1138 .foreach_break = &foreach_break
1141 appsvc_get_list(service->data, service_cb_broker_foreach_app_matched, &foreach_context);
1143 return SERVICE_ERROR_NONE;