plover-gtk/packageset.c
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Feb 20 12:11:02 2010 +0000 (2010-02-20)
changeset 9 8d3b1ddf789c
child 10 8b50be3e2998
permissions -rw-r--r--
First cut at an applications manager
     1 /*
     2  * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
     3  *
     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.
     8  *
     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.
    13  *
    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.
    17  */
    18 
    19 #include "config.h"
    20 #include <stdlib.h>
    21 #include <string.h>
    22 #include <fcntl.h>
    23 #include <errno.h>
    24 #include <glib-object.h>
    25 #include <razor.h>
    26 #include "plover/plover.h"
    27 #include "plover-gtk/error.h"
    28 #include "plover-gtk/packageset.h"
    29 #include "plover-gtk/package.h"
    30 
    31 G_DEFINE_TYPE(PloverPackageSet,plover_package_set,G_TYPE_OBJECT);
    32 
    33 typedef struct _PloverPackageSetPrivate {
    34     struct razor_root *root;
    35     struct razor_set *set;
    36     GSList *packages;
    37 } PloverPackageSetPrivate;
    38 
    39 #define PLOVER_PACKAGE_SET_GET_PRIVATE(obj)\
    40 				G_TYPE_INSTANCE_GET_PRIVATE(obj,\
    41 				  PLOVER_TYPE_PACKAGE_SET,\
    42 				  PloverPackageSetPrivate)
    43 
    44 enum {
    45     CHANGED=0,
    46     N_SIGNALS
    47 };
    48 
    49 static guint signals[N_SIGNALS];
    50 
    51 static void plover_package_set_finalize(GObject *obj)
    52 {
    53     PloverPackageSetPrivate *priv=PLOVER_PACKAGE_SET_GET_PRIVATE(obj);
    54     if (priv->root)
    55     {
    56 	/* priv->set, if set, is owned by priv->root and should not
    57 	 * be destroyed.
    58 	 */
    59 	razor_root_close(priv->root);
    60     }
    61     else if (priv->set)
    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);
    65 }
    66 
    67 static void plover_package_set_dispose(GObject *obj)
    68 {
    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);
    72 }
    73 
    74 static void plover_package_set_class_init(PloverPackageSetClass *klass)
    75 {
    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);
    83 }
    84 
    85 static void plover_package_set_init(PloverPackageSet *set)
    86 {
    87 }
    88 
    89 PloverPackageSet *plover_package_set_new(void)
    90 {
    91     return g_object_new(PLOVER_TYPE_PACKAGE_SET,NULL);
    92 }
    93 
    94 PloverPackageSet *plover_package_set_new_from_installed(const char *root,
    95   GError **err)
    96 {
    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);
   102     if (!priv->root)
   103     {
   104 	g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
   105 	  "Failed to open %s as razor root",root);
   106 	g_object_unref(set);
   107 	return NULL;
   108     }
   109     priv->set=razor_root_get_system_set(priv->root);
   110     if (!priv->set)
   111     {
   112 	g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
   113 	  "Failed to get system set from %s",root);
   114 	g_object_unref(set);
   115 	return NULL;
   116     }
   117     return set;
   118 }
   119 
   120 PloverPackageSet *plover_package_set_new_from_repository(const char *base,
   121   GError **err)
   122 {
   123     int fd;
   124     gchar *s;
   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);
   131     if (chdir(s)<0)
   132     {
   133 	g_set_error(err,G_FILE_ERROR,g_file_error_from_errno(errno),
   134 	  "%s: %s",s,g_strerror(errno));
   135 	g_object_unref(set);
   136 	return NULL;
   137     }
   138     g_free(s);
   139     priv->set=plover_razor_set_create_from_yum("..");
   140     fchdir(fd);
   141     close(fd);
   142     if (!priv->set)
   143     {
   144 	g_set_error(err,PLOVER_RAZOR_ERROR,PLOVER_RAZOR_ERROR_FAILED,
   145 	  "Failed to create package set from repository %s",base);
   146 	g_object_unref(set);
   147 	return NULL;
   148     }
   149     return set;
   150 }
   151 
   152 GSList *plover_package_set_get_packages(PloverPackageSet *set)
   153 {
   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)
   161     {
   162 	iter=razor_package_iterator_create(priv->set);
   163 	while(razor_package_iterator_next(iter,&pkg,RAZOR_DETAIL_LAST))
   164 	{
   165 	    package=plover_package_new(priv->set,pkg);
   166 	    priv->packages=g_slist_prepend(priv->packages,package);
   167 	}
   168 	razor_package_iterator_destroy(iter);
   169     }
   170     return priv->packages;
   171 }