/** * asb_context_add_filename: * @ctx: A #AsbContext * @filename: package filename * @error: A #GError or %NULL * * Adds a filename to the list of packages to be processed * * Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean asb_context_add_filename (AsbContext *ctx, const gchar *filename, GError **error) { g_autoptr(AsbPackage) pkg = NULL; /* can find in existing metadata */ if (asb_context_find_in_cache (ctx, filename)) { g_debug ("Found %s in old metadata", filename); return TRUE; } /* open */ #if HAVE_RPM if (g_str_has_suffix (filename, ".rpm")) pkg = asb_package_rpm_new (); #endif #if HAVE_ALPM if (g_str_has_suffix (filename, ".pkg.tar.xz")) pkg = asb_package_alpm_new (); #endif if (g_str_has_suffix (filename, ".cab")) pkg = asb_package_cab_new (); if (g_str_has_suffix (filename, ".deb")) pkg = asb_package_deb_new (); if (pkg == NULL) { g_set_error (error, ASB_PLUGIN_ERROR, ASB_PLUGIN_ERROR_FAILED, "No idea how to handle %s", filename); return FALSE; } /* add to array */ asb_package_set_filename (pkg, filename); /* failed to guess the nevra */ if (asb_package_get_name (pkg) == NULL) { if (!asb_package_open (pkg, filename, error)) return FALSE; } asb_context_add_package (ctx, pkg); return TRUE; }
/** * asb_package_open: * @pkg: A #AsbPackage * @filename: package filename * @error: A #GError or %NULL * * Opens a package and parses the contents. * As little i/o should be done at this point, and implementations * should rely on asb_package_ensure() to set data. * * Returns: %TRUE for success, %FALSE otherwise * * Since: 0.1.0 **/ gboolean asb_package_open (AsbPackage *pkg, const gchar *filename, GError **error) { AsbPackageClass *klass = ASB_PACKAGE_GET_CLASS (pkg); AsbPackagePrivate *priv = GET_PRIVATE (pkg); /* already open */ if (priv->is_open) return TRUE; priv->is_open = TRUE; /* save filename if not already set */ if (priv->filename == NULL) asb_package_set_filename (pkg, filename); /* call distro-specific method */ if (klass->open != NULL) return klass->open (pkg, filename, error); return TRUE; }