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/extras/jb-dbus.c (7496B) - 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 "jb-dbus.h"
     21 #include "jb-tests.h"
     22 #include "jb-util.h"
     23 #include "jb-group.h"
     24 #include "jb-action.h"
     25 
     26 static void
     27 dbus_init (void)
     28 {
     29   jb_register_program("dbus-binding-tool", 0);
     30 }
     31 
     32 static void
     33 dbus_configure (void)
     34 {
     35   jb_require_program("dbus-binding-tool");
     36 }
     37 
     38 JBFeature jb_dbus_feature = {
     39   dbus_init,
     40   dbus_configure
     41 };
     42 
     43 G_DEFINE_TYPE(JBDBusInterfaceClient, jb_dbus_interface_client, JB_TYPE_GROUP_RESOURCE)
     44 
     45 JBDBusInterfaceClient *
     46 jb_dbus_interface_client_new (const char *name, const char *client)
     47 {
     48   JBDBusInterfaceClient *self;
     49 
     50   g_return_val_if_fail(name != NULL, NULL);
     51   g_return_val_if_fail(client != NULL, NULL);
     52   g_return_val_if_fail(jb_feature_is_enabled(&jb_dbus_feature), NULL);
     53 
     54   self = g_object_new(JB_TYPE_DBUS_INTERFACE_CLIENT, NULL);
     55   self->name = g_strdup(name);
     56   self->client = g_strdup(client);
     57 
     58   return self;
     59 }
     60 
     61 static char *
     62 dbus_interface_client_to_string (JBResource *res)
     63 {
     64   JBDBusInterfaceClient *self = JB_DBUS_INTERFACE_CLIENT(res);
     65 
     66   return g_strdup_printf("client of D-Bus interface %s", self->name);
     67 }
     68 
     69 static void
     70 dbus_interface_client_get_files (JBDBusInterfaceClient *self,
     71 				 char **xmlfile,
     72 				 char **clientfile)
     73 {
     74   JBGroupResource *gres = JB_GROUP_RESOURCE(self);
     75   char *cprefix;
     76 
     77   cprefix = jb_strdelimit(self->name, ".", '-');
     78   if (xmlfile != NULL)
     79     *xmlfile = g_strdup_printf("%s/%s.xml", gres->group->srcdir, cprefix);
     80   if (clientfile != NULL)
     81     *clientfile = g_strdup_printf("%s/%s", gres->group->builddir, self->client);
     82   g_free(cprefix);
     83 }
     84 
     85 static void
     86 dbus_interface_client_pre_build (JBResource *res)
     87 {
     88   JBDBusInterfaceClient *self = JB_DBUS_INTERFACE_CLIENT(res);
     89   char *xmlfile;
     90   char *clientfile;
     91 
     92   dbus_interface_client_get_files(self, &xmlfile, &clientfile);
     93 
     94   if (! jb_is_uptodate(clientfile, xmlfile))
     95     {
     96       JBGroupResource *gres = JB_GROUP_RESOURCE(res);
     97 
     98       jb_resource_message_building(res);
     99 
    100       jb_mkdir(gres->group->builddir);
    101 
    102       jb_action_exec("$dbus-binding-tool --mode=glib-client $xmlfile > $clientfile.tmp && mv -f $clientfile.tmp $clientfile",
    103 		     "xmlfile", xmlfile,
    104 		     "clientfile", clientfile,
    105 		     NULL);
    106     }
    107 
    108   g_free(xmlfile);
    109   g_free(clientfile);
    110 }
    111 
    112 static void
    113 dbus_interface_client_makedist (JBResource *res)
    114 {
    115   JBDBusInterfaceClient *self = JB_DBUS_INTERFACE_CLIENT(res);
    116   char *xmlfile;
    117 
    118   dbus_interface_client_get_files(self, &xmlfile, NULL);
    119 
    120   jb_action_add_to_dist(xmlfile);
    121 
    122   g_free(xmlfile);
    123 }
    124 
    125 static void
    126 dbus_interface_client_clean (JBResource *res)
    127 {
    128   JBDBusInterfaceClient *self = JB_DBUS_INTERFACE_CLIENT(res);
    129   char *clientfile;
    130 
    131   dbus_interface_client_get_files(self, NULL, &clientfile);
    132 
    133   jb_action_rm(clientfile);
    134 
    135   g_free(clientfile);
    136 }
    137 
    138 static void
    139 jb_dbus_interface_client_init (JBDBusInterfaceClient *self)
    140 {
    141 }
    142 
    143 static void
    144 jb_dbus_interface_client_class_init (JBDBusInterfaceClientClass *class)
    145 {
    146   JBResourceClass *rclass = JB_RESOURCE_CLASS(class);
    147 
    148   rclass->to_string = dbus_interface_client_to_string;
    149   rclass->pre_build = dbus_interface_client_pre_build;
    150   rclass->makedist = dbus_interface_client_makedist;
    151   rclass->clean = dbus_interface_client_clean;
    152 }
    153 
    154 G_DEFINE_TYPE(JBDBusInterfaceServer, jb_dbus_interface_server, JB_TYPE_GROUP_RESOURCE)
    155 
    156 JBDBusInterfaceServer *
    157 jb_dbus_interface_server_new (const char *name,
    158 			      const char *server,
    159 			      const char *server_prefix)
    160 {
    161   JBDBusInterfaceServer *self;
    162 
    163   g_return_val_if_fail(name != NULL, NULL);
    164   g_return_val_if_fail(server != NULL, NULL);
    165   g_return_val_if_fail(server_prefix != NULL, NULL);
    166   g_return_val_if_fail(jb_feature_is_enabled(&jb_dbus_feature), NULL);
    167 
    168   self = g_object_new(JB_TYPE_DBUS_INTERFACE_SERVER, NULL);
    169   self->name = g_strdup(name);
    170   self->server = g_strdup(server);
    171   self->server_prefix = g_strdup(server_prefix);
    172 
    173   return self;
    174 }
    175 
    176 static char *
    177 dbus_interface_server_to_string (JBResource *res)
    178 {
    179   JBDBusInterfaceServer *self = JB_DBUS_INTERFACE_SERVER(res);
    180 
    181   return g_strdup_printf("server of D-Bus interface %s", self->name);
    182 }
    183 
    184 static void
    185 dbus_interface_server_get_files (JBDBusInterfaceServer *self,
    186 				 char **xmlfile,
    187 				 char **serverfile)
    188 {
    189   JBGroupResource *gres = JB_GROUP_RESOURCE(self);
    190   char *cprefix;
    191 
    192   cprefix = jb_strdelimit(self->name, ".", '-');
    193   if (xmlfile != NULL)
    194     *xmlfile = g_strdup_printf("%s/%s.xml", gres->group->srcdir, cprefix);
    195   if (serverfile != NULL)
    196     *serverfile = g_strdup_printf("%s/%s", gres->group->builddir, self->server);
    197   g_free(cprefix);
    198 }
    199 
    200 static void
    201 dbus_interface_server_pre_build (JBResource *res)
    202 {
    203   JBDBusInterfaceServer *self = JB_DBUS_INTERFACE_SERVER(res);
    204   char *xmlfile;
    205   char *serverfile;
    206 
    207   dbus_interface_server_get_files(self, &xmlfile, &serverfile);
    208 
    209   if (! jb_is_uptodate(serverfile, xmlfile))
    210     {
    211       JBGroupResource *gres = JB_GROUP_RESOURCE(res);
    212 
    213       jb_resource_message_building(res);
    214 
    215       jb_mkdir(gres->group->builddir);
    216 
    217       jb_action_exec("$dbus-binding-tool --mode=glib-server --prefix=$server-prefix $xmlfile > $serverfile.tmp && mv -f $serverfile.tmp $serverfile",
    218 		     "server-prefix", self->server_prefix,
    219 		     "xmlfile", xmlfile,
    220 		     "serverfile", serverfile,
    221 		     NULL);
    222     }
    223 
    224   g_free(xmlfile);
    225   g_free(serverfile);
    226 }
    227 
    228 static void
    229 dbus_interface_server_makedist (JBResource *res)
    230 {
    231   JBDBusInterfaceServer *self = JB_DBUS_INTERFACE_SERVER(res);
    232   char *xmlfile;
    233 
    234   dbus_interface_server_get_files(self, &xmlfile, NULL);
    235 
    236   jb_action_add_to_dist(xmlfile);
    237 
    238   g_free(xmlfile);
    239 }
    240 
    241 static void
    242 dbus_interface_server_clean (JBResource *res)
    243 {
    244   JBDBusInterfaceServer *self = JB_DBUS_INTERFACE_SERVER(res);
    245   char *serverfile;
    246 
    247   dbus_interface_server_get_files(self, NULL, &serverfile);
    248 
    249   jb_action_rm(serverfile);
    250 
    251   g_free(serverfile);
    252 }
    253 
    254 static void
    255 jb_dbus_interface_server_init (JBDBusInterfaceServer *self)
    256 {
    257 }
    258 
    259 static void
    260 jb_dbus_interface_server_class_init (JBDBusInterfaceServerClass *class)
    261 {
    262   JBResourceClass *rclass = JB_RESOURCE_CLASS(class);
    263 
    264   rclass->to_string = dbus_interface_server_to_string;
    265   rclass->pre_build = dbus_interface_server_pre_build;
    266   rclass->makedist = dbus_interface_server_makedist;
    267   rclass->clean = dbus_interface_server_clean;
    268 }
    269 
    270 void
    271 jb_group_add_dbus_interface (JBGroup *self,
    272 			     const char *name,
    273 			     const char *client,
    274 			     const char *server,
    275 			     const char *server_prefix)
    276 {
    277   g_return_if_fail(JB_IS_GROUP(self));
    278   g_return_if_fail(name != NULL);
    279 
    280   if (client != NULL)
    281     jb_group_add_resource(self, JB_GROUP_RESOURCE(jb_dbus_interface_client_new(name, client)));
    282   if (server != NULL)
    283     jb_group_add_resource(self, JB_GROUP_RESOURCE(jb_dbus_interface_server_new(name, server, server_prefix)));
    284 }