2 * Copyright (C) 2010 J. Ali Harlow <ali@juiblex.co.uk>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <glib-object.h>
26 #include "plover/plover.h"
27 #include "plover-gtk/error.h"
28 #include "plover-gtk/packageset.h"
29 #include "plover-gtk/package.h"
31 G_DEFINE_TYPE(PloverPackageSet,plover_package_set,G_TYPE_OBJECT);
33 typedef struct _PloverPackageSetPrivate {
34 struct razor_root *root;
35 struct razor_set *set;
37 } PloverPackageSetPrivate;
39 #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\
40 G_TYPE_INSTANCE_GET_PRIVATE(obj,\
41 PLOVER_TYPE_PACKAGE_SET,\
42 PloverPackageSetPrivate)
49 static guint signals[N_SIGNALS];
51 static void plover_package_set_finalize(GObject *obj)
53 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
56 /* priv->set, if set, is owned by priv->root and should not
59 razor_root_close(priv->root);
62 razor_set_destroy(priv->set);
63 if (G_OBJECT_CLASS(plover_package_set_parent_class)->finalize)
64 G_OBJECT_CLASS(plover_package_set_parent_class)->finalize(obj);
67 static void plover_package_set_dispose(GObject *obj)
69 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
70 if (G_OBJECT_CLASS(plover_package_set_parent_class)->dispose)
71 G_OBJECT_CLASS(plover_package_set_parent_class)->dispose(obj);
74 static void plover_package_set_class_init(PloverPackageSetClass *klass)
76 GObjectClass *oclass=G_OBJECT_CLASS(klass);
77 oclass->finalize=plover_package_set_finalize;
78 oclass->dispose=plover_package_set_dispose;
79 g_type_class_add_private(klass,sizeof(PloverPackageSetPrivate));
80 signals[CHANGED]=g_signal_newv("changed",
81 G_TYPE_FROM_CLASS(klass),G_SIGNAL_RUN_LAST,NULL,NULL,NULL,
82 g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0,NULL);
85 static void plover_package_set_init(PloverPackageSet *set)
89 PloverPackageSet *plover_package_set_new(void)
91 return g_object_new(PLOVER_TYPE_PACKAGE_SET,NULL);
94 PloverPackageSet *plover_package_set_new_from_installed(const char *root,
97 PloverPackageSet *set;
98 PloverPackageSetPrivate *priv;
99 set=plover_package_set_new();
100 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
101 priv->root=razor_root_open(root);
104 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
105 "Failed to open %s as razor root",root);
109 priv->set=razor_root_get_system_set(priv->root);
112 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
113 "Failed to get system set from %s",root);
120 PloverPackageSet *plover_package_set_new_from_repository(const char *base,
125 PloverPackageSet *set;
126 PloverPackageSetPrivate *priv;
127 set=plover_package_set_new();
128 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
129 fd=open(".",O_RDONLY);
130 s=g_build_filename(base,"repodata",NULL);
133 g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno),
134 "%s: %s",s,g_strerror(errno));
139 priv->set=plover_razor_set_create_from_yum("..");
144 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
145 "Failed to create package set from repository %s",base);
152 GSList *plover_package_set_get_packages(PloverPackageSet *set)
154 struct razor_package_iterator *iter;
155 struct razor_package *pkg;
156 PloverPackageSetPrivate *priv;
157 PloverPackage *package;
158 g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),NULL);
159 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
160 if (priv->set && !priv->packages)
162 iter=razor_package_iterator_create(priv->set);
163 while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_LAST))
165 package=plover_package_new(priv->set,pkg);
166 priv->packages=g_slist_prepend(priv->packages,package);
168 razor_package_iterator_destroy(iter);
170 return priv->packages;