~cairo-dock-team/ubuntu/precise/cairo-dock-plug-ins/3.0.0.0rc1

« back to all changes in this revision

Viewing changes to Dbus/src/applet-dbus.c

  • Committer: Kees Cook
  • Date: 2011-08-11 23:17:39 UTC
  • mfrom: (20.1.1 cairo-dock-plug-ins)
  • Revision ID: kees@outflux.net-20110811231739-cteedan51tmdg77v
Tags: 2.4.0~0beta2-0ubuntu1
releasing version 2.4.0~0beta2-0ubuntu1

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
#define __USE_POSIX
39
39
#include <signal.h>  // kill
40
40
#include <glib.h>
 
41
#include <glib/gstdio.h>
41
42
#include <dbus/dbus-glib.h>
42
43
#include <dbus/dbus-glib-bindings.h>
43
44
 
47
48
#include "interface-applet-signals.h"
48
49
#include "applet-dbus.h"
49
50
 
 
51
#define DISTANT_DIR "2.4.0"
 
52
#define GETTEXT_NAME_EXTRAS "cairo-dock-plugins-extra"
 
53
#define LOCALE_DIR_NAME "locale"
50
54
 
51
55
  ///////////////////
52
56
 /// MAIN OBJECT ///
82
86
        
83
87
        //\_____________ On initialise l'icone.
84
88
        cd_dbus_action_on_init_module (pModuleInstance);
85
 
        
86
89
        //\_____________ On cree l'objet sur le bus.
87
90
        dbusApplet *pDbusApplet = cd_dbus_create_remote_applet_object (pModuleInstance);
88
91
        g_return_if_fail (pDbusApplet != NULL);
91
94
        if (pKeyFile != NULL)
92
95
        {
93
96
                if (cairo_dock_conf_file_needs_update (pKeyFile, pModuleInstance->pModule->pVisitCard->cModuleVersion))
94
 
                        cairo_dock_flush_conf_file (pKeyFile, pModuleInstance->cConfFilePath, pModuleInstance->pModule->pVisitCard->cShareDataDir, pModuleInstance->pModule->pVisitCard->cConfFileName);
 
97
                {
 
98
                        ///cairo_dock_flush_conf_file (pKeyFile, pModuleInstance->cConfFilePath, pModuleInstance->pModule->pVisitCard->cShareDataDir, pModuleInstance->pModule->pVisitCard->cConfFileName);
 
99
                        gchar *cTemplate = g_strdup_printf ("%s/%s", pModuleInstance->pModule->pVisitCard->cShareDataDir, pModuleInstance->pModule->pVisitCard->cConfFileName);
 
100
                        cairo_dock_upgrade_conf_file (pModuleInstance->cConfFilePath, pKeyFile, cTemplate);
 
101
                        g_free (cTemplate);
 
102
                }
95
103
        }
96
104
        
97
105
        //\_____________ On (re)lance l'executable de l'applet.
122
130
                pVisitCard->iMinorVersionNeeded = 1;
123
131
                pVisitCard->iMicroVersionNeeded = 1;
124
132
                pVisitCard->cPreviewFilePath = cShareDataDir ? g_strdup_printf ("%s/preview", cShareDataDir) : NULL;
125
 
                pVisitCard->cGettextDomain = g_strdup_printf ("cd-%s", cModuleName);
 
133
                pVisitCard->cGettextDomain = g_strdup (GETTEXT_NAME_EXTRAS);
126
134
                pVisitCard->cUserDataDir = g_strdup (cModuleName);
127
135
                pVisitCard->cShareDataDir = g_strdup (cShareDataDir);
128
136
                pVisitCard->cConfFileName = g_strdup_printf ("%s.conf", cModuleName);
219
227
        return bActivationOk;
220
228
}
221
229
 
222
 
static void _cd_dbus_register_all_applets_in_dir (const gchar *cDirPath)
 
230
static gboolean _cd_dbus_register_all_applets_in_dir (const gchar *cDirPath)
223
231
{
 
232
        gboolean bAppletRegistered = FALSE;
224
233
        const gchar *cFileName;
225
234
        gchar *cThirdPartyPath = g_strdup_printf ("%s/%s", cDirPath, CD_DBUS_APPLETS_FOLDER);
226
235
        
227
 
        GDir *dir = g_dir_open (cThirdPartyPath, 0, NULL);  // si le repertoire n'existe pas, on ne veut de warning.
 
236
        GDir *dir = g_dir_open (cThirdPartyPath, 0, NULL);  // si le repertoire n'existe pas, on ne veut pas de warning.
228
237
        if (dir == NULL)
229
238
        {
230
239
                g_free (cThirdPartyPath);
231
 
                return ;
 
240
                return bAppletRegistered;
232
241
        }
233
242
 
234
243
        do
236
245
                cFileName = g_dir_read_name (dir);
237
246
                if (cFileName == NULL)
238
247
                        break ;
239
 
        
240
 
                cd_dbus_register_module_in_dir (cFileName, cThirdPartyPath);
 
248
                
 
249
                if (strcmp (cFileName, LOCALE_DIR_NAME) != 0)
 
250
                        bAppletRegistered |= cd_dbus_register_module_in_dir (cFileName, cThirdPartyPath);
241
251
        }
242
252
        while (1);
243
253
        g_dir_close (dir);
244
254
        g_free (cThirdPartyPath);
 
255
        return bAppletRegistered;
245
256
}
246
257
 
247
258
 
253
264
{
254
265
        const gchar *cSharePackagesDir = MY_APPLET_SHARE_DATA_DIR"/"CD_DBUS_APPLETS_FOLDER;
255
266
        gchar *cUserPackagesDir = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, CD_DBUS_APPLETS_FOLDER);
256
 
        gchar *cDistantPackagesDir = g_strdup_printf ("%s/%d.%d.%d", CD_DBUS_APPLETS_FOLDER, g_iMajorVersion, g_iMinorVersion, g_iMicroVersion);
257
 
        gchar *cPath = cairo_dock_get_package_path (cModuleName, cSharePackagesDir, cUserPackagesDir, cDistantPackagesDir,  CAIRO_DOCK_UPDATED_PACKAGE);
 
267
        ///gchar *cDistantPackagesDir = g_strdup_printf ("%s/%d.%d.%d", CD_DBUS_APPLETS_FOLDER, g_iMajorVersion, g_iMinorVersion, g_iMicroVersion);
 
268
        const gchar *cDistantPackagesDir = CD_DBUS_APPLETS_FOLDER"/"DISTANT_DIR;
 
269
        gchar *cPath = cairo_dock_get_package_path (cModuleName,
 
270
                cSharePackagesDir,
 
271
                cUserPackagesDir,
 
272
                cDistantPackagesDir,
 
273
                CAIRO_DOCK_UPDATED_PACKAGE);
258
274
        cd_debug ("*** update of the applet '%s' -> got '%s'\n", cModuleName, cPath);
259
275
        g_free (cPath);
260
276
        g_free (cUserPackagesDir);
261
 
        g_free (cDistantPackagesDir);
 
277
        //g_free (cDistantPackagesDir);
262
278
}
263
279
static gboolean _apply_package_update (gchar *cModuleName)
264
280
{
265
281
        CairoDockModule *pModule = cairo_dock_find_module_from_name (cModuleName);
266
 
        g_return_val_if_fail (pModule != NULL, TRUE);
267
282
        
268
 
        if (pModule->pInstancesList != NULL)  // applet active => on la recharge.
 
283
        if (pModule && pModule->pInstancesList != NULL)  // applet active => reload it (pModule can be NULL in case of "locale").
269
284
        {
270
285
                cd_debug ("*** applet '%s' is active, reload it", cModuleName);
271
286
                CairoDockModuleInstance *pModuleInstance = pModule->pInstancesList->data;
424
439
        const gchar *cProgName = g_get_prgname ();
425
440
        g_return_if_fail (cProgName != NULL);
426
441
        int n = strlen (cProgName);
427
 
        gchar *cName1 = g_new0 (gchar, n+1);
428
 
        gchar *cName2 = g_new0 (gchar, n+1);
 
442
        gchar *cName1 = g_new0 (gchar, n+1);  // prog name without '-' and '_'
 
443
        gchar *cName2 = g_new0 (gchar, n+1);  // same but with upper char after the '-' and '_'
429
444
        int i, k=0;
430
445
        for (i = 0; i < n; i ++)
431
446
        {
450
465
        cairo_dock_register_service_name ("org.cairodock.CairoDock");  /// what happens if the gldi instance that had registered the name quits while a 2nd instance remains ? do we need to queue ?...
451
466
        
452
467
        //\____________ create the main object on the bus.
453
 
        myData.pMainObject = g_object_new (cd_dbus_main_get_type(), NULL);  // appelle cd_dbus_main_class_init() et cd_dbus_main_init().
 
468
        myData.pMainObject = g_object_new (cd_dbus_main_get_type(), NULL);  // call cd_dbus_main_class_init() and cd_dbus_main_init().
454
469
        
455
470
        //\____________ register the applets installed in the default folders.
456
 
        _cd_dbus_register_all_applets_in_dir (MY_APPLET_SHARE_DATA_DIR);
457
 
        
458
 
        _cd_dbus_register_all_applets_in_dir (g_cCairoDockDataDir);
 
471
        gboolean bAppletRegistered = FALSE;
 
472
        bAppletRegistered |= _cd_dbus_register_all_applets_in_dir (MY_APPLET_SHARE_DATA_DIR);
 
473
        
 
474
        bAppletRegistered |= _cd_dbus_register_all_applets_in_dir (g_cCairoDockDataDir);
 
475
        
 
476
        //\____________ internationalize the applets.
 
477
        gchar *cLocaleDir = g_strdup_printf ("%s/"CD_DBUS_APPLETS_FOLDER"/"LOCALE_DIR_NAME, g_cCairoDockDataDir);  // user version of /usr/share/locale
 
478
        if (! g_file_test (cLocaleDir, G_FILE_TEST_EXISTS))  // translations not downloaded yet.
 
479
        {
 
480
                gchar *cUserAppletsFolder = g_strdup_printf ("%s/"CD_DBUS_APPLETS_FOLDER, g_cCairoDockDataDir);
 
481
                if (! g_file_test (cUserAppletsFolder, G_FILE_TEST_EXISTS))
 
482
                {
 
483
                        if (g_mkdir (cUserAppletsFolder, 7*8*8+7*8+5) != 0)  // create an empty folder; since there is no date file, the "locale" package will be seen as "to be updated" by the package manager, and will therefore download it.
 
484
                                cd_warning ("couldn't create '%s'; third-party applets can't be added", cUserAppletsFolder);
 
485
                }
 
486
                g_free (cUserAppletsFolder);
 
487
                
 
488
                if (g_mkdir (cLocaleDir, 7*8*8+7*8+5) != 0)  // create an empty folder; since there is no date file, the "locale" package will be seen as "to be updated" by the package manager, and will therefore download it.
 
489
                        cd_warning ("couldn't create '%s'; applets won't be translated", cLocaleDir);
 
490
        }
 
491
        bindtextdomain (GETTEXT_NAME_EXTRAS, cLocaleDir);  // bind the applets' domain to the user locale folder.
 
492
        bind_textdomain_codeset (GETTEXT_NAME_EXTRAS, "UTF-8");
 
493
        g_free (cLocaleDir);
459
494
        
460
495
        //\____________ download in background the list of existing applets.
461
 
        const gchar *cSharePackagesDir = NULL;  // MY_APPLET_SHARE_DATA_DIR"/"CD_DBUS_APPLETS_FOLDER;
462
 
        gchar *cUserPackagesDir = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, CD_DBUS_APPLETS_FOLDER);
463
 
        gchar *cDistantPackagesDir = g_strdup_printf ("%s/%d.%d.%d", CD_DBUS_APPLETS_FOLDER, g_iMajorVersion, g_iMinorVersion, g_iMicroVersion);
464
 
        myData.pGetListTask = cairo_dock_list_packages_async (cSharePackagesDir,
465
 
                cUserPackagesDir,
466
 
                cDistantPackagesDir,
467
 
                (CairoDockGetPackagesFunc) _on_got_list,
468
 
                NULL,  // data
469
 
                NULL);  // table
470
 
        g_free (cUserPackagesDir);
471
 
        g_free (cDistantPackagesDir);
 
496
        if (bAppletRegistered)  // only if some third-party applets are present on the disk.
 
497
        {
 
498
                const gchar *cSharePackagesDir = NULL;  // no share data dir, since we can't write in /usr
 
499
                gchar *cUserPackagesDir = g_strdup_printf ("%s/%s", g_cCairoDockDataDir, CD_DBUS_APPLETS_FOLDER);
 
500
                const gchar *cDistantPackagesDir = CD_DBUS_APPLETS_FOLDER"/"DISTANT_DIR;
 
501
                myData.pGetListTask = cairo_dock_list_packages_async (cSharePackagesDir,
 
502
                        cUserPackagesDir,
 
503
                        cDistantPackagesDir,
 
504
                        (CairoDockGetPackagesFunc) _on_got_list,
 
505
                        NULL,  // data
 
506
                        NULL);  // table
 
507
                g_free (cUserPackagesDir);
 
508
        }
472
509
}
473
510
 
474
511