/** * pk_plugin_get_installed_package_for_file: **/ static PkPackage * pk_plugin_get_installed_package_for_file (PkPlugin *plugin, const gchar *filename, GError **error) { PkPackage *package = NULL; gchar **filenames; /* use PK to find the correct package */ if (plugin->priv->list->len > 0) g_ptr_array_set_size (plugin->priv->list, 0); 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_PACKAGE, (PkBackendJobVFunc) pk_plugin_package_cb, plugin); filenames = g_strsplit (filename, "|||", -1); pk_backend_search_files (plugin->backend, plugin->job, pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), filenames); g_strfreev (filenames); /* wait for finished */ g_main_loop_run (plugin->priv->loop); /* check that we only matched one package */ if (plugin->priv->list->len == 0) { g_set_error_literal (error, 1, 0, "no packages own this file"); goto out; } if (plugin->priv->list->len > 1) { g_set_error (error, 1, 0, "%i packages own this file", plugin->priv->list->len); goto out; } /* get the package */ package = g_ptr_array_index (plugin->priv->list, 0); if (package == NULL) { g_set_error_literal (error, 1, 0, "package invalid"); goto out; } out: return package; }
/** * 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_plugin_transaction_finished_end: */ void pk_plugin_transaction_finished_end (PkPlugin *plugin, PkTransaction *transaction) { gchar *error_msg = NULL; gchar *path; gchar *statement; gfloat step; gint rc; GPtrArray *array = NULL; guint i; 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_REFRESH_CACHE) goto out; /* connect to backend */ if (!pk_backend_is_implemented (plugin->backend, PK_ROLE_ENUM_SEARCH_FILE)) { g_debug ("cannot search files"); goto out; } /* use a local backend instance */ 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_PACKAGE, (PkBackendJobVFunc) pk_plugin_package_cb, plugin); pk_backend_job_set_status (plugin->job, PK_STATUS_ENUM_SCAN_APPLICATIONS); /* reset hash */ g_hash_table_remove_all (plugin->priv->hash); pk_backend_job_set_percentage (plugin->job, 101); /* first go through the existing data, and look for * modifications and removals */ statement = g_strdup ("SELECT filename, md5 FROM cache"); rc = sqlite3_exec (plugin->priv->db, statement, pk_plugin_sqlite_cache_rescan_cb, plugin, &error_msg); g_free (statement); if (rc != SQLITE_OK) { g_warning ("SQL error: %s\n", error_msg); sqlite3_free (error_msg); goto out; } array = g_ptr_array_new_with_free_func (g_free); pk_plugin_get_desktop_files (plugin, PK_DESKTOP_DEFAULT_APPLICATION_DIR, array); if (array->len) { step = 100.0f / array->len; pk_backend_job_set_status (plugin->job, PK_STATUS_ENUM_GENERATE_PACKAGE_LIST); /* process files in an array */ for (i=0; i<array->len; i++) { pk_backend_job_set_percentage (plugin->job, i * step); path = g_ptr_array_index (array, i); pk_plugin_sqlite_add_filename (plugin, path, NULL); } } pk_backend_job_set_percentage (plugin->job, 100); pk_backend_job_set_status (plugin->job, PK_STATUS_ENUM_FINISHED); out: if (array != NULL) g_ptr_array_unref (array); }
int main (int argc, char *argv[]) { PkDirectPrivate *priv = NULL; const gchar *destdir; gboolean ret = TRUE; gint retval = EXIT_SUCCESS; g_autoptr(GError) error = NULL; g_autofree gchar *backend_name = NULL; g_autofree gchar *cmd_descriptions = NULL; g_autofree gchar *conf_filename = NULL; g_autoptr(GKeyFile) conf = NULL; const GOptionEntry options[] = { { "backend", '\0', 0, G_OPTION_ARG_STRING, &backend_name, /* TRANSLATORS: a backend is the system package tool, e.g. dnf, apt */ _("Packaging backend to use, e.g. dummy"), NULL }, { NULL } }; setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); /* create priv object */ priv = g_new0 (PkDirectPrivate, 1); /* add commands */ priv->cmd_array = g_ptr_array_new_with_free_func ((GDestroyNotify) pk_direct_item_free); pk_direct_add (priv->cmd_array, "refresh", NULL, /* TRANSLATORS: command description */ _("Refresh the cache"), pk_direct_refresh); pk_direct_add (priv->cmd_array, "refresh-force", NULL, /* TRANSLATORS: command description */ _("Refresh the cache (forced)"), pk_direct_refresh_force); pk_direct_add (priv->cmd_array, "search-name", "[SEARCH]", /* TRANSLATORS: command description */ _("Search by names"), pk_direct_search_names); pk_direct_add (priv->cmd_array, "search-detail", "[SEARCH]", /* TRANSLATORS: command description */ _("Search by details"), pk_direct_search_details); pk_direct_add (priv->cmd_array, "search-file", "[SEARCH]", /* TRANSLATORS: command description */ _("Search by files"), pk_direct_search_files); pk_direct_add (priv->cmd_array, "install", "[PKGID]", /* TRANSLATORS: command description */ _("Install package"), pk_direct_install); pk_direct_add (priv->cmd_array, "remove", "[PKGID]", /* TRANSLATORS: command description */ _("Remove package"), pk_direct_remove); pk_direct_add (priv->cmd_array, "repo-set-data", "[REPO] [KEY] [VALUE]", /* TRANSLATORS: command description */ _("Set repository options"), pk_direct_repo_set_data); /* sort by command name */ g_ptr_array_sort (priv->cmd_array, (GCompareFunc) pk_sort_command_name_cb); /* get a list of the commands */ priv->context = g_option_context_new (NULL); cmd_descriptions = pk_direct_get_descriptions (priv->cmd_array); g_option_context_set_summary (priv->context, cmd_descriptions); /* TRANSLATORS: program name */ g_set_application_name (_("PackageKit")); g_option_context_add_main_entries (priv->context, options, NULL); g_option_context_add_group (priv->context, pk_debug_get_option_group ()); ret = g_option_context_parse (priv->context, &argc, &argv, &error); if (!ret) { /* TRANSLATORS: the user didn't read the man page */ g_print ("%s: %s\n", _("Failed to parse arguments"), error->message); goto out; } /* get values from the config file */ conf = g_key_file_new (); conf_filename = pk_util_get_config_filename (); ret = g_key_file_load_from_file (conf, conf_filename, G_KEY_FILE_NONE, &error); if (!ret) { /* TRANSLATORS: probably not yet installed */ g_print ("%s: %s\n", _("Failed to load the config file"), error->message); retval = EXIT_FAILURE; goto out; } /* support DESTDIR */ destdir = g_getenv ("DESTDIR"); if (destdir != NULL) g_key_file_set_string (conf, "Daemon", "DestDir", destdir); /* override the backend name */ if (backend_name != NULL) g_key_file_set_string (conf, "Daemon", "DefaultBackend", backend_name); /* resolve 'auto' to an actual name */ backend_name = g_key_file_get_string (conf, "Daemon", "DefaultBackend", NULL); if (backend_name == NULL || g_strcmp0 (backend_name, "auto") == 0) { if (!pk_util_set_auto_backend (conf, &error)) { g_print ("Failed to resolve auto: %s\n", error->message); retval = EXIT_FAILURE; goto out; } } /* do stuff on ctrl-c */ priv->loop = g_main_loop_new (NULL, FALSE); g_unix_signal_add_full (G_PRIORITY_DEFAULT, SIGINT, pk_direct_sigint_cb, &priv, NULL); /* load the backend */ priv->backend = pk_backend_new (conf); if (!pk_backend_load (priv->backend, &error)) { /* TRANSLATORS: cannot load the backend the user specified */ g_print ("%s: %s\n", _("Failed to load the backend"), error->message); retval = EXIT_FAILURE; goto out; } /* set up the job */ priv->job = pk_backend_job_new (conf); pk_backend_job_set_cache_age (priv->job, G_MAXUINT); pk_backend_job_set_backend (priv->job, priv->backend); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_FINISHED, pk_direct_finished_cb, priv); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_PERCENTAGE, pk_direct_percentage_cb, priv); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_STATUS_CHANGED, pk_direct_status_changed_cb, priv); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_PACKAGE, pk_direct_package_cb, priv); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_ERROR_CODE, pk_direct_error_cb, priv); pk_backend_job_set_vfunc (priv->job, PK_BACKEND_SIGNAL_ITEM_PROGRESS, pk_direct_item_progress_cb, priv); /* run the specified command */ ret = pk_direct_run (priv, argv[1], (gchar**) &argv[2], &error); if (!ret) { if (g_error_matches (error, PK_ERROR, PK_ERROR_NO_SUCH_CMD)) { g_autofree gchar *tmp = NULL; tmp = g_option_context_get_help (priv->context, TRUE, NULL); g_print ("%s", tmp); } else { g_print ("%s\n", error->message); } goto out; } /* unload backend */ if (!pk_backend_unload (priv->backend)) { /* TRANSLATORS: cannot unload the backend the user specified */ g_print ("%s\n", _("Failed to unload the backend")); retval = EXIT_FAILURE; goto out; } out: if (priv->cmd_array != NULL) g_ptr_array_unref (priv->cmd_array); if (priv->backend != NULL) g_object_unref (priv->backend); if (priv->job != NULL) g_object_unref (priv->job); if (priv->loop != NULL) g_main_loop_unref (priv->loop); g_option_context_free (priv->context); g_free (priv); return retval; }