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()
30 plugin::provider_info::provider_info(const string &p, const string &f)
36 plugin::provider_info::provider_info(const provider_info &src)
41 plugin::provider_info &plugin::provider_info::operator=(const
45 provider = src.provider;
51 void plugin::provider_info::construct(const string &p, const string &f)
57 bool plugin::provider_info::empty() const
59 if (!provider.empty())
66 plugin::discovery::discovery()
70 plugin::discovery::~discovery()
74 vector<plugin::provider_info> plugin::discovery::get_available_list() const
76 vector <provider_info> v;
79 /* Enumerate all available plugin binaries */
80 const vector <string> l = get_module_file_list();
81 for (int i = 0; i < int(l.size()); i++) {
82 /* Request the next plugin binary to get provider info */
83 const provider_info info = be.get_plugin_info(l[i]);
87 /* Add provider info to the resulting list */
94 vector<string> plugin::discovery::get_module_file_list() const
100 const gchar *filename = NULL;
102 MAPS_LOGD("START PLUGIN FILES DISCOVERY:");
103 dir = g_dir_open(MAPS_PLUGINS_PATH_PREFIX, 0, &error);
105 GPatternSpec *plugin_name_pattern = g_pattern_spec_new("*?.so");
107 while ((filename = g_dir_read_name(dir))) {
108 MAPS_LOGD("found plugin binary: %s", filename);
109 if (g_pattern_match_string(plugin_name_pattern, filename)) {
110 MAPS_LOGD("\tadded plugin binary: %s", filename);
111 l.push_back(string(filename));
115 g_pattern_spec_free(plugin_name_pattern);
118 MAPS_LOGE("%d: Can not open directory: %s\n", error->code, error->message);
124 plugin::provider_info plugin::find_by_names(const string &provider)
126 const vector<provider_info> v = discovery().get_available_list();
127 for (int i = 0; i < int (v.size()); i++)
128 if (v[i].provider == provider)
131 return provider_info::empty_instance;
134 void plugin::split_provider_name(const char *original, char **provider, char **module)
136 char *save, *_provider, *_module;
138 _provider = strtok_r(g_strdup(original), "/", &save);
139 _module = g_strdup(strtok_r(NULL, "", &save));
142 *provider = g_strdup(_provider);
144 *module = g_strdup(_module);
153 maps_service_request_user_consent_cb callback;
159 gboolean user_consent_shutdown(gpointer data)
161 if (!data) return false;
163 user_consent_s *uc = (user_consent_s*)data;
164 plugin::user_consent_checker().shutdown(uc->plugin);
165 g_free(uc->provider);
170 void plugin::user_consent_cb(bool consented, const char *provider, void *user_data)
172 MAPS_LOGE("user_consent_cb is called");
173 user_consent_s *uc = (user_consent_s*)user_data;
174 if (uc && uc->callback)
175 uc->callback(consented, provider, uc->user_data);
176 g_idle_add(user_consent_shutdown, (void*)uc);
179 int plugin::request_user_consent(const char *maps_provider, void *callback, void *user_data)
181 if (!maps_provider || !callback)
182 return MAPS_ERROR_INVALID_PARAMETER;
184 char *provider = NULL, *module = NULL;
185 plugin::split_provider_name(maps_provider, &provider, &module);
186 const plugin::provider_info info = plugin::find_by_names(provider);
188 /* 1. initialize the requested plugin */
189 int error = MAPS_ERROR_SERVICE_NOT_AVAILABLE;
190 int init_error = MAPS_ERROR_NONE; /* Storage for init error code */
191 plugin_s *plugin_handle = (plugin_s*)plugin::user_consent_checker().init(info, module, &init_error);
194 if (!plugin_handle) {
195 MAPS_LOGE("ERROR! Plugin init failed");
199 /* 2. request user consent */
200 user_consent_s *uc = NULL;
201 if (plugin_handle->interface.maps_plugin_request_user_consent) {
202 uc = (user_consent_s*)g_malloc0(sizeof(user_consent_s));
204 error = MAPS_ERROR_OUT_OF_MEMORY;
206 uc->callback = (maps_service_request_user_consent_cb)callback;
207 uc->provider = g_strdup(maps_provider);
208 uc->user_data = user_data;
209 uc->plugin = plugin_handle;
210 error = plugin_handle->interface.maps_plugin_request_user_consent(
211 (const char*)uc->provider, user_consent_cb, (void*)uc);
212 MAPS_LOGD("maps_plugin_request_user_consent = %d", error);
213 if (error == MAPS_ERROR_USER_NOT_CONSENTED)
214 error = MAPS_ERROR_NONE;
218 /* 3. shutdown plugin */
219 if (error != MAPS_ERROR_NONE) {
220 plugin::user_consent_checker().shutdown(plugin_handle);
222 g_free(uc->provider);