ali@9: /* ali@9: * Copyright (C) 2010 J. Ali Harlow ali@9: * ali@9: * This program is free software; you can redistribute it and/or modify ali@9: * it under the terms of the GNU General Public License as published by ali@9: * the Free Software Foundation; either version 2 of the License, or ali@9: * (at your option) any later version. ali@9: * ali@9: * This program is distributed in the hope that it will be useful, ali@9: * but WITHOUT ANY WARRANTY; without even the implied warranty of ali@9: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ali@9: * GNU General Public License for more details. ali@9: * ali@9: * You should have received a copy of the GNU General Public License along ali@9: * with this program; if not, write to the Free Software Foundation, Inc., ali@9: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ali@9: */ ali@9: ali@9: #include "config.h" ali@9: #include ali@9: #include ali@9: #include ali@9: #include ali@9: #include ali@9: #include ali@9: #include "plover/plover.h" ali@9: #include "plover-gtk/error.h" ali@9: #include "plover-gtk/packageset.h" ali@9: #include "plover-gtk/package.h" ali@9: ali@9: G_DEFINE_TYPE(PloverPackageSet,plover_package_set,G_TYPE_OBJECT); ali@9: ali@9: typedef struct _PloverPackageSetPrivate { ali@9: struct razor_root *root; ali@9: struct razor_set *set; ali@9: GSList *packages; ali@9: } PloverPackageSetPrivate; ali@9: ali@9: #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\ ali@9: G_TYPE_INSTANCE_GET_PRIVATE(obj,\ ali@9: PLOVER_TYPE_PACKAGE_SET,\ ali@9: PloverPackageSetPrivate) ali@9: ali@9: enum { ali@9: CHANGED=0, ali@9: N_SIGNALS ali@9: }; ali@9: ali@9: static guint signals[N_SIGNALS]; ali@9: ali@9: static void plover_package_set_finalize(GObject *obj) ali@9: { ali@9: PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj); ali@9: if (priv->root) ali@9: { ali@9: /* priv->set, if set, is owned by priv->root and should not ali@9: * be destroyed. ali@9: */ ali@9: razor_root_close(priv->root); ali@9: } ali@9: else if (priv->set) ali@9: razor_set_destroy(priv->set); ali@9: if (G_OBJECT_CLASS(plover_package_set_parent_class)->finalize) ali@9: G_OBJECT_CLASS(plover_package_set_parent_class)->finalize(obj); ali@9: } ali@9: ali@9: static void plover_package_set_dispose(GObject *obj) ali@9: { ali@9: PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj); ali@9: if (G_OBJECT_CLASS(plover_package_set_parent_class)->dispose) ali@9: G_OBJECT_CLASS(plover_package_set_parent_class)->dispose(obj); ali@9: } ali@9: ali@9: static void plover_package_set_class_init(PloverPackageSetClass *klass) ali@9: { ali@9: GObjectClass *oclass=G_OBJECT_CLASS(klass); ali@9: oclass->finalize=plover_package_set_finalize; ali@9: oclass->dispose=plover_package_set_dispose; ali@9: g_type_class_add_private(klass,sizeof(PloverPackageSetPrivate)); ali@9: signals[CHANGED]=g_signal_newv("changed", ali@9: G_TYPE_FROM_CLASS(klass),G_SIGNAL_RUN_LAST,NULL,NULL,NULL, ali@9: g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0,NULL); ali@9: } ali@9: ali@9: static void plover_package_set_init(PloverPackageSet *set) ali@9: { ali@9: } ali@9: ali@9: PloverPackageSet *plover_package_set_new(void) ali@9: { ali@9: return g_object_new(PLOVER_TYPE_PACKAGE_SET,NULL); ali@9: } ali@9: ali@9: PloverPackageSet *plover_package_set_new_from_installed(const char *root, ali@9: GError **err) ali@9: { ali@9: PloverPackageSet *set; ali@9: PloverPackageSetPrivate *priv; ali@9: set=plover_package_set_new(); ali@9: priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); ali@9: priv->root=razor_root_open(root); ali@9: if (!priv->root) ali@9: { ali@9: g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, ali@9: "Failed to open %s as razor root",root); ali@9: g_object_unref(set); ali@9: return NULL; ali@9: } ali@9: priv->set=razor_root_get_system_set(priv->root); ali@9: if (!priv->set) ali@9: { ali@9: g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, ali@9: "Failed to get system set from %s",root); ali@9: g_object_unref(set); ali@9: return NULL; ali@9: } ali@9: return set; ali@9: } ali@9: ali@9: PloverPackageSet *plover_package_set_new_from_repository(const char *base, ali@9: GError **err) ali@9: { ali@9: int fd; ali@9: gchar *s; ali@9: PloverPackageSet *set; ali@9: PloverPackageSetPrivate *priv; ali@9: set=plover_package_set_new(); ali@9: priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); ali@9: fd=open(".",O_RDONLY); ali@9: s=g_build_filename(base,"repodata",NULL); ali@9: if (chdir(s)<0) ali@9: { ali@9: g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno), ali@9: "%s: %s",s,g_strerror(errno)); ali@9: g_object_unref(set); ali@9: return NULL; ali@9: } ali@9: g_free(s); ali@9: priv->set=plover_razor_set_create_from_yum(".."); ali@9: fchdir(fd); ali@9: close(fd); ali@9: if (!priv->set) ali@9: { ali@9: g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED, ali@9: "Failed to create package set from repository %s",base); ali@9: g_object_unref(set); ali@9: return NULL; ali@9: } ali@9: return set; ali@9: } ali@9: ali@9: GSList *plover_package_set_get_packages(PloverPackageSet *set) ali@9: { ali@9: struct razor_package_iterator *iter; ali@9: struct razor_package *pkg; ali@9: PloverPackageSetPrivate *priv; ali@9: PloverPackage *package; ali@9: g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),NULL); ali@9: priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set); ali@9: if (priv->set && !priv->packages) ali@9: { ali@9: iter=razor_package_iterator_create(priv->set); ali@9: while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_LAST)) ali@9: { ali@9: package=plover_package_new(priv->set,pkg); ali@9: priv->packages=g_slist_prepend(priv->packages,package); ali@9: } ali@9: razor_package_iterator_destroy(iter); ali@9: } ali@9: return priv->packages; ali@9: }