summaryrefslogtreecommitdiffstats
path: root/src/software-dbus/sw-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/software-dbus/sw-utils.c')
-rw-r--r--src/software-dbus/sw-utils.c189
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)
{