/** * pk_package_sack_sort_compare_info_func: **/ static gint pk_package_sack_sort_compare_info_func (PkPackage **a, PkPackage **b) { PkInfoEnum info1; PkInfoEnum info2; info1 = pk_package_get_info (*a); info2 = pk_package_get_info (*b); if (info1 == info2) return 0; else if (info1 > info2) return -1; return 1; }
/** * pk_package_sack_add_packages_from_file: * @sack: a valid #PkPackageSack instance * @file: a valid package-list file * @error: a %GError to put the error code and message in, or %NULL * * Write the contents of a PkPackageSack to a package-list file. * * Return value: %TRUE if there were no errors. * * Since: 0.8.6 **/ gboolean pk_package_sack_to_file (PkPackageSack *sack, GFile *file, GError **error) { gboolean ret; GString *string; guint i; PkPackage *pkg; string = g_string_new (""); for (i = 0; i < sack->priv->array->len; i++) { pkg = g_ptr_array_index (sack->priv->array, i); g_string_append_printf (string, "%s\t%s\t%s\n", pk_info_enum_to_string (pk_package_get_info (pkg)), pk_package_get_id (pkg), pk_package_get_summary (pkg)); } ret = g_file_replace_contents (file, string->str, string->len, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL, error); if (!ret) goto out; out: g_string_free (string, FALSE); return ret; }
static void pk_direct_package_cb (PkBackendJob *job, gpointer object, gpointer user_data) { PkPackage *pkg = PK_PACKAGE (object); g_print ("Package: %s\t%s\n", pk_info_enum_to_string (pk_package_get_info (pkg)), pk_package_get_id (pkg)); }
/** * pk_package_sack_resolve_cb: **/ static void pk_package_sack_resolve_cb (GObject *source_object, GAsyncResult *res, PkPackageSackState *state) { PkClient *client = PK_CLIENT (source_object); PkPackage *item; guint i; PkPackage *package; const gchar *package_id; g_autoptr(GError) error = NULL; g_autoptr(PkResults) results = NULL; g_autoptr(GPtrArray) packages = NULL; /* get the results */ results = pk_client_generic_finish (client, res, &error); if (results == NULL) { g_warning ("failed to resolve: %s", error->message); pk_package_sack_merge_bool_state_finish (state, error); return; } /* get the packages */ packages = pk_results_get_package_array (results); if (packages->len == 0) { g_warning ("%i", state->ret); error = g_error_new (1, 0, "no packages found!"); pk_package_sack_merge_bool_state_finish (state, error); return; } /* set data on each item */ for (i = 0; i < packages->len; i++) { item = g_ptr_array_index (packages, i); package_id = pk_package_get_id (item); package = pk_package_sack_find_by_id (state->sack, package_id); if (package == NULL) { g_warning ("failed to find %s", package_id); continue; } /* set data */ g_object_set (package, "info", pk_package_get_info (item), "summary", pk_package_get_summary (item), NULL); g_object_unref (package); } /* all okay */ state->ret = TRUE; /* we're done */ pk_package_sack_merge_bool_state_finish (state, error); }
/** * pk_offline_update_progress_cb: **/ static void pk_offline_update_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data) { gchar *msg = NULL; gint percentage; PkInfoEnum info; PkPackage *pkg = NULL; PkProgressBar *progressbar = PK_PROGRESS_BAR (user_data); switch (type) { case PK_PROGRESS_TYPE_ROLE: pk_progress_bar_start (progressbar, "Updating system"); break; case PK_PROGRESS_TYPE_PACKAGE: g_object_get (progress, "package", &pkg, NULL); info = pk_package_get_info (pkg); if (info == PK_INFO_ENUM_UPDATING) { msg = g_strdup_printf ("Updating %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } else if (info == PK_INFO_ENUM_INSTALLING) { msg = g_strdup_printf ("Installing %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } else if (info == PK_INFO_ENUM_REMOVING) { msg = g_strdup_printf ("Removing %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } break; case PK_PROGRESS_TYPE_PERCENTAGE: g_object_get (progress, "percentage", &percentage, NULL); if (percentage < 0) goto out; /* print on terminal */ pk_progress_bar_set_percentage (progressbar, percentage); /* update plymouth */ pk_offline_update_set_plymouth_percentage (percentage); break; default: break; } out: if (pkg != NULL) g_object_unref (pkg); g_free (msg); }
/** * pk_package_sack_filter_by_info: * @sack: a valid #PkPackageSack instance * @info: a %PkInfoEnum value to match * * Returns a new package sack which only matches packages that match the * specified info enum value. * * Return value: (transfer full): a new #PkPackageSack, free with g_object_unref() * * Since: 0.6.2 **/ PkPackageSack * pk_package_sack_filter_by_info (PkPackageSack *sack, PkInfoEnum info) { PkPackageSack *results; PkPackage *package; PkInfoEnum info_tmp; guint i; PkPackageSackPrivate *priv = sack->priv; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), NULL); /* create new sack */ results = pk_package_sack_new (); /* add each that matches the info enum */ for (i = 0; i < priv->array->len; i++) { package = g_ptr_array_index (priv->array, i); info_tmp = pk_package_get_info (package); if (info_tmp == info) pk_package_sack_add_package (results, package); } return results; }
/** * pk_offline_update_progress_cb: **/ static void pk_offline_update_progress_cb (PkProgress *progress, PkProgressType type, gpointer user_data) { PkInfoEnum info; PkProgressBar *progressbar = PK_PROGRESS_BAR (user_data); PkStatusEnum status; gint percentage; _cleanup_free_ gchar *msg = NULL; _cleanup_object_unref_ PkPackage *pkg = NULL; switch (type) { case PK_PROGRESS_TYPE_ROLE: sd_journal_print (LOG_INFO, "assigned role"); pk_progress_bar_start (progressbar, "Updating system"); break; case PK_PROGRESS_TYPE_PACKAGE: g_object_get (progress, "package", &pkg, NULL); info = pk_package_get_info (pkg); if (info == PK_INFO_ENUM_UPDATING) { msg = g_strdup_printf ("Updating %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } else if (info == PK_INFO_ENUM_INSTALLING) { msg = g_strdup_printf ("Installing %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } else if (info == PK_INFO_ENUM_REMOVING) { msg = g_strdup_printf ("Removing %s", pk_package_get_name (pkg)); pk_progress_bar_start (progressbar, msg); } sd_journal_print (LOG_INFO, "package %s\t%s-%s.%s (%s)", pk_info_enum_to_string (info), pk_package_get_name (pkg), pk_package_get_version (pkg), pk_package_get_arch (pkg), pk_package_get_data (pkg)); break; case PK_PROGRESS_TYPE_PERCENTAGE: g_object_get (progress, "percentage", &percentage, NULL); if (percentage < 0) return; sd_journal_print (LOG_INFO, "percentage %i%%", percentage); /* TRANSLATORS: this is the message we send plymouth to * advise of the new percentage completion */ msg = g_strdup_printf ("%s - %i%%", _("Installing Updates"), percentage); if (percentage > 10) pk_offline_update_set_plymouth_msg (msg); /* print on terminal */ pk_progress_bar_set_percentage (progressbar, percentage); /* update plymouth */ pk_offline_update_set_plymouth_percentage (percentage); break; case PK_PROGRESS_TYPE_STATUS: g_object_get (progress, "status", &status, NULL); sd_journal_print (LOG_INFO, "status %s", pk_status_enum_to_string (status)); default: break; } }
/** * pk_plugin_transaction_finished_results: */ void pk_plugin_transaction_finished_results (PkPlugin *plugin, PkTransaction *transaction) { gchar **package_ids = NULL; gchar *package_id_tmp; GPtrArray *array = NULL; GPtrArray *list = NULL; guint i; PkInfoEnum info; PkPackage *item; PkResults *results; PkRoleEnum role; /* skip simulate actions */ if (pk_bitfield_contain (pk_transaction_get_transaction_flags (transaction), PK_TRANSACTION_FLAG_ENUM_SIMULATE)) { goto out; } /* skip only-download */ if (pk_bitfield_contain (pk_transaction_get_transaction_flags (transaction), PK_TRANSACTION_FLAG_ENUM_ONLY_DOWNLOAD)) { goto out; } /* load */ if (plugin->priv->db == NULL) pk_transaction_plugin_load_db (plugin, transaction); /* no database */ if (plugin->priv->db == NULL) goto out; /* check the role */ role = pk_transaction_get_role (transaction); if (role != PK_ROLE_ENUM_INSTALL_PACKAGES) goto out; /* connect to backend */ if (!pk_backend_is_implemented (plugin->backend, PK_ROLE_ENUM_GET_FILES)) { g_debug ("cannot get files"); goto out; } /* get results */ results = pk_transaction_get_results (transaction); array = pk_results_get_package_array (results); /* filter on INSTALLING | UPDATING */ list = g_ptr_array_new_with_free_func (g_free); for (i=0; i<array->len; i++) { item = g_ptr_array_index (array, i); info = pk_package_get_info (item); if (info == PK_INFO_ENUM_INSTALLING || info == PK_INFO_ENUM_UPDATING) { /* we convert the package_id data to be 'installed' */ package_id_tmp = pk_package_id_build (pk_package_get_name (item), pk_package_get_version (item), pk_package_get_arch (item), "installed"); g_ptr_array_add (list, package_id_tmp); } } /* process file lists on these packages */ g_debug ("processing %i packags for desktop files", list->len); if (list->len == 0) goto out; /* get all the files touched in the packages we just installed */ pk_backend_reset_job (plugin->backend, plugin->job); pk_backend_job_set_vfunc (plugin->job, PK_BACKEND_SIGNAL_FINISHED, (PkBackendJobVFunc) pk_plugin_finished_cb, plugin); pk_backend_job_set_vfunc (plugin->job, PK_BACKEND_SIGNAL_FILES, (PkBackendJobVFunc) pk_plugin_files_cb, plugin); pk_backend_job_set_status (plugin->job, PK_STATUS_ENUM_SCAN_APPLICATIONS); pk_backend_job_set_percentage (plugin->job, 101); package_ids = pk_ptr_array_to_strv (list); pk_backend_get_files (plugin->backend, plugin->job, package_ids); /* wait for finished */ g_main_loop_run (plugin->priv->loop); pk_backend_job_set_percentage (plugin->job, 100); out: if (array != NULL) g_ptr_array_unref (array); if (list != NULL) g_ptr_array_unref (list); g_strfreev (package_ids); }
/** * pk_offline_auth_set_results: * @results: A #PkResults * @error: A #GError or %NULL * * Saves the transaction results to a file. * * Return value: %TRUE for success, else %FALSE and @error set * * Since: 0.9.6 **/ gboolean pk_offline_auth_set_results (PkResults *results, GError **error) { guint i; PkPackage *package; g_autoptr(GError) error_local = NULL; g_autofree gchar *data = NULL; g_autoptr(GKeyFile) key_file = NULL; g_autoptr(PkError) pk_error = NULL; g_autoptr(GPtrArray) packages = NULL; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); key_file = g_key_file_new (); pk_error = pk_results_get_error_code (results); if (pk_error != NULL) { g_key_file_set_boolean (key_file, PK_OFFLINE_RESULTS_GROUP, "Success", FALSE); g_key_file_set_string (key_file, PK_OFFLINE_RESULTS_GROUP, "ErrorCode", pk_error_enum_to_string (pk_error_get_code (pk_error))); g_key_file_set_string (key_file, PK_OFFLINE_RESULTS_GROUP, "ErrorDetails", pk_error_get_details (pk_error)); } else { g_key_file_set_boolean (key_file, PK_OFFLINE_RESULTS_GROUP, "Success", TRUE); } /* save packages if any set */ packages = pk_results_get_package_array (results); if (packages->len > 0) { g_autoptr(GString) string = NULL; string = g_string_new (""); for (i = 0; i < packages->len; i++) { package = g_ptr_array_index (packages, i); switch (pk_package_get_info (package)) { case PK_INFO_ENUM_UPDATING: case PK_INFO_ENUM_INSTALLING: g_string_append_printf (string, "%s,", pk_package_get_id (package)); break; default: break; } } if (string->len > 0) g_string_set_size (string, string->len - 1); g_key_file_set_string (key_file, PK_OFFLINE_RESULTS_GROUP, "Packages", string->str); } /* write file */ data = g_key_file_to_data (key_file, NULL, &error_local); if (data == NULL) { g_set_error (error, PK_OFFLINE_ERROR, PK_OFFLINE_ERROR_FAILED, "failed to get keyfile data: %s", error_local->message); return FALSE; } if (!g_file_set_contents (PK_OFFLINE_RESULTS_FILENAME, data, -1, &error_local)) { g_set_error (error, PK_OFFLINE_ERROR, PK_OFFLINE_ERROR_FAILED, "failed to write file: %s", error_local->message); return FALSE; } return TRUE; }
/** * pk_offline_update_write_results: **/ static void pk_offline_update_write_results (PkResults *results) { gboolean ret; gchar *data = NULL; GError *error = NULL; GKeyFile *key_file; GPtrArray *packages; GString *string; guint i; PkError *pk_error; PkPackage *package; key_file = g_key_file_new (); pk_error = pk_results_get_error_code (results); if (pk_error != NULL) { g_key_file_set_boolean (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "Success", FALSE); g_key_file_set_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "ErrorCode", pk_error_enum_to_string (pk_error_get_code (pk_error))); g_key_file_set_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "ErrorDetails", pk_error_get_details (pk_error)); } else { g_key_file_set_boolean (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "Success", TRUE); } /* save packages if any set */ packages = pk_results_get_package_array (results); if (packages != NULL) { string = g_string_new (""); for (i = 0; i < packages->len; i++) { package = g_ptr_array_index (packages, i); switch (pk_package_get_info (package)) { case PK_INFO_ENUM_UPDATING: case PK_INFO_ENUM_INSTALLING: g_string_append_printf (string, "%s,", pk_package_get_id (package)); break; default: break; } } if (string->len > 0) g_string_set_size (string, string->len - 1); g_key_file_set_string (key_file, PK_OFFLINE_UPDATE_RESULTS_GROUP, "Packages", string->str); g_string_free (string, TRUE); } /* write file */ data = g_key_file_to_data (key_file, NULL, &error); if (data == NULL) { g_warning ("failed to get keyfile data: %s", error->message); g_error_free (error); goto out; } ret = g_file_set_contents (PK_OFFLINE_UPDATE_RESULTS_FILENAME, data, -1, &error); if (!ret) { g_warning ("failed to write file: %s", error->message); g_error_free (error); goto out; } out: g_key_file_free (key_file); g_free (data); }