mail-notification

Fork of Jean-Yves Lefort's mail-notification, a tray icon to notify of new mail
git clone https://code.djc.id.au/git/mail-notification/

jbsrc/lib/src/core/jb-group.c (7117B) - raw

      1 /*
      2  * JB, the Jean-Yves Lefort's Build System
      3  * Copyright (C) 2008 Jean-Yves Lefort <jylefort@brutele.be>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along
     16  * with this program; if not, write to the Free Software Foundation, Inc.,
     17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     18  */
     19 
     20 #include <string.h>
     21 #include "jb-group.h"
     22 #include "jb-feature.h"
     23 #include "jb-variable.h"
     24 #include "jb-util.h"
     25 #include "jb-resource.h"
     26 #include "jb-main.h"
     27 
     28 GSList *jb_groups = NULL;
     29 
     30 JBStringHashSet *jb_templates = NULL;
     31 
     32 G_DEFINE_TYPE(JBGroup, jb_group, G_TYPE_OBJECT)
     33 
     34 static void
     35 jb_group_init (JBGroup *self)
     36 {
     37 }
     38 
     39 static void
     40 jb_group_class_init (JBGroupClass *class)
     41 {
     42 }
     43 
     44 JBGroup *
     45 jb_group_new (const char *name)
     46 {
     47   JBGroup *self;
     48   char *cppflags;
     49   char *gob2flags;
     50 
     51   g_return_val_if_fail(name != NULL, NULL);
     52 
     53   self = g_object_new(JB_TYPE_GROUP, NULL);
     54 
     55   self->name = g_strdup(name);
     56 
     57   self->srcdir = g_strdup(name);
     58   self->builddir = g_strdup_printf("build/%s", self->srcdir);
     59 
     60   self->compile_options = jb_compile_options_new(name);
     61 
     62   /* srcdir for the C headers, builddir for the generated C headers */
     63   cppflags = g_strdup_printf("-I%s -I%s", self->srcdir, self->builddir);
     64   jb_compile_options_add_cppflags(self->compile_options, cppflags);
     65   g_free(cppflags);
     66 
     67   gob2flags = g_strdup_printf("--output-dir=%s", self->builddir);
     68   jb_compile_options_add_gob2flags(self->compile_options, gob2flags);
     69   g_free(gob2flags);
     70 
     71   return self;
     72 }
     73 
     74 void
     75 jb_group_add (JBGroup *group)
     76 {
     77   GSList *l;
     78 
     79   g_return_if_fail(JB_IS_GROUP(group));
     80 
     81   JB_LIST_FOREACH(l, group->resources)
     82     {
     83       JBResource *res = l->data;
     84 
     85       if (JB_IS_TEMPLATE(res))
     86 	{
     87 	  JBTemplate *template = JB_TEMPLATE(res);
     88 	  char *filename;
     89 
     90 	  filename = g_strdup_printf("%s/%s", group->srcdir, template->filename);
     91 
     92 	  if (jb_templates == NULL)
     93 	    jb_templates = jb_string_hash_set_new();
     94 
     95 	  if (! jb_string_hash_set_add(jb_templates, filename))
     96 	    g_error("template file \"%s\" specified multiple times", filename);
     97 
     98 	  g_free(filename);
     99 	}
    100     }
    101 
    102   jb_groups = g_slist_append(jb_groups, group);
    103 }
    104 
    105 JBGroup *
    106 jb_group_get (const char *name)
    107 {
    108   GSList *l;
    109 
    110   g_return_val_if_fail(name != NULL, NULL);
    111 
    112   JB_LIST_FOREACH(l, jb_groups)
    113     {
    114       JBGroup *group = l->data;
    115 
    116       if (! strcmp(group->name, name))
    117 	return group;
    118     }
    119 
    120   return NULL;
    121 }
    122 
    123 void
    124 jb_group_add_resource (JBGroup *self, JBGroupResource *res)
    125 {
    126   g_return_if_fail(JB_IS_GROUP(self));
    127   g_return_if_fail(JB_IS_GROUP_RESOURCE(res));
    128   g_return_if_fail(res->group == NULL);
    129 
    130   res->group = self;
    131 
    132   self->resources = g_slist_append(self->resources, res);
    133 }
    134 
    135 void
    136 jb_group_add_data_file (JBGroup *self,
    137 			const char *file,
    138 			const char *installdir)
    139 {
    140   JBDataFile *data_file;
    141 
    142   g_return_if_fail(JB_IS_GROUP(self));
    143   g_return_if_fail(file != NULL);
    144 
    145   data_file = jb_data_file_new(file);
    146 
    147   jb_install_options_set_installdir(data_file->install_options, installdir);
    148 
    149   jb_group_add_resource(self, JB_GROUP_RESOURCE(data_file));
    150 }
    151 
    152 void
    153 jb_group_add_data_files (JBGroup *self, const char *file, ...)
    154 {
    155   va_list args;
    156 
    157   g_return_if_fail(JB_IS_GROUP(self));
    158 
    159   va_start(args, file);
    160 
    161   while (file != NULL)
    162     {
    163       const char *installdir;
    164 
    165       installdir = va_arg(args, const char *);
    166       g_assert(installdir != NULL);
    167 
    168       jb_group_add_data_file(self, file, installdir);
    169 
    170       file = va_arg(args, const char *);
    171     }
    172 
    173   va_end(args);
    174 }
    175 
    176 void
    177 jb_group_add_data_files_list (JBGroup *self,
    178 			      GSList *files,
    179 			      const char *installdir)
    180 {
    181   GSList *l;
    182 
    183   g_return_if_fail(JB_IS_GROUP(self));
    184 
    185   JB_LIST_FOREACH(l, files)
    186     {
    187       const char *file = l->data;
    188 
    189       jb_group_add_data_file(self, file, installdir);
    190     }
    191 }
    192 
    193 void
    194 jb_group_add_data_files_pattern (JBGroup *self,
    195 				 const char *pattern,
    196 				 const char *installdir)
    197 {
    198   GSList *files;
    199 
    200   g_return_if_fail(JB_IS_GROUP(self));
    201   g_return_if_fail(pattern != NULL);
    202 
    203   /*
    204    * We must chdir to srcdir for matching, because the file list must
    205    * be relative to srcdir.
    206    */
    207   jb_chdir(self->srcdir);
    208   files = jb_match_files(pattern);
    209   jb_chdir(jb_topsrcdir);
    210 
    211   jb_group_add_data_files_list(self, files, installdir);
    212   jb_g_slist_free_deep(files);
    213 }
    214 
    215 void
    216 jb_group_add_dist_file (JBGroup *self, const char *file)
    217 {
    218   g_return_if_fail(JB_IS_GROUP(self));
    219   g_return_if_fail(file != NULL);
    220 
    221   jb_group_add_data_file(self, file, NULL);
    222 }
    223 
    224 void
    225 jb_group_add_dist_files (JBGroup *self, const char *file, ...)
    226 {
    227   va_list args;
    228 
    229   g_return_if_fail(JB_IS_GROUP(self));
    230 
    231   va_start(args, file);
    232 
    233   while (file != NULL)
    234     {
    235       jb_group_add_dist_file(self, file);
    236 
    237       file = va_arg(args, const char *);
    238     }
    239 
    240   va_end(args);
    241 }
    242 
    243 static void
    244 add_intltool_file (JBGroup *self,
    245 		   const char *type,
    246 		   const char *filename,
    247 		   const char *merge_flags,
    248 		   const char *installdir)
    249 {
    250   JBIntltoolFile *file;
    251 
    252   file = jb_intltool_file_new(type, filename, merge_flags);
    253 
    254   jb_install_options_set_installdir(file->install_options, installdir);
    255 
    256   jb_group_add_resource(self, JB_GROUP_RESOURCE(file));
    257 }
    258 
    259 void
    260 jb_group_add_desktop_file (JBGroup *self,
    261 			   const char *filename,
    262 			   const char *installdir)
    263 {
    264   g_return_if_fail(JB_IS_GROUP(self));
    265   g_return_if_fail(filename != NULL);
    266   g_return_if_fail(installdir != NULL);
    267 
    268   add_intltool_file(self,
    269 		    "desktop file",
    270 		    filename,
    271 		    "-d",
    272 		    installdir);
    273 }
    274 
    275 void
    276 jb_group_add_gconf_schemas (JBGroup *self, const char *filename)
    277 {
    278   JBGConfSchemas *schemas;
    279 
    280   g_return_if_fail(JB_IS_GROUP(self));
    281   g_return_if_fail(filename != NULL);
    282   g_return_if_fail(jb_feature_is_enabled(&jb_gconf_feature));
    283   g_return_if_fail(jb_feature_is_enabled(&jb_intltool_feature));
    284   g_return_if_fail(jb_intltool_use_xml);
    285 
    286   schemas = jb_gconf_schemas_new(filename);
    287 
    288   jb_group_add_resource(self, JB_GROUP_RESOURCE(schemas));
    289 }
    290 
    291 void
    292 jb_group_add_bonobo_server (JBGroup *self, const char *filename)
    293 {
    294   g_return_if_fail(JB_IS_GROUP(self));
    295   g_return_if_fail(filename != NULL);
    296   g_return_if_fail(jb_feature_is_enabled(&jb_intltool_feature));
    297   g_return_if_fail(jb_intltool_use_xml);
    298 
    299   add_intltool_file(self,
    300 		    "Bonobo server",
    301 		    filename,
    302 		    "-b",
    303 		    "$libdir/bonobo/servers");
    304 }
    305 
    306 void
    307 jb_group_add_translations (JBGroup *self, const char *languages)
    308 {
    309   char **array;
    310   int i;
    311 
    312   g_return_if_fail(self != NULL);
    313   g_return_if_fail(jb_feature_is_enabled(&jb_gettext_feature));
    314 
    315   array = g_strsplit(languages, " ", 0);
    316   for (i = 0; array[i] != NULL; i++)
    317     jb_group_add_resource(self, JB_GROUP_RESOURCE(jb_translations_new(array[i])));
    318   g_strfreev(array);
    319 }