/** * pk_backend_get_accepted_eula_string: */ gchar * pk_backend_get_accepted_eula_string (PkBackend *backend) { GString *string; GList *l; _cleanup_list_free_ GList *keys = NULL; g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE); /* optimise for the common case */ if (g_hash_table_size (backend->priv->eulas) == 0) return NULL; /* create a string of the accepted EULAs */ string = g_string_new (""); keys = g_hash_table_get_keys (backend->priv->eulas); for (l=keys; l != NULL; l=l->next) g_string_append_printf (string, "%s;", (const gchar *) l->data); /* remove the trailing ';' */ g_string_set_size (string, string->len -1); return g_string_free (string, FALSE); }
/** * pk_backend_reset_job: **/ void pk_backend_reset_job (PkBackend *backend, PkBackendJob *job) { g_return_if_fail (PK_IS_BACKEND (backend)); if (!pk_backend_job_get_started (job)) { g_warning ("trying to reset job, but never started it before"); return; } /* optional */ if (backend->priv->desc->job_reset != NULL) { backend->priv->desc->job_reset (backend, job); } else { if (backend->priv->desc->job_stop != NULL) backend->priv->desc->job_stop (backend, job); if (backend->priv->desc->job_start != NULL) backend->priv->desc->job_start (backend, job); } /* bubble up */ pk_backend_job_reset (job); }
/** * pk_backend_watch_file: * @func: (scope call): */ gboolean pk_backend_watch_file (PkBackend *backend, const gchar *filename, PkBackendFileChanged func, gpointer data) { _cleanup_error_free_ GError *error = NULL; _cleanup_object_unref_ GFile *file = NULL; g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE); g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (func != NULL, FALSE); if (backend->priv->file_changed_func != NULL) { g_warning ("already set"); return FALSE; } /* monitor config files for changes */ file = g_file_new_for_path (filename); backend->priv->monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error); if (backend->priv->monitor == NULL) { g_warning ("Failed to set watch on %s: %s", filename, error->message); return FALSE; } /* success */ g_signal_connect (backend->priv->monitor, "changed", G_CALLBACK (pk_backend_file_monitor_changed_cb), backend); backend->priv->file_changed_func = func; backend->priv->file_changed_data = data; return TRUE; }
/** * pk_backend_finalize: **/ static void pk_backend_finalize (GObject *object) { PkBackend *backend; g_return_if_fail (PK_IS_BACKEND (object)); backend = PK_BACKEND (object); g_free (backend->priv->name); #ifdef PK_BUILD_DAEMON g_object_unref (backend->priv->network); #endif g_key_file_unref (backend->priv->conf); g_hash_table_destroy (backend->priv->eulas); g_mutex_clear (&backend->priv->thread_hash_mutex); g_hash_table_unref (backend->priv->thread_hash); if (backend->priv->monitor != NULL) g_object_unref (backend->priv->monitor); if (backend->priv->handle != NULL) g_module_close (backend->priv->handle); G_OBJECT_CLASS (pk_backend_parent_class)->finalize (object); }
/** * pk_backend_repo_remove: */ void pk_backend_repo_remove (PkBackend *backend, PkBackendJob *job, PkBitfield transaction_flags, const gchar *repo_id, gboolean autoremove) { g_return_if_fail (PK_IS_BACKEND (backend)); g_return_if_fail (backend->priv->desc->repo_remove != NULL); /* final pre-flight checks */ g_assert (pk_backend_job_get_vfunc_enabled (job, PK_BACKEND_SIGNAL_FINISHED)); pk_backend_job_set_role (job, PK_ROLE_ENUM_REPO_REMOVE); pk_backend_job_set_parameters (job, g_variant_new ("(tsb)", transaction_flags, repo_id, autoremove)); backend->priv->desc->repo_remove (backend, job, transaction_flags, repo_id, autoremove); }
/** * pk_backend_set_user_data: **/ void pk_backend_set_user_data (PkBackend *backend, gpointer user_data) { g_return_if_fail (PK_IS_BACKEND (backend)); backend->priv->user_data = user_data; }
/** * pk_backend_get_user_data: * * Return value: (transfer none): Job user data **/ gpointer pk_backend_get_user_data (PkBackend *backend) { g_return_val_if_fail (PK_IS_BACKEND (backend), NULL); return backend->priv->user_data; }
/** * pk_backend_load: * * Responsible for initialising the external backend object. * * Typically this will involve taking database locks for exclusive package access. * This method should only be called from the engine, unless the backend object * is used in self-check code, in which case the lock and unlock will have to * be done manually. **/ gboolean pk_backend_load (PkBackend *backend, GError **error) { GModule *handle; gboolean ret = FALSE; gpointer func = NULL; _cleanup_free_ gchar *backend_name = NULL; _cleanup_free_ gchar *path = NULL; g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE); /* already loaded */ if (backend->priv->loaded) { g_set_error (error, 1, 0, "already set name to %s", backend->priv->name); return FALSE; } /* can we load it? */ backend_name = g_key_file_get_string (backend->priv->conf, "Daemon", "DefaultBackend", error); if (backend_name == NULL) return FALSE; /* the "hawkey" backend was renamed to "hif" */ if (g_strcmp0 (backend_name, "hawkey") == 0) { g_free (backend_name); backend_name = g_strdup ("hif"); } g_debug ("Trying to load : %s", backend_name); path = pk_backend_build_library_path (backend, backend_name); handle = g_module_open (path, 0); if (handle == NULL) { g_set_error (error, 1, 0, "opening module %s failed : %s", backend_name, g_module_error ()); return FALSE; } /* then check for the new style exported functions */ ret = g_module_symbol (handle, "pk_backend_get_description", (gpointer *)&func); if (ret) { PkBackendDesc *desc; PkBackendGetCompatStringFunc backend_vfunc; desc = g_new0 (PkBackendDesc, 1); /* connect up exported methods */ g_module_symbol (handle, "pk_backend_cancel", (gpointer *)&desc->cancel); g_module_symbol (handle, "pk_backend_destroy", (gpointer *)&desc->destroy); g_module_symbol (handle, "pk_backend_download_packages", (gpointer *)&desc->download_packages); g_module_symbol (handle, "pk_backend_get_categories", (gpointer *)&desc->get_categories); g_module_symbol (handle, "pk_backend_depends_on", (gpointer *)&desc->depends_on); g_module_symbol (handle, "pk_backend_get_details", (gpointer *)&desc->get_details); g_module_symbol (handle, "pk_backend_get_details_local", (gpointer *)&desc->get_details_local); g_module_symbol (handle, "pk_backend_get_files_local", (gpointer *)&desc->get_files_local); g_module_symbol (handle, "pk_backend_get_distro_upgrades", (gpointer *)&desc->get_distro_upgrades); g_module_symbol (handle, "pk_backend_get_files", (gpointer *)&desc->get_files); g_module_symbol (handle, "pk_backend_get_filters", (gpointer *)&desc->get_filters); g_module_symbol (handle, "pk_backend_get_groups", (gpointer *)&desc->get_groups); g_module_symbol (handle, "pk_backend_get_mime_types", (gpointer *)&desc->get_mime_types); g_module_symbol (handle, "pk_backend_supports_parallelization", (gpointer *)&desc->supports_parallelization); g_module_symbol (handle, "pk_backend_get_packages", (gpointer *)&desc->get_packages); g_module_symbol (handle, "pk_backend_get_repo_list", (gpointer *)&desc->get_repo_list); g_module_symbol (handle, "pk_backend_required_by", (gpointer *)&desc->required_by); g_module_symbol (handle, "pk_backend_get_roles", (gpointer *)&desc->get_roles); g_module_symbol (handle, "pk_backend_get_provides", (gpointer *)&desc->get_provides); g_module_symbol (handle, "pk_backend_get_update_detail", (gpointer *)&desc->get_update_detail); g_module_symbol (handle, "pk_backend_get_updates", (gpointer *)&desc->get_updates); g_module_symbol (handle, "pk_backend_initialize", (gpointer *)&desc->initialize); g_module_symbol (handle, "pk_backend_install_files", (gpointer *)&desc->install_files); g_module_symbol (handle, "pk_backend_install_packages", (gpointer *)&desc->install_packages); g_module_symbol (handle, "pk_backend_install_signature", (gpointer *)&desc->install_signature); g_module_symbol (handle, "pk_backend_refresh_cache", (gpointer *)&desc->refresh_cache); g_module_symbol (handle, "pk_backend_remove_packages", (gpointer *)&desc->remove_packages); g_module_symbol (handle, "pk_backend_repo_enable", (gpointer *)&desc->repo_enable); g_module_symbol (handle, "pk_backend_repo_set_data", (gpointer *)&desc->repo_set_data); g_module_symbol (handle, "pk_backend_repo_remove", (gpointer *)&desc->repo_remove); g_module_symbol (handle, "pk_backend_resolve", (gpointer *)&desc->resolve); g_module_symbol (handle, "pk_backend_search_details", (gpointer *)&desc->search_details); g_module_symbol (handle, "pk_backend_search_files", (gpointer *)&desc->search_files); g_module_symbol (handle, "pk_backend_search_groups", (gpointer *)&desc->search_groups); g_module_symbol (handle, "pk_backend_search_names", (gpointer *)&desc->search_names); g_module_symbol (handle, "pk_backend_start_job", (gpointer *)&desc->job_start); g_module_symbol (handle, "pk_backend_stop_job", (gpointer *)&desc->job_stop); g_module_symbol (handle, "pk_backend_reset_job", (gpointer *)&desc->job_reset); g_module_symbol (handle, "pk_backend_update_packages", (gpointer *)&desc->update_packages); g_module_symbol (handle, "pk_backend_what_provides", (gpointer *)&desc->what_provides); g_module_symbol (handle, "pk_backend_repair_system", (gpointer *)&desc->repair_system); /* get old static string data */ ret = g_module_symbol (handle, "pk_backend_get_author", (gpointer *)&backend_vfunc); if (ret) desc->author = backend_vfunc (backend); ret = g_module_symbol (handle, "pk_backend_get_description", (gpointer *)&backend_vfunc); if (ret) desc->description = backend_vfunc (backend); /* make available */ backend->priv->desc = desc; } else { g_module_close (handle); g_set_error (error, 1, 0, "could not find description in plugin %s, not loading", backend_name); return FALSE; } /* save the backend name and handle */ g_free (backend->priv->name); backend->priv->name = g_strdup (backend_name); backend->priv->handle = handle; /* initialize if we can */ if (backend->priv->desc->initialize != NULL) { backend->priv->during_initialize = TRUE; backend->priv->desc->initialize (backend->priv->conf, backend); backend->priv->during_initialize = FALSE; } backend->priv->loaded = TRUE; return TRUE; }
/** * pk_backend_get_roles: **/ PkBitfield pk_backend_get_roles (PkBackend *backend) { PkBitfield roles = backend->priv->roles; PkBackendDesc *desc; g_return_val_if_fail (PK_IS_BACKEND (backend), PK_ROLE_ENUM_UNKNOWN); g_return_val_if_fail (backend->priv->loaded, PK_ROLE_ENUM_UNKNOWN); /* optimise - we only skip here if we already loaded backend settings, * so we don't override preexisting settings (e.g. by plugins) */ if (backend->priv->backend_roles_set) goto out; /* not compulsory, but use it if we've got it */ if (backend->priv->desc->get_roles != NULL) { backend->priv->roles = backend->priv->desc->get_roles (backend); pk_bitfield_add (backend->priv->roles, PK_ROLE_ENUM_GET_OLD_TRANSACTIONS); goto out; } /* lets reduce pointer dereferences... */ desc = backend->priv->desc; if (desc->cancel != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_CANCEL); if (desc->depends_on != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_DEPENDS_ON); if (desc->get_details != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_DETAILS); if (desc->get_details_local != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_DETAILS_LOCAL); if (desc->get_files_local != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_FILES_LOCAL); if (desc->get_files != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_FILES); if (desc->required_by != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REQUIRED_BY); if (desc->get_packages != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_PACKAGES); if (desc->what_provides != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_WHAT_PROVIDES); if (desc->get_updates != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_UPDATES); if (desc->get_update_detail != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_UPDATE_DETAIL); if (desc->install_packages != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_INSTALL_PACKAGES); if (desc->install_signature != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_INSTALL_SIGNATURE); if (desc->install_files != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_INSTALL_FILES); if (desc->refresh_cache != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REFRESH_CACHE); if (desc->remove_packages != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REMOVE_PACKAGES); if (desc->download_packages != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_DOWNLOAD_PACKAGES); if (desc->resolve != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_RESOLVE); if (desc->search_details != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_SEARCH_DETAILS); if (desc->search_files != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_SEARCH_FILE); if (desc->search_groups != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_SEARCH_GROUP); if (desc->search_names != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_SEARCH_NAME); if (desc->update_packages != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_UPDATE_PACKAGES); if (desc->get_repo_list != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_REPO_LIST); if (desc->repo_enable != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REPO_ENABLE); if (desc->repo_set_data != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REPO_SET_DATA); if (desc->repo_remove != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REPO_REMOVE); if (desc->get_distro_upgrades != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_DISTRO_UPGRADES); if (desc->get_categories != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_GET_CATEGORIES); if (desc->repair_system != NULL) pk_bitfield_add (roles, PK_ROLE_ENUM_REPAIR_SYSTEM); pk_bitfield_add (roles, PK_ROLE_ENUM_GET_OLD_TRANSACTIONS); backend->priv->roles = roles; backend->priv->backend_roles_set = TRUE; out: return backend->priv->roles; }