/** * pk_offline_get_results: * @error: A #GError or %NULL * * Gets the last result of the offline transaction. * * Return value: (transfer full): A #PkResults, or %NULL * * Since: 0.9.6 **/ PkResults * pk_offline_get_results (GError **error) { gboolean ret; gboolean success; guint i; g_autoptr(GError) error_local = NULL; g_autofree gchar *data = NULL; g_autoptr(GKeyFile) file = NULL; g_autoptr(PkError) pk_error = NULL; g_autoptr(PkResults) results = NULL; g_auto(GStrv) package_ids = NULL; g_return_val_if_fail (error == NULL || *error == NULL, NULL); /* does not exist */ if (!g_file_test (PK_OFFLINE_RESULTS_FILENAME, G_FILE_TEST_EXISTS)) { g_set_error_literal (error, PK_OFFLINE_ERROR, PK_OFFLINE_ERROR_NO_DATA, "no update results available"); return NULL; } /* load data */ file = g_key_file_new (); ret = g_key_file_load_from_file (file, PK_OFFLINE_RESULTS_FILENAME, G_KEY_FILE_NONE, &error_local); if (!ret) { g_set_error (error, PK_OFFLINE_ERROR, PK_OFFLINE_ERROR_FAILED, "results file invalid: %s", error_local->message); return NULL; } /* add error */ results = pk_results_new (); success = g_key_file_get_boolean (file, PK_OFFLINE_RESULTS_GROUP, "Success", NULL); if (!success) { g_autofree gchar *details = NULL; g_autofree gchar *enum_str = NULL; pk_error = pk_error_new (); enum_str = g_key_file_get_string (file, PK_OFFLINE_RESULTS_GROUP, "ErrorCode", NULL); details = g_key_file_get_string (file, PK_OFFLINE_RESULTS_GROUP, "ErrorDetails", NULL); g_object_set (pk_error, "code", pk_error_enum_from_string (enum_str), "details", details, NULL); pk_results_set_error_code (results, pk_error); pk_results_set_exit_code (results, PK_EXIT_ENUM_FAILED); } else { pk_results_set_exit_code (results, PK_EXIT_ENUM_SUCCESS); } /* add packages */ data = g_key_file_get_string (file, PK_OFFLINE_RESULTS_GROUP, "Packages", NULL); if (data != NULL) { package_ids = g_strsplit (data, ",", -1); for (i = 0; package_ids[i] != NULL; i++) { g_autoptr(PkPackage) pkg = NULL; pkg = pk_package_new (); pk_package_set_info (pkg, PK_INFO_ENUM_UPDATING); if (!pk_package_set_id (pkg, package_ids[i], error)) return NULL; pk_results_add_package (results, pkg); } } return g_object_ref (results); }
/** * pk_package_set_property: **/ static void pk_package_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { PkPackage *package = PK_PACKAGE (object); PkPackagePrivate *priv = package->priv; switch (prop_id) { case PROP_INFO: pk_package_set_info (package, g_value_get_uint (value)); break; case PROP_SUMMARY: pk_package_set_summary (package, g_value_get_string (value)); break; case PROP_LICENSE: g_free (priv->license); priv->license = g_strdup (g_value_get_string (value)); break; case PROP_GROUP: priv->group = g_value_get_uint (value); break; case PROP_DESCRIPTION: g_free (priv->description); priv->description = g_strdup (g_value_get_string (value)); break; case PROP_URL: g_free (priv->url); priv->url = g_strdup (g_value_get_string (value)); break; case PROP_SIZE: priv->size = g_value_get_uint64 (value); break; case PROP_UPDATE_UPDATES: g_free (priv->update_updates); priv->update_updates = g_strdup (g_value_get_string (value)); break; case PROP_UPDATE_OBSOLETES: g_free (priv->update_obsoletes); priv->update_obsoletes = g_strdup (g_value_get_string (value)); break; case PROP_UPDATE_VENDOR_URLS: g_strfreev (priv->update_vendor_urls); priv->update_vendor_urls = g_strdupv (g_value_get_boxed (value)); break; case PROP_UPDATE_BUGZILLA_URLS: g_strfreev (priv->update_bugzilla_urls); priv->update_bugzilla_urls = g_strdupv (g_value_get_boxed (value)); break; case PROP_UPDATE_CVE_URLS: g_strfreev (priv->update_cve_urls); priv->update_cve_urls = g_strdupv (g_value_get_boxed (value)); break; case PROP_UPDATE_RESTART: priv->update_restart = g_value_get_uint (value); break; case PROP_UPDATE_UPDATE_TEXT: g_free (priv->update_text); priv->update_text = g_strdup (g_value_get_string (value)); break; case PROP_UPDATE_CHANGELOG: g_free (priv->update_changelog); priv->update_changelog = g_strdup (g_value_get_string (value)); break; case PROP_UPDATE_STATE: priv->update_state = g_value_get_uint (value); break; case PROP_UPDATE_ISSUED: g_free (priv->update_issued); priv->update_issued = g_strdup (g_value_get_string (value)); break; case PROP_UPDATE_UPDATED: g_free (priv->update_updated); priv->update_updated = g_strdup (g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
/** * pk_backend_job_package: **/ void pk_backend_job_package (PkBackendJob *job, PkInfoEnum info, const gchar *package_id, const gchar *summary) { gboolean ret; _cleanup_error_free_ GError *error = NULL; _cleanup_object_unref_ PkPackage *item = NULL; g_return_if_fail (PK_IS_BACKEND_JOB (job)); g_return_if_fail (package_id != NULL); /* check we are valid */ item = pk_package_new (); ret = pk_package_set_id (item, package_id, &error); if (!ret) { g_warning ("package_id %s invalid and cannot be processed: %s", package_id, error->message); return; } pk_package_set_info (item, info); pk_package_set_summary (item, summary); /* is it the same? */ ret = (job->priv->last_package != NULL && pk_package_equal (job->priv->last_package, item)); if (ret) return; /* update the 'last' package */ if (job->priv->last_package != NULL) g_object_unref (job->priv->last_package); job->priv->last_package = g_object_ref (item); /* have we already set an error? */ if (job->priv->set_error) { g_warning ("already set error: package %s", package_id); return; } /* we automatically set the transaction status */ if (info == PK_INFO_ENUM_DOWNLOADING) pk_backend_job_set_status (job, PK_STATUS_ENUM_DOWNLOAD); else if (info == PK_INFO_ENUM_UPDATING) pk_backend_job_set_status (job, PK_STATUS_ENUM_UPDATE); else if (info == PK_INFO_ENUM_INSTALLING) pk_backend_job_set_status (job, PK_STATUS_ENUM_INSTALL); else if (info == PK_INFO_ENUM_REMOVING) pk_backend_job_set_status (job, PK_STATUS_ENUM_REMOVE); else if (info == PK_INFO_ENUM_CLEANUP) pk_backend_job_set_status (job, PK_STATUS_ENUM_CLEANUP); else if (info == PK_INFO_ENUM_OBSOLETING) pk_backend_job_set_status (job, PK_STATUS_ENUM_OBSOLETE); /* we've sent a package for this transaction */ job->priv->has_sent_package = TRUE; /* emit */ pk_backend_job_call_vfunc (job, PK_BACKEND_SIGNAL_PACKAGE, g_object_ref (item), g_object_unref); }