namespace {
-void _move(gpointer key, gpointer value, gpointer user_data) {
+gboolean _move_func(gpointer key, gpointer value, gpointer user_data) {
package_x* appinfo = static_cast<package_x*>(value);
std::vector<package_x*>* app_list =
static_cast<std::vector<package_x*>*>(user_data);
app_list->emplace_back(appinfo);
+
+ return true;
+}
+
+void __free_packages(gpointer data) {
+ pkgmgrinfo_basic_free_package((package_x*)data);
}
} // namespace
return PMINFO_R_ERROR;
}
- // TODO: db handle should be delivered
- GHashTable* list;
+ GHashTable* list = g_hash_table_new_full(g_str_hash, g_str_equal,
+ NULL, __free_packages);
std::vector<sqlite3*> conn_list = GetConnection();
- int ret;
+ int ret = PMINFO_R_OK;
for (auto& conn : conn_list) {
ret = pkginfo_internal_filter_get_list(conn, filter_, uid_,
- GetLocale().c_str(), &list);
+ GetLocale().c_str(), list);
if (ret == PMINFO_R_ERROR) {
- g_hash_table_destroy(list);
- return ret;
+ _LOGE("Failed to pkginfo_internal_filter_get_list (%d)", ret);
+ break;
}
}
- // TODO: possible memory leak?
- g_hash_table_foreach(list, _move, &handle_list_);
- g_hash_table_destroy(list);
+ if (g_hash_table_size(list) == 0)
+ ret = PMINFO_R_ENOENT;
+
+ if (ret == PMINFO_R_OK)
+ g_hash_table_foreach_steal(list, _move_func, &handle_list_);
+ g_hash_table_destroy(list);
return ret;
}