4 * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
27 #include <package_manager.h>
29 #include "service_adaptor_internal.h"
32 #include "sal_observer.h"
33 #include "auth_adaptor.h"
35 //******************************************************************************
36 //* Global variables and defines
37 //******************************************************************************
38 #define SAL_PLUGIN_METADATA_KEY_ADAPTOR "service-adaptor"
40 //******************************************************************************
42 //******************************************************************************
44 //******************************************************************************
45 //* Private interface definition
46 //******************************************************************************
49 * @brief callback of app info
53 static bool _sal_app_meta_cb(const char *key, const char *value, void *user_data)
55 provider_user_data_h provider_user_data = (provider_user_data_h) user_data;
57 if ((NULL != key) && (NULL != value))
59 if (0 == strncmp(SAL_PLUGIN_METADATA_KEY_ADAPTOR, key, strlen(SAL_PLUGIN_METADATA_KEY_ADAPTOR)))
61 SAL_INFO("%s: %s", provider_user_data->uri, value);
62 int ret = sal_provider_connect(provider_user_data->uri, value, provider_user_data->package);
64 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, false, "sal_plugin_connect() Fail(%d)", ret);
72 * @brief callback of app info
76 static bool _sal_app_info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data)
78 app_info_h app_info = NULL;
79 int ret = PACKAGE_MANAGER_ERROR_NONE;
80 char *package = (char *) user_data;
82 provider_user_data_h provider_user_data = (provider_user_data_h) g_malloc0(sizeof(provider_user_data_s));
83 provider_user_data->uri = strdup(app_id);
84 provider_user_data->package = strdup(package);
86 app_info_create(app_id, &app_info);
87 ret = app_info_foreach_metadata(app_info, _sal_app_meta_cb, provider_user_data);
88 RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "app_info_foreach_metadata() Fail(%d)", ret);
90 app_info_destroy(app_info);
96 * @brief callback of package manager
100 static void _sal_package_event_cb(const char *type,
102 package_manager_event_type_e event_type,
103 package_manager_event_state_e event_state,
105 package_manager_error_e error,
108 if ((PACKAGE_MANAGER_EVENT_TYPE_INSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state))
110 int ret = PACKAGE_MANAGER_ERROR_NONE;
111 package_info_h p_info = NULL;
113 ret = package_manager_get_package_info(package, &p_info);
114 RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_manager_get_package_info() Fail(%d)", ret);
116 ret = package_info_foreach_app_from_package(p_info, PACKAGE_INFO_ALLAPP, _sal_app_info_cb, (void *) package);
117 RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_foreach_app_from_package() Fail(%d)", ret);
119 ret = package_info_destroy(p_info);
120 RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_destroy() Fail(%d)", ret);
122 else if ((PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state))
124 sal_h sal = sal_get_handle();
125 RETM_IF(NULL == sal, "sal_get_handle() Fail");
127 char *uri = sal_provider_get_uri(package);
129 auth_plugin_h auth_plugin = auth_adaptor_get_plugin(sal->auth, uri);
130 auth_adaptor_remove_plugin(sal->auth, auth_plugin);
131 auth_adaptor_unregister_plugin_service(auth_plugin);
132 auth_adaptor_destroy_plugin(auth_plugin);
134 storage_plugin_h storage_plugin = storage_adaptor_get_plugin(sal->storage, uri);
135 storage_adaptor_remove_plugin(sal->storage, storage_plugin);
136 storage_adaptor_unregister_plugin_service(storage_plugin);
137 storage_adaptor_destroy_plugin(storage_plugin);
139 // TODO: destroy plugin of other adaptor
144 * @brief callback of package_manager_foreach_package_info()
148 static bool _sal_package_info_cb(package_info_h package_info, void *user_data)
150 int ret = PACKAGE_MANAGER_ERROR_NONE;
152 char *package = NULL;
153 ret = package_info_get_package(package_info, &package);
154 RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "package_info_get_package() Fail(%d)", ret);
156 ret = package_info_foreach_app_from_package(package_info, PACKAGE_INFO_ALLAPP, _sal_app_info_cb, package);
157 RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, false, "package_info_foreach_app_from_package() Fail(%d)", ret);
162 //******************************************************************************
163 //* Public interface definition
164 //******************************************************************************
167 * @brief start observer using package manager
171 service_adaptor_error_e sal_observer_start()
174 package_manager_h package = NULL;
176 package_manager_create(&package);
178 ret = package_manager_set_event_cb(package, _sal_package_event_cb, NULL);
179 RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_SYSTEM, "package_manager_set_event_cb() Fail(%d)", ret);
181 return SERVICE_ADAPTOR_ERROR_NONE;
185 * @brief register existing plugin using package manager
189 service_adaptor_error_e sal_observer_register_existed_plugin()
191 int ret = PACKAGE_MANAGER_ERROR_NONE;
193 ret = package_manager_foreach_package_info(_sal_package_info_cb, NULL);
194 RETVM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_SYSTEM, "package_manager_foreach_package_info() Fail(%d)", ret);
196 return SERVICE_ADAPTOR_ERROR_NONE;