/** * 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_find_by_id_name_arch: * @sack: a valid #PkPackageSack instance * @package_id: a package_id descriptor * * Finds a package in a sack by package name and architecture. As soon as one * package is found the search is stopped. * * Return value: (transfer full): the #PkPackage object, or %NULL if not found. * * Since: 0.8.16 */ PkPackage * pk_package_sack_find_by_id_name_arch (PkPackageSack *sack, const gchar *package_id) { PkPackage *pkg_tmp; guint i; g_auto(GStrv) split = NULL; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), NULL); g_return_val_if_fail (package_id != NULL, NULL); /* does the package name feature in the array */ split = pk_package_id_split (package_id); if (split == NULL) return NULL; for (i = 0; i < sack->priv->array->len; i++) { pkg_tmp = g_ptr_array_index (sack->priv->array, i); if (g_strcmp0 (pk_package_get_name (pkg_tmp), split[PK_PACKAGE_ID_NAME]) == 0 && g_strcmp0 (pk_package_get_arch (pkg_tmp), split[PK_PACKAGE_ID_ARCH]) == 0) { return g_object_ref (pkg_tmp); } } return NULL; }
/** * pk_plugin_sqlite_add_filename: **/ static gint pk_plugin_sqlite_add_filename (PkPlugin *plugin, const gchar *filename, const gchar *md5_opt) { gchar *md5 = NULL; gint rc = -1; PkPackage *package; GError *error = NULL; /* if we've got it, use old data */ if (md5_opt != NULL) md5 = g_strdup (md5_opt); else md5 = pk_plugin_get_filename_md5 (filename); // Sailfish OS: Avoid scanning of manually installed .desktop files if (strstr(filename, PK_DESKTOP_DEFAULT_APPLICATION_DIR "/apkd_launcher_") == filename) { g_warning ("Skipping custom .desktop file: %s", filename); goto out; } /* resolve */ package = pk_plugin_get_installed_package_for_file (plugin, filename, &error); if (package == NULL) { g_warning ("Failed to add database cache entry %s: %s", filename, error->message); g_error_free (error); goto out; } /* add */ rc = pk_plugin_sqlite_add_filename_details (plugin, filename, pk_package_get_name (package), md5); out: g_free (md5); return rc; }
/** * pk_plugin_sqlite_add_filename: **/ static gint pk_plugin_sqlite_add_filename (PkPlugin *plugin, const gchar *filename, const gchar *md5_opt) { gchar *md5 = NULL; gint rc = -1; PkPackage *package; GError *error = NULL; /* if we've got it, use old data */ if (md5_opt != NULL) md5 = g_strdup (md5_opt); else md5 = pk_plugin_get_filename_md5 (filename); /* resolve */ package = pk_plugin_get_installed_package_for_file (plugin, filename, &error); if (package == NULL) { g_warning ("Failed to add database cache entry %s: %s", filename, error->message); g_error_free (error); goto out; } /* add */ rc = pk_plugin_sqlite_add_filename_details (plugin, filename, pk_package_get_name (package), md5); out: g_free (md5); return rc; }
/** * 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); }