1 /* Copyright (c) 2010-2014 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.
17 #include "discovery.h"
19 #include "maps_util.h"
24 plugin::provider_info plugin::provider_info::empty_instance;
26 plugin::provider_info::provider_info()
31 plugin::provider_info::provider_info(const string &p, const string &f)
38 plugin::provider_info::provider_info(const provider_info &src)
43 plugin::provider_info &plugin::provider_info::operator=(const
47 provider = src.provider;
53 void plugin::provider_info::construct(const string &p, const string &f)
59 bool plugin::provider_info::empty() const
61 if (!provider.empty())
68 plugin::discovery::discovery()
72 plugin::discovery::~discovery()
76 vector<plugin::provider_info> plugin::discovery::get_available_list() const
78 vector <provider_info> v;
81 /* Enumerate all available plugin binaries */
82 const vector <string> l = get_module_file_list();
83 for (int i = 0; i < int(l.size()); i++) {
84 /* Request the next plugin binary to get provider info */
85 const provider_info info = be.get_plugin_info(l[i]);
87 continue; //LCOV_EXCL_LINE
89 /* Add provider info to the resulting list */
96 vector<string> plugin::discovery::get_module_file_list() const
101 GError *error = NULL;
102 const gchar *filename = NULL;
104 MAPS_LOGD("START PLUGIN FILES DISCOVERY:");
105 dir = g_dir_open(MAPS_PLUGINS_PATH_PREFIX, 0, &error);
107 GPatternSpec *plugin_name_pattern = g_pattern_spec_new("*?.so");
109 while ((filename = g_dir_read_name(dir))) {
110 MAPS_LOGD("found plugin binary: %s", filename);
111 if (g_pattern_spec_match_string(plugin_name_pattern, filename)) {
112 MAPS_LOGD("\tadded plugin binary: %s", filename);
113 l.push_back(string(filename));
117 g_pattern_spec_free(plugin_name_pattern);
121 MAPS_LOGE("%d: Can not open directory: %s\n", error->code, error->message);
129 plugin::provider_info plugin::find_by_names(const string &provider)
131 const vector<provider_info> v = discovery().get_available_list();
132 for (int i = 0; i < int (v.size()); i++)
133 if (v[i].provider == provider)
136 return provider_info::empty_instance;
139 void plugin::split_provider_name(const char *original, char **provider, char **module)
141 char *save = NULL, *_provider = NULL, *_module = NULL;
143 _provider = strtok_r(g_strdup(original), "/", &save);
144 _module = g_strdup(strtok_r(NULL, "", &save));
147 *provider = g_strdup(_provider);
149 *module = g_strdup(_module);
158 maps_service_request_user_consent_cb callback;
164 gboolean user_consent_shutdown(gpointer data)
166 if (!data) return false;
168 user_consent_s *uc = (user_consent_s*)data;
169 plugin::user_consent_checker().shutdown(uc->plugin);
170 g_free(uc->provider);
175 void plugin::user_consent_cb(bool consented, const char *provider, void *user_data)
177 MAPS_LOGE("user_consent_cb is called");
178 user_consent_s *uc = (user_consent_s*)user_data;
179 if (uc && uc->callback)
180 uc->callback(consented, provider, uc->user_data);
181 g_idle_add(user_consent_shutdown, (void*)uc);
184 int plugin::request_user_consent(const char *maps_provider, void *callback, void *user_data)
186 if (!maps_provider || !callback)
187 return MAPS_ERROR_INVALID_PARAMETER;
189 char *provider = NULL, *module = NULL;
190 plugin::split_provider_name(maps_provider, &provider, &module);
191 const plugin::provider_info info = plugin::find_by_names(provider);
193 /* 1. initialize the requested plugin */
194 int error = MAPS_ERROR_SERVICE_NOT_AVAILABLE;
195 int init_error = MAPS_ERROR_NONE; /* Storage for init error code */
196 plugin_s *plugin_handle = (plugin_s*)plugin::user_consent_checker().init(info, module, &init_error);
199 if (!plugin_handle) {
200 MAPS_LOGE("ERROR! Plugin init failed");
204 /* 2. request user consent */
205 user_consent_s *uc = NULL;
206 if (plugin_handle->interface.maps_plugin_request_user_consent) {
207 uc = (user_consent_s*)g_malloc0(sizeof(user_consent_s));
209 error = MAPS_ERROR_OUT_OF_MEMORY;
211 uc->callback = (maps_service_request_user_consent_cb)callback;
212 uc->provider = g_strdup(maps_provider);
213 uc->user_data = user_data;
214 uc->plugin = plugin_handle;
215 error = plugin_handle->interface.maps_plugin_request_user_consent(
216 (const char*)uc->provider, user_consent_cb, (void*)uc);
217 MAPS_LOGD("maps_plugin_request_user_consent = %d", error);
218 if (error == MAPS_ERROR_USER_NOT_CONSENTED)
219 error = MAPS_ERROR_NONE; //LCOV_EXCL_LINE
223 /* 3. shutdown plugin */
224 if (error != MAPS_ERROR_NONE) {
226 plugin::user_consent_checker().shutdown(plugin_handle);
228 g_free(uc->provider);