Add 3.0 APIs and sync APIs same as 2.4
[platform/core/convergence/service-adaptor.git] / server / sal_observer.c
1 /*
2  * Service Adaptor
3  *
4  * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <stdio.h>
21 #include <string.h>
22 #include <glib.h>
23
24 #include <tizen.h>
25 #include <app.h>
26 #include <app_info.h>
27 #include <package_manager.h>
28
29 #include "service_adaptor_internal.h"
30
31 #include "sal.h"
32 #include "sal_observer.h"
33 #include "auth_adaptor.h"
34
35 //******************************************************************************
36 //* Global variables and defines
37 //******************************************************************************
38 #define SAL_PLUGIN_METADATA_KEY_ADAPTOR "service-adaptor"
39
40 //******************************************************************************
41 //* Private interface
42 //******************************************************************************
43
44 //******************************************************************************
45 //* Private interface definition
46 //******************************************************************************
47
48 /**
49  * @brief callback of app info
50  *
51  * @return      void.
52  */
53 static bool _sal_app_meta_cb(const char *key, const char *value, void *user_data)
54 {
55         provider_user_data_h provider_user_data = (provider_user_data_h) user_data;
56
57         if ((NULL != key) && (NULL != value))
58         {
59                 if (0 == strncmp(SAL_PLUGIN_METADATA_KEY_ADAPTOR, key, strlen(SAL_PLUGIN_METADATA_KEY_ADAPTOR)))
60                 {
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);
63
64                         RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, false, "sal_plugin_connect() Fail(%d)", ret);
65                 }
66         }
67
68         return true;
69 }
70
71 /**
72  * @brief callback of app info
73  *
74  * @return      void.
75  */
76 static bool _sal_app_info_cb(package_info_app_component_type_e comp_type, const char *app_id, void *user_data)
77 {
78         app_info_h app_info = NULL;
79         int ret = PACKAGE_MANAGER_ERROR_NONE;
80         char *package = (char *) user_data;
81
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);
85
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);
89
90         app_info_destroy(app_info);
91
92         return true;
93 }
94
95 /**
96  * @brief callback of package manager
97  *
98  * @return      void.
99  */
100 static void _sal_package_event_cb(const char *type,
101                 const char *package,
102                 package_manager_event_type_e event_type,
103                 package_manager_event_state_e event_state,
104                 int progress,
105                 package_manager_error_e error,
106                 void *user_data)
107 {
108         if ((PACKAGE_MANAGER_EVENT_TYPE_INSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state))
109         {
110                 int ret = PACKAGE_MANAGER_ERROR_NONE;
111                 package_info_h p_info = NULL;
112
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);
115
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);
118
119                 ret = package_info_destroy(p_info);
120                 RETM_IF(PACKAGE_MANAGER_ERROR_NONE != ret, "package_info_destroy() Fail(%d)", ret);
121         }
122         else if ((PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL == event_type) && (PACKAGE_MANAGER_EVENT_STATE_COMPLETED == event_state))
123         {
124                 sal_h sal = sal_get_handle();
125                 RETM_IF(NULL == sal, "sal_get_handle() Fail");
126
127                 char *uri = sal_provider_get_uri(package);
128
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);
133
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);
138
139                 // TODO: destroy plugin of other adaptor
140         }
141 }
142
143 /**
144  * @brief callback of package_manager_foreach_package_info()
145  *
146  * @return      void.
147  */
148 static bool _sal_package_info_cb(package_info_h package_info, void *user_data)
149 {
150         int ret = PACKAGE_MANAGER_ERROR_NONE;
151
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);
155
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);
158
159         return true;
160 }
161
162 //******************************************************************************
163 //* Public interface definition
164 //******************************************************************************
165
166 /**
167  * @brief start observer using package manager
168  *
169  * @return      void.
170  */
171 service_adaptor_error_e sal_observer_start()
172 {
173         int ret = 0;
174         package_manager_h package = NULL;
175
176         package_manager_create(&package);
177
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);
180
181         return SERVICE_ADAPTOR_ERROR_NONE;
182 }
183
184 /**
185  * @brief register existing plugin using package manager
186  *
187  * @return      void.
188  */
189 service_adaptor_error_e sal_observer_register_existed_plugin()
190 {
191         int ret = PACKAGE_MANAGER_ERROR_NONE;
192
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);
195
196         return SERVICE_ADAPTOR_ERROR_NONE;
197 }