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;
38 } PloverPackageSetPrivate;
40 #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\
41 G_TYPE_INSTANCE_GET_PRIVATE(obj,\
42 PLOVER_TYPE_PACKAGE_SET,\
43 PloverPackageSetPrivate)
50 static guint signals[N_SIGNALS];
52 static void plover_package_set_finalize(GObject *obj)
54 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
57 /* priv->set, if set, is owned by priv->root and should not
60 razor_root_close(priv->root);
63 razor_set_destroy(priv->set);
64 if (G_OBJECT_CLASS(plover_package_set_parent_class)->finalize)
65 G_OBJECT_CLASS(plover_package_set_parent_class)->finalize(obj);
68 static void plover_package_set_dispose(GObject *obj)
70 PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
71 if (G_OBJECT_CLASS(plover_package_set_parent_class)->dispose)
72 G_OBJECT_CLASS(plover_package_set_parent_class)->dispose(obj);
75 static void plover_package_set_class_init(PloverPackageSetClass *klass)
77 GObjectClass *oclass=G_OBJECT_CLASS(klass);
78 oclass->finalize=plover_package_set_finalize;
79 oclass->dispose=plover_package_set_dispose;
80 g_type_class_add_private(klass,sizeof(PloverPackageSetPrivate));
81 signals[CHANGED]=g_signal_newv("changed",
82 G_TYPE_FROM_CLASS(klass),G_SIGNAL_RUN_LAST,NULL,NULL,NULL,
83 g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0,NULL);
86 static void plover_package_set_init(PloverPackageSet *set)
88 PloverPackageSetPrivate *priv;
89 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
93 PloverPackageSet *plover_package_set_new(void)
95 return g_object_new(PLOVER_TYPE_PACKAGE_SET,NULL);
98 PloverPackageSet *plover_package_set_new_from_installed(const char *root,
101 PloverPackageSet *set;
102 PloverPackageSetPrivate *priv;
103 set=plover_package_set_new();
104 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
105 priv->root=razor_root_open(root);
108 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
109 "Failed to open %s as razor root",root);
113 priv->set=razor_root_get_system_set(priv->root);
116 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
117 "Failed to get system set from %s",root);
124 PloverPackageSet *plover_package_set_new_from_repository(const char *base,
125 struct razor_relocations *relocations,GError **err)
134 struct razor_set *reloc;
135 PloverPackageSet *set;
136 PloverPackageSetPrivate *priv;
137 set=plover_package_set_new();
138 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
140 fd=open(".",O_RDONLY);
144 while (!getcwd(wd,wd_len) && errno==ERANGE)
151 s=g_build_filename(base,"repodata",NULL);
154 g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno),
155 "%s: %s",s,g_strerror(errno));
165 priv->set=plover_razor_set_create_from_yum("..");
173 if (priv->set && relocations)
175 reloc=plover_relocate_packages(priv->set,base,relocations);
176 razor_set_destroy(priv->set);
181 g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
182 "Failed to create package set from repository %s",base);
189 GSList *plover_package_set_get_packages(PloverPackageSet *set)
191 struct razor_package_iterator *iter;
192 struct razor_package *pkg;
193 PloverPackageSetPrivate *priv;
194 PloverPackage *package;
195 g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),NULL);
196 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
197 if (priv->set && !priv->packages)
199 iter=razor_package_iterator_create(priv->set);
200 while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_LAST))
202 package=plover_package_new(priv->set,pkg);
203 priv->packages=g_slist_prepend(priv->packages,package);
205 razor_package_iterator_destroy(iter);
207 return priv->packages;
211 * Some versions of razor have a bug which causes all detail strings
212 * to be discarded. If such a version of razor is used to install or
213 * update a package, then all the detail strings for the installed
214 * set will be lost. This function tests for this condition and can
215 * be used to present something more useful than blank details.
218 gboolean plover_package_set_get_no_details(PloverPackageSet *set)
220 PloverPackageSetPrivate *priv;
221 PloverPackage *package;
222 GSList *packages,*link;
223 g_return_val_if_fail(PLOVER_IS_PACKAGE_SET(set),FALSE);
224 priv=PLOVER_PACKAGE_SET_GET_PRIVATE(set);
225 if (priv->no_details<0)
227 packages=plover_package_set_get_packages(set);
231 for(link=packages;link;link=link->next)
235 if (*plover_package_get_summary(package))
237 if (*plover_package_get_license(package))
239 if (*plover_package_get_description(package))
241 if (*plover_package_get_URL(package))
244 if (priv->no_details<0) /* More than 50% of strings present */
248 return priv->no_details>0;