/** * pk_package_sack_sort_compare_package_id_func: **/ static gint pk_package_sack_sort_compare_package_id_func (PkPackage **a, PkPackage **b) { const gchar *package_id1; const gchar *package_id2; package_id1 = pk_package_get_id (*a); package_id2 = pk_package_get_id (*b); return g_strcmp0 (package_id1, package_id2); }
/** * pk_package_sack_sort_compare_name_func: **/ static gint pk_package_sack_sort_compare_name_func (PkPackage **a, PkPackage **b) { const gchar *package_id1; const gchar *package_id2; g_auto(GStrv) split1 = NULL; g_auto(GStrv) split2 = NULL; package_id1 = pk_package_get_id (*a); package_id2 = pk_package_get_id (*b); split1 = pk_package_id_split (package_id1); split2 = pk_package_id_split (package_id2); return g_strcmp0 (split1[PK_PACKAGE_ID_NAME], split2[PK_PACKAGE_ID_NAME]); }
/** * pk_plugin_transaction_action_method: */ static void pk_plugin_transaction_action_method (PkPlugin *plugin, PkTransaction *transaction, PkResults *results) { GPtrArray *invalidated = NULL; PkPackage *pkg; PkPackageSack *sack; const gchar *package_id; gchar **package_ids; guint i; /* get the existing prepared updates */ sack = pk_plugin_get_existing_prepared_updates (PK_OFFLINE_PREPARED_UPDATE_FILENAME); if (pk_package_sack_get_size (sack) == 0) goto out; /* are there any requested packages that match in prepared-updates */ package_ids = pk_transaction_get_package_ids (transaction); for (i = 0; package_ids[i] != NULL; i++) { pkg = pk_package_sack_find_by_id_name_arch (sack, package_ids[i]); if (pkg != NULL) { g_debug ("%s modified %s, invalidating prepared-updates", package_ids[i], pk_package_get_id (pkg)); pk_plugin_state_changed (plugin); g_object_unref (pkg); goto out; } } /* are there any changed deps that match a package in prepared-updates */ invalidated = pk_results_get_package_array (results); for (i = 0; i < invalidated->len; i++) { package_id = pk_package_get_id (g_ptr_array_index (invalidated, i)); pkg = pk_package_sack_find_by_id_name_arch (sack, package_id); if (pkg != NULL) { g_debug ("%s modified %s, invalidating prepared-updates", package_id, pk_package_get_id (pkg)); pk_plugin_state_changed (plugin); g_object_unref (pkg); goto out; } } out: if (invalidated != NULL) g_ptr_array_unref (invalidated); g_object_unref (sack); }
/** * pk_package_sack_remove_package_by_id: * @sack: a valid #PkPackageSack instance * @package_id: a package_id descriptor * * Removes a package reference from the sack. As soon as one package is removed * the search is stopped. * * Return value: %TRUE if the package was removed from the sack * * Since: 0.5.2 **/ gboolean pk_package_sack_remove_package_by_id (PkPackageSack *sack, const gchar *package_id) { PkPackage *package; const gchar *id; gboolean ret = FALSE; guint i; GPtrArray *array; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), FALSE); g_return_val_if_fail (package_id != NULL, FALSE); array = sack->priv->array; for (i=0; i<array->len; i++) { package = g_ptr_array_index (array, i); id = pk_package_get_id (package); if (g_strcmp0 (package_id, id) == 0) { g_ptr_array_remove_index (array, i); ret = TRUE; break; } } return ret; }
/** * 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_sort_compare_name_func: **/ static gint pk_package_sack_sort_compare_name_func (PkPackage **a, PkPackage **b) { const gchar *package_id1; const gchar *package_id2; gchar **split1; gchar **split2; gint retval; package_id1 = pk_package_get_id (*a); package_id2 = pk_package_get_id (*b); split1 = pk_package_id_split (package_id1); split2 = pk_package_id_split (package_id2); retval = g_strcmp0 (split1[PK_PACKAGE_ID_NAME], split2[PK_PACKAGE_ID_NAME]); g_strfreev (split1); g_strfreev (split2); return retval; }
/** * gpk_package_entry_completion_model_new: * * Creates a tree model containing completions from the system package list **/ static GtkTreeModel * gpk_package_entry_completion_model_new (void) { GPtrArray *list; guint i; PkPackage *item; GHashTable *hash; gpointer data; GtkListStore *store; GtkTreeIter iter; gchar **split; store = gtk_list_store_new (1, G_TYPE_STRING); hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); list = gpk_package_entry_completion_get_names_from_file (PK_SYSTEM_PACKAGE_LIST_FILENAME); if (list == NULL) { egg_warning ("no package list, try refreshing"); return NULL; } egg_debug ("loading %i autocomplete items", list->len); for (i=0; i<list->len; i++) { item = g_ptr_array_index (list, i); if (item == NULL || pk_package_get_id (item) == NULL) { egg_warning ("item invalid!"); break; } split = pk_package_id_split (pk_package_get_id (item)); data = g_hash_table_lookup (hash, (gpointer) split[PK_PACKAGE_ID_NAME]); if (data == NULL) { /* append just the name */ g_hash_table_insert (hash, g_strdup (split[PK_PACKAGE_ID_NAME]), GINT_TO_POINTER (1)); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, split[PK_PACKAGE_ID_NAME], -1); } g_strfreev (split); } g_hash_table_unref (hash); g_ptr_array_unref (list); return GTK_TREE_MODEL (store); }
/** * pk_package_sack_remove_package: * @sack: a valid #PkPackageSack instance * @package: a valid #PkPackage instance * * Removes a package reference from the sack. The pointers have to match exactly. * * Return value: %TRUE if the package was removed from the sack * * Since: 0.5.2 **/ gboolean pk_package_sack_remove_package (PkPackageSack *sack, PkPackage *package) { g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), FALSE); g_return_val_if_fail (PK_IS_PACKAGE (package), FALSE); /* remove from array */ g_hash_table_remove (sack->priv->table, pk_package_get_id (package)); return g_ptr_array_remove (sack->priv->array, package); }
/** * 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_debuginfo_install_resolve_name_to_id: **/ static gchar * pk_debuginfo_install_resolve_name_to_id (PkDebuginfoInstallPrivate *priv, const gchar *package_name, GError **error) { PkResults *results = NULL; PkPackage *item; gchar *package_id = NULL; GPtrArray *list = NULL; GError *error_local = NULL; gchar **names; PkError *error_code = NULL; /* resolve takes a char** */ names = g_strsplit (package_name, ";", -1); /* resolve */ results = pk_client_resolve (priv->client, pk_bitfield_from_enums (PK_FILTER_ENUM_NEWEST, -1), names, NULL, NULL, NULL, &error_local); if (results == NULL) { *error = g_error_new (1, 0, "failed to resolve: %s", error_local->message); g_error_free (error_local); goto out; } /* check error code */ error_code = pk_results_get_error_code (results); if (error_code != NULL) { *error = g_error_new (1, 0, "failed to resolve: %s, %s", pk_error_enum_to_string (pk_error_get_code (error_code)), pk_error_get_details (error_code)); goto out; } /* check we only got one match */ list = pk_results_get_package_array (results); if (list->len == 0) { *error = g_error_new (1, 0, "no package %s found", package_name); goto out; } if (list->len > 1) { *error = g_error_new (1, 0, "more than one package found for %s", package_name); goto out; } /* get the package id */ item = g_ptr_array_index (list, 0); package_id = g_strdup (pk_package_get_id (item)); out: if (error_code != NULL) g_object_unref (error_code); if (results != NULL) g_object_unref (results); if (list != NULL) g_ptr_array_unref (list); g_strfreev (names); return package_id; }
/** * pk_package_sack_add_package: * @sack: a valid #PkPackageSack instance * @package: a valid #PkPackage instance * * Adds a package to the sack. * * Return value: %TRUE if the package was added to the sack * * Since: 0.5.2 **/ gboolean pk_package_sack_add_package (PkPackageSack *sack, PkPackage *package) { g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), FALSE); g_return_val_if_fail (PK_IS_PACKAGE (package), FALSE); /* add to array */ g_ptr_array_add (sack->priv->array, g_object_ref (package)); g_hash_table_insert (sack->priv->table, g_strdup (pk_package_get_id (package)), g_object_ref (package)); return TRUE; }
/** * pk_package_sack_find_by_id: * @sack: a valid #PkPackageSack instance * @package_id: a package_id descriptor * * Finds a package in a sack from reference. As soon as one package is found * the search is stopped. * * Return value: (transfer full): the #PkPackage object, or %NULL if unfound. Free with g_object_unref() * * Since: 0.5.2 **/ PkPackage * pk_package_sack_find_by_id (PkPackageSack *sack, const gchar *package_id) { PkPackage *package_tmp; const gchar *id; PkPackage *package = NULL; guint i; guint len; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), NULL); g_return_val_if_fail (package_id != NULL, NULL); len = sack->priv->array->len; for (i=0; i<len; i++) { package_tmp = g_ptr_array_index (sack->priv->array, i); id = pk_package_get_id (package_tmp); if (g_strcmp0 (package_id, id) == 0) { package = g_object_ref (package_tmp); break; } } return package; }
/** * 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); }
/** * pk_debuginfo_install_add_deps: **/ static gboolean pk_debuginfo_install_add_deps (PkDebuginfoInstallPrivate *priv, GPtrArray *packages_search, GPtrArray *packages_results, GError **error) { gboolean ret = TRUE; PkResults *results = NULL; PkPackage *item; gchar *package_id = NULL; GPtrArray *list = NULL; GError *error_local = NULL; gchar **package_ids = NULL; gchar *name_debuginfo; guint i; gchar **split; PkError *error_code = NULL; /* get depends for them all, not adding dup's */ package_ids = pk_ptr_array_to_strv (packages_search); results = pk_client_get_depends (priv->client, pk_bitfield_value (PK_FILTER_ENUM_NONE), package_ids, TRUE, NULL, NULL, NULL, &error_local); if (results == NULL) { *error = g_error_new (1, 0, "failed to get_depends: %s", error_local->message); g_error_free (error_local); ret = FALSE; goto out; } /* check error code */ error_code = pk_results_get_error_code (results); if (error_code != NULL) { *error = g_error_new (1, 0, "failed to get depends: %s, %s", pk_error_enum_to_string (pk_error_get_code (error_code)), pk_error_get_details (error_code)); ret = FALSE; goto out; } /* add dependent packages */ list = pk_results_get_package_array (results); for (i=0; i<list->len; i++) { item = g_ptr_array_index (list, i); split = pk_package_id_split (pk_package_get_id (item)); /* add -debuginfo */ name_debuginfo = pk_debuginfo_install_name_to_debuginfo (split[PK_PACKAGE_ID_NAME]); g_strfreev (split); /* resolve name */ g_debug ("resolving: %s", name_debuginfo); package_id = pk_debuginfo_install_resolve_name_to_id (priv, name_debuginfo, &error_local); if (package_id == NULL) { /* TRANSLATORS: we couldn't find the package name, non-fatal */ g_print (_("Failed to find the package %s, or already installed: %s"), name_debuginfo, error_local->message); g_print ("\n"); g_error_free (error_local); /* don't quit, this is non-fatal */ error = NULL; } /* add to array to install */ if (package_id != NULL && !g_str_has_suffix (package_id, "installed")) { g_debug ("going to try to install (for deps): %s", package_id); g_ptr_array_add (packages_results, g_strdup (package_id)); } g_free (package_id); g_free (name_debuginfo); } out: if (error_code != NULL) g_object_unref (error_code); if (results != NULL) g_object_unref (results); if (list != NULL) g_ptr_array_unref (list); g_strfreev (package_ids); return ret; }
/** * 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_console_resolve_package: **/ gchar * pk_console_resolve_package (PkClient *client, PkBitfield filter, const gchar *package_name, GError **error) { const gchar *package_id_tmp; gchar *package_id = NULL; gboolean valid; gchar **tmp; gchar **split = NULL; PkResults *results; GPtrArray *array = NULL; guint i; gchar *printable; PkPackage *package; PkError *error_code = NULL; /* have we passed a complete package_id? */ valid = pk_package_id_check (package_name); if (valid) return g_strdup (package_name); /* split */ tmp = g_strsplit (package_name, ",", -1); /* get the list of possibles */ results = pk_client_resolve (client, filter, tmp, NULL, NULL, NULL, error); if (results == NULL) goto out; /* check error code */ error_code = pk_results_get_error_code (results); if (error_code != NULL) { g_set_error (error, 1, 0, "\n%s", pk_error_get_details (error_code)); goto out; } /* get the packages returned */ array = pk_results_get_package_array (results); if (array == NULL) { g_set_error (error, 1, 0, "did not get package struct for %s", package_name); goto out; } /* nothing found */ if (array->len == 0) { g_set_error (error, 1, 0, "could not find %s", package_name); goto out; } /* just one thing found */ if (array->len == 1) { package = g_ptr_array_index (array, 0); g_object_get (package, "package-id", &package_id, NULL); goto out; } /* TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages */ g_print ("%s\n", _("More than one package matches:")); for (i=0; i<array->len; i++) { package = g_ptr_array_index (array, i); package_id_tmp = pk_package_get_id (package); split = pk_package_id_split (package_id_tmp); printable = pk_package_id_to_printable (package_id_tmp); g_print ("%i. %s [%s]\n", i+1, printable, split[PK_PACKAGE_ID_DATA]); g_free (printable); } /* TRANSLATORS: This finds out which package in the list to use */ i = pk_console_get_number (_("Please choose the correct package: "), array->len); if (i == 0) { g_set_error_literal (error, 1, 0, "User aborted selection"); goto out; } package = g_ptr_array_index (array, i-1); g_object_get (package, "package-id", &package_id, NULL); out: if (results != NULL) g_object_unref (results); if (array != NULL) g_ptr_array_unref (array); g_strfreev (tmp); g_strfreev (split); return package_id; }