diff options
Diffstat (limited to 'src/software-dbus/sw-utils.c')
-rw-r--r-- | src/software-dbus/sw-utils.c | 189 |
1 files changed, 139 insertions, 50 deletions
diff --git a/src/software-dbus/sw-utils.c b/src/software-dbus/sw-utils.c index e2a252d..410a0fe 100644 --- a/src/software-dbus/sw-utils.c +++ b/src/software-dbus/sw-utils.c @@ -23,6 +23,10 @@ const char *provider_name = "software"; const ConfigEntry *provider_config_defaults = NULL; +/******************************************************************************* + * SwPackage & related functions + ******************************************************************************/ + void init_sw_package(SwPackage *pkg) { pkg->name = NULL; @@ -201,30 +205,25 @@ void sw_pkg_get_element_name(const SwPackage *pkg, char *elem_name, pkg->version, pkg->release, pkg->arch); } -short is_valid_sw_pkg_elem_name(const char *elem_name) +/******************************************************************************* + * Functions related to single PkPackage + ******************************************************************************/ + +void get_pk_pkg_from_sw_pkg(const SwPackage *sw_pkg, PkPackage **pk_pkg) { PkTask *task = NULL; - PkPackage *pk_pkg = NULL; + PkPackage *item = NULL; PkResults *results = NULL; GPtrArray *array = NULL; GError *gerror = NULL; gchar **values = NULL; - SwPackage sw_pkg; - short ret = 0; unsigned i; char error_msg[ERROR_MSG_LEN] = ""; - init_sw_package(&sw_pkg); - - if (create_sw_package_from_elem_name(elem_name, &sw_pkg) != 0) { - warn("Failed to parse element name: %s", elem_name); - goto done; - } - task = pk_task_new(); values = g_new0(gchar*, 2); - values[0] = g_strdup(sw_pkg.name); + values[0] = g_strdup(sw_pkg->name); values[1] = NULL; results = pk_task_search_names_sync(task, 0, values, NULL, NULL, NULL, &gerror); @@ -236,32 +235,81 @@ short is_valid_sw_pkg_elem_name(const char *elem_name) array = pk_results_get_package_array(results); for (i = 0; i < array->len; i++) { - pk_pkg = g_ptr_array_index(array, i); - if (strcmp(pk_package_get_name(pk_pkg), sw_pkg.name) == 0 - && strcmp(pk_package_get_version(pk_pkg), sw_pkg.pk_version) == 0 - && strcmp(pk_package_get_arch(pk_pkg), sw_pkg.arch) == 0) { - ret = 1; + item = g_ptr_array_index(array, i); + if (strcmp(pk_package_get_name(item), sw_pkg->name) == 0 + && strcmp(pk_package_get_version(item), sw_pkg->pk_version) == 0 + && strcmp(pk_package_get_arch(item), sw_pkg->arch) == 0) { + *pk_pkg = g_object_ref(item); break; } } done: - free_sw_package(&sw_pkg); - g_strfreev(values); g_clear_error(&gerror); - if (task) { - g_object_unref(task); + if (array) { + g_ptr_array_unref(array); } if (results) { g_object_unref(results); } + if (task) { + g_object_unref(task); + } + + return; +} + +void get_pk_det_from_pk_pkg(PkPackage *pk_pkg, PkDetails **pk_det) +{ + PkTask *task = NULL; + PkDetails *item = NULL; + PkResults *results = NULL; + GPtrArray *array = NULL; + GError *gerror = NULL; + gchar **values = NULL; + unsigned i; + char error_msg[ERROR_MSG_LEN] = ""; + + task = pk_task_new(); + + values = g_new0(gchar*, 2); + values[0] = g_strdup(pk_package_get_id(pk_pkg)); + values[1] = NULL; + + results = pk_task_get_details_sync(task, values, NULL, NULL, NULL, &gerror); + if (check_and_create_error_msg(results, gerror, + "Getting package details failed", error_msg, ERROR_MSG_LEN)) { + warn(error_msg); + goto done; + } + + array = pk_results_get_details_array(results); + for (i = 0; i < array->len; i++) { + item = g_ptr_array_index(array, i); + if (strcmp(pk_details_get_package_id(item), + pk_package_get_id(pk_pkg)) == 0) { + *pk_det = g_object_ref(item); + break; + } + } + +done: + g_strfreev(values); + g_clear_error(&gerror); + if (array) { g_ptr_array_unref(array); } + if (results) { + g_object_unref(results); + } + if (task) { + g_object_unref(task); + } - return ret; + return; } void create_instance_from_pkgkit_data(PkPackage *pk_pkg, PkDetails *pk_det, @@ -311,21 +359,20 @@ void create_instance_from_pkgkit_data(PkPackage *pk_pkg, PkDetails *pk_det, return; } +/******************************************************************************* + * Functions related to multiple PkPackages + ******************************************************************************/ + void enum_sw_identity_instances(PkBitfield filters, const CMPIBroker *cb, const char *ns, const CMPIResult* cr, char *error_msg, - const unsigned error_msg_len) + const unsigned error_msg_len, const short names) { - LMI_SoftwareIdentity w; PkTask *task = NULL; - PkPackage *pk_pkg = NULL; - PkDetails *pk_det = NULL; - PkResults *results = NULL, *results2 = NULL; + PkResults *results = NULL; GError *gerror = NULL; - GPtrArray *array = NULL, *array2 = NULL; - gchar **values = NULL; + GPtrArray *array = NULL; SwPackage sw_pkg; - int cmpres; - unsigned i, j, a2i; + unsigned i; init_sw_package(&sw_pkg); @@ -340,6 +387,40 @@ void enum_sw_identity_instances(PkBitfield filters, const CMPIBroker *cb, array = pk_results_get_package_array(results); g_ptr_array_sort(array, (GCompareFunc) pk_pkg_cmp); + if (names) { + char elem_name[ELEM_NAME_LEN] = "", instance_id[INSTANCE_ID_LEN] = ""; + + for (i = 0; i < array->len; i++) { + if (create_sw_package_from_pk_pkg(g_ptr_array_index(array, i), + &sw_pkg) != 0) { + continue; + } + + sw_pkg_get_element_name(&sw_pkg, elem_name, ELEM_NAME_LEN); + + create_instance_id(SW_IDENTITY_CLASS_NAME, elem_name, instance_id, + INSTANCE_ID_LEN); + + free_sw_package(&sw_pkg); + + LMI_SoftwareIdentityRef w; + LMI_SoftwareIdentityRef_Init(&w, cb, ns); + LMI_SoftwareIdentityRef_Set_InstanceID(&w, instance_id); + KReturnObjectPath(cr, w); + } + + goto done; + } + + LMI_SoftwareIdentity w; + PkPackage *pk_pkg = NULL; + PkDetails *pk_det = NULL; + PkResults *results2 = NULL; + GPtrArray *array2 = NULL; + gchar **values = NULL; + int cmpres; + unsigned j, a2i; + for (i = 0; i < array->len / PK_DETAILS_LIMIT + 1; i++) { values = g_new0(gchar*, PK_DETAILS_LIMIT + 1); values[PK_DETAILS_LIMIT] = NULL; @@ -411,34 +492,22 @@ void enum_sw_identity_instances(PkBitfield filters, const CMPIBroker *cb, done: g_clear_error(&gerror); - if (task) { - g_object_unref(task); + if (array) { + g_ptr_array_unref(array); } if (results) { g_object_unref(results); } - if (array) { - g_ptr_array_unref(array); + if (task) { + g_object_unref(task); } return; } -gint pk_pkg_cmp(gpointer a, gpointer b) -{ - PkPackage *al = *(PkPackage **) a; - PkPackage *bl = *(PkPackage **) b; - - return (gint) strcmp(pk_package_get_id(al), pk_package_get_id(bl)); -} - -gint pk_det_cmp(gpointer a, gpointer b) -{ - PkDetails *al = *(PkDetails **) a; - PkDetails *bl = *(PkDetails **) b; - - return (gint) strcmp(pk_details_get_package_id(al), pk_details_get_package_id(bl)); -} +/******************************************************************************* + * Functions related to PackageKit + ******************************************************************************/ short check_and_create_error_msg(PkResults *results, GError *gerror, const char *custom_msg, char *error_msg, const unsigned error_msg_len) @@ -476,6 +545,26 @@ done: return ret; } +gint pk_pkg_cmp(gpointer a, gpointer b) +{ + PkPackage *al = *(PkPackage **) a; + PkPackage *bl = *(PkPackage **) b; + + return (gint) strcmp(pk_package_get_id(al), pk_package_get_id(bl)); +} + +gint pk_det_cmp(gpointer a, gpointer b) +{ + PkDetails *al = *(PkDetails **) a; + PkDetails *bl = *(PkDetails **) b; + + return (gint) strcmp(pk_details_get_package_id(al), pk_details_get_package_id(bl)); +} + +/******************************************************************************* + * Functions related to CMPI + ******************************************************************************/ + void create_instance_id(const char *class_name, const char *id, char *instance_id, const unsigned instance_id_len) { |