/** * pk_package_sack_add_packages_from_line: **/ static gboolean pk_package_sack_add_packages_from_line (PkPackageSack *sack, const gchar *package_str, GError **error) { PkInfoEnum info; g_autoptr(GError) error_local = NULL; g_autoptr(PkPackage) package = NULL; g_auto(GStrv) pdata = NULL; package = pk_package_new (); pdata = g_strsplit (package_str, "\t", -1); if (g_strv_length (pdata) != 3) { g_set_error (error, 1, 0, "invalid package-info line: %s", package_str); return FALSE; } info = pk_info_enum_from_string (pdata[0]); g_object_set (package, "info", info, "summary", pdata[2], NULL); if (!pk_package_set_id (package, pdata[1], &error_local)) { g_set_error (error, 1, 0, "invalid package-id in package-info line: %s", pdata[1]); return FALSE; } if (!pk_package_sack_add_package (sack, package)) g_set_error (error, 1, 0, "could not add package '%s' to package-sack!", pdata[1]); return TRUE; }
/** * pk_package_sack_add_package_by_id: * @sack: a valid #PkPackageSack instance * @package_id: a package_id descriptor * @error: a %GError to put the error code and message in, or %NULL * * Adds a package reference to the sack. * * Return value: %TRUE if the package was added to the sack * * Since: 0.5.2 **/ gboolean pk_package_sack_add_package_by_id (PkPackageSack *sack, const gchar *package_id, GError **error) { g_autoptr(PkPackage) package = NULL; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), FALSE); g_return_val_if_fail (package_id != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* create new object */ package = pk_package_new (); if (!pk_package_set_id (package, package_id, error)) return FALSE; /* add to array, array will own object */ pk_package_sack_add_package (sack, package); return TRUE; }
/** * pk_package_sack_add_packages_from_line: **/ static void pk_package_sack_add_packages_from_line (PkPackageSack *sack, const gchar *package_str, GError **error) { GError *error_local = NULL; gboolean ret; PkPackage *package; gchar **pdata; PkInfoEnum info; g_return_if_fail (PK_IS_PACKAGE_SACK (sack)); package = pk_package_new (); pdata = g_strsplit (package_str, "\t", -1); if (g_strv_length (pdata) != 3) { g_set_error (error, 1, 0, "invalid package-info line: %s", package_str); goto out; } info = pk_info_enum_from_string (pdata[0]); g_object_set (package, "info", info, "summary", pdata[2], NULL); ret = pk_package_set_id (package, pdata[1], &error_local); if (!ret) { g_set_error (error, 1, 0, "invalid package-id in package-info line: %s", pdata[1]); goto out; } ret = pk_package_sack_add_package (sack, package); if (!ret) g_set_error (error, 1, 0, "could not add package '%s' to package-sack!", pdata[1]); out: g_strfreev (pdata); g_object_unref (package); }
/** * pk_package_sack_add_package_by_id: * @sack: a valid #PkPackageSack instance * @package_id: a package_id descriptor * @error: a %GError to put the error code and message in, or %NULL * * Adds a package reference to the sack. * * Return value: %TRUE if the package was added to the sack * * Since: 0.5.2 **/ gboolean pk_package_sack_add_package_by_id (PkPackageSack *sack, const gchar *package_id, GError **error) { PkPackage *package; gboolean ret; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), FALSE); g_return_val_if_fail (package_id != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* create new object */ package = pk_package_new (); ret = pk_package_set_id (package, package_id, error); if (!ret) goto out; /* add to array, array will own object */ g_ptr_array_add (sack->priv->array, g_object_ref (package)); out: g_object_unref (package); return ret; }
/** * pk_package_parse: * @package: a valid #PkPackage instance * @data: the data describing the package * @error: a %GError to put the error code and message in, or %NULL * * Parses the data to populate the #PkPackage. * * Return value: %TRUE if the data was parsed correcty * * Since: 0.8.11 **/ gboolean pk_package_parse (PkPackage *package, const gchar *data, GError **error) { _cleanup_strv_free_ gchar **sections = NULL; g_return_val_if_fail (PK_IS_PACKAGE (package), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* split */ sections = g_strsplit (data, "\t", -1); if (g_strv_length (sections) != 3) { g_set_error_literal (error, 1, 0, "data invalid"); return FALSE; } /* parse object */ package->priv->info = pk_info_enum_from_string (sections[0]); if (!pk_package_set_id (package, sections[1], error)) return FALSE; g_free (package->priv->summary); package->priv->summary = g_strdup (sections[2]); return TRUE; }
/** * 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_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); }