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);
+
+ _LOGE("jungh move pkgid[%s]", appinfo->package);
+ 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;
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)
- 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 (ret == PMINFO_R_OK)
+ g_hash_table_foreach_steal(list, _move_func, &handle_list_);
+ g_hash_table_destroy(list);
return ret;
}
#define XXHDPI_MIN 481
#define XXHDPI_MAX 600
-static int __free_packages(gpointer key, gpointer value,
- gpointer user_data)
-{
- pkgmgrinfo_basic_free_package((package_x *)value);
-
- return 0;
-}
-
static const char join_localized_info[] =
" LEFT OUTER JOIN package_localized_info"
" ON pi.package=package_localized_info.package"
API int pkginfo_internal_filter_get_list(
sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter,
- uid_t uid, const char *locale, GHashTable **pkginfo_list) {
- GHashTable *list;
+ uid_t uid, const char *locale, GHashTable *pkginfo_list) {
int ret;
if (filter == NULL || pkginfo_list == NULL) {
return PMINFO_R_EINVAL;
}
- list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
- NULL);
- if (list == NULL)
- return PMINFO_R_ERROR;
-
ret = _pkginfo_get_packages(db, uid, locale, filter,
- PMINFO_PKGINFO_GET_ALL, list);
+ PMINFO_PKGINFO_GET_ALL, pkginfo_list);
if (ret == PMINFO_R_OK && uid != GLOBAL_USER)
ret = _pkginfo_get_packages(db, GLOBAL_USER, locale, filter,
- PMINFO_PKGINFO_GET_ALL, list);
+ PMINFO_PKGINFO_GET_ALL, pkginfo_list);
- if (ret != PMINFO_R_OK) {
- g_hash_table_foreach_remove(list, __free_packages, NULL);
- g_hash_table_destroy(list);
+ if (ret == PMINFO_R_ERROR)
return ret;
- }
- *pkginfo_list = list;
+ if (!g_hash_table_size(pkginfo_list))
+ return PMINFO_R_ENOENT;
+
return PMINFO_R_OK;
}
#endif
// TODO: should we get sqlite handle as parameter??
-int pkginfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter, uid_t uid, const char *locale, GHashTable **list);
+int pkginfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_pkginfo_filter_h filter, uid_t uid, const char *locale, GHashTable *list);
int appinfo_internal_filter_get_list(sqlite3 *db, pkgmgrinfo_appinfo_filter_h filter, uid_t uid, const char *locale, GHashTable *list);
int certinfo_internal_get(sqlite3 *db, const char *pkgid, uid_t uid, pkgmgrinfo_certinfo_h certinfo);
int certinfo_internal_set(sqlite3 *db, const char *pkgid, pkgmgrinfo_instcertinfo_h handle, uid_t uid);