summaryrefslogtreecommitdiff
path: root/backend/pkgtools.cc
diff options
context:
space:
mode:
Diffstat (limited to 'backend/pkgtools.cc')
-rw-r--r--backend/pkgtools.cc175
1 files changed, 175 insertions, 0 deletions
diff --git a/backend/pkgtools.cc b/backend/pkgtools.cc
new file mode 100644
index 0000000..083036a
--- /dev/null
+++ b/backend/pkgtools.cc
@@ -0,0 +1,175 @@
+#include <curl/curl.h>
+#include <sqlite3.h>
+#include "pkgtools.h"
+#include "utils.h"
+
+namespace slack {
+
+/**
+ * slack::Pkgtools::download:
+ * @job: A #PkBackendJob.
+ * @dest_dir_name: Destination directory.
+ * @pkg_name: Package name.
+ *
+ * Download a package.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise.
+ **/
+gboolean
+Pkgtools::download (PkBackendJob *job,
+ gchar *dest_dir_name, gchar *pkg_name) noexcept
+{
+ gchar *dest_filename, *source_url;
+ gboolean ret = FALSE;
+ sqlite3_stmt *statement = NULL;
+ CURL *curl = NULL;
+ auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
+
+ if ((sqlite3_prepare_v2(job_data->db,
+ "SELECT location, (full_name || '.' || ext) FROM pkglist "
+ "WHERE name LIKE @name AND repo_order = @repo_order",
+ -1,
+ &statement,
+ NULL) != SQLITE_OK))
+ return FALSE;
+
+ sqlite3_bind_text(statement, 1, pkg_name, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_int(statement, 2, this->get_order ());
+
+ if (sqlite3_step(statement) == SQLITE_ROW)
+ {
+ dest_filename = g_build_filename(dest_dir_name, sqlite3_column_text(statement, 1), NULL);
+ source_url = g_strconcat(this->get_mirror (),
+ sqlite3_column_text(statement, 0),
+ "/",
+ sqlite3_column_text(statement, 1),
+ NULL);
+
+ if (!g_file_test(dest_filename, G_FILE_TEST_EXISTS))
+ {
+ if (get_file(&curl, source_url, dest_filename) == CURLE_OK)
+ {
+ ret = TRUE;
+ }
+ }
+ else
+ {
+ ret = TRUE;
+ }
+
+ if (curl)
+ {
+ curl_easy_cleanup(curl);
+ }
+ g_free(source_url);
+ g_free(dest_filename);
+ }
+ sqlite3_finalize(statement);
+
+ return ret;
+}
+
+/**
+ * slack::Pkgtools::install:
+ * @job: A #PkBackendJob.
+ * @pkg_name: Package name.
+ *
+ * Install a package.
+ **/
+void
+Pkgtools::install (PkBackendJob *job, gchar *pkg_name) noexcept
+{
+ gchar *pkg_filename, *cmd_line;
+ sqlite3_stmt *statement = NULL;
+ auto job_data = static_cast<JobData *> (pk_backend_job_get_user_data(job));
+
+ if ((sqlite3_prepare_v2(job_data->db,
+ "SELECT (full_name || '.' || ext) FROM pkglist "
+ "WHERE name LIKE @name AND repo_order = @repo_order",
+ -1,
+ &statement,
+ NULL) != SQLITE_OK))
+ {
+ return;
+ }
+
+ sqlite3_bind_text(statement, 1, pkg_name, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_int(statement, 2, this->get_order ());
+
+ if (sqlite3_step(statement) == SQLITE_ROW)
+ {
+ pkg_filename = g_build_filename(LOCALSTATEDIR,
+ "cache",
+ "PackageKit",
+ "downloads",
+ sqlite3_column_text(statement, 0),
+ NULL);
+ cmd_line = g_strconcat("/sbin/upgradepkg --install-new ", pkg_filename, NULL);
+ g_spawn_command_line_sync(cmd_line, NULL, NULL, NULL, NULL);
+ g_free(cmd_line);
+
+ g_free(pkg_filename);
+ }
+ sqlite3_finalize(statement);
+}
+
+Pkgtools::~Pkgtools () noexcept
+{
+}
+
+/**
+ * slack::Pkgtools::get_name:
+ *
+ * Retrieves the repository name.
+ *
+ * Returns: Repository name.
+ **/
+const gchar *
+Pkgtools::get_name () const noexcept
+{
+ return this->name;
+}
+
+/**
+ * slack::Pkgtools::get_mirror:
+ *
+ * Retrieves the repository mirror.
+ *
+ * Returns: Repository mirror.
+ **/
+const gchar *
+Pkgtools::get_mirror () const noexcept
+{
+ return this->mirror;
+}
+
+/**
+ * slack::Pkgtools::get_order:
+ *
+ * Retrieves the repository order.
+ *
+ * Returns: Repository order.
+ **/
+guint8
+Pkgtools::get_order () const noexcept
+{
+ return this->order;
+}
+
+/**
+ * slack::Pkgtools:is_blacklisted:
+ * @pkg: Package name to check for.
+ *
+ * Checks whether a package is blacklisted.
+ *
+ * Returns: %TRUE if the package is blacklisted, %FALSE otherwise.
+ **/
+gboolean
+Pkgtools::is_blacklisted (const gchar *pkg) const noexcept
+{
+ return this->blacklist
+ && g_regex_match (this->blacklist,
+ pkg, static_cast<GRegexMatchFlags> (0), NULL);
+}
+
+}