~ubuntu-branches/ubuntu/lucid/desktop-file-utils/lucid

« back to all changes in this revision

Viewing changes to src/install.c

  • Committer: Bazaar Package Importer
  • Author(s): Baptiste Mille-Mathias
  • Date: 2007-06-11 08:58:58 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070611085858-o940g2g5h9telh2c
Tags: 0.13-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
#include <config.h>
3
3
 
4
4
#include <glib.h>
 
5
#include <glib/gstdio.h>
5
6
#include <glib/gi18n.h>
6
7
 
7
 
#include "desktop_file.h"
8
 
#include "validate.h"
9
 
 
10
8
#include <stdlib.h>
11
9
#include <string.h>
12
10
#include <errno.h>
14
12
#include <sys/stat.h>
15
13
#include <locale.h>
16
14
 
 
15
#include "keyfileutils.h"
 
16
#include "validate.h"
 
17
 
17
18
static const char** args = NULL;
18
19
static gboolean delete_original = FALSE;
19
20
static gboolean copy_generic_name_to_name = FALSE;
92
93
  char *new_filename;
93
94
  char *dirname;
94
95
  char *basename;
95
 
  GnomeDesktopFile *df = NULL;
 
96
  GKeyFile *kf = NULL;
96
97
  GError *rebuild_error;
97
98
  GSList *tmp;
98
99
  
99
 
  g_assert (vendor_name);
100
 
 
101
 
  dirname = g_path_get_dirname (filename);
102
 
  basename = g_path_get_basename (filename);
103
 
  
104
 
  if (!g_str_has_prefix (basename, vendor_name))
105
 
    {
106
 
      char *new_base;
107
 
      new_base = g_strconcat (vendor_name, "-", basename, NULL);
108
 
      new_filename = g_build_filename (target_dir, new_base, NULL);
109
 
      g_free (new_base);
110
 
    }
111
 
  else
112
 
    {
113
 
      new_filename = g_build_filename (target_dir, basename, NULL);
114
 
    }
115
 
 
116
 
  g_free (dirname);
117
 
  g_free (basename);
118
 
 
119
 
  df = gnome_desktop_file_load (filename, err);
120
 
  if (df == NULL)
121
 
    goto cleanup;
122
 
 
123
 
  if (!desktop_file_fixup (df, filename))
 
100
  kf = g_key_file_new ();
 
101
  if (!g_key_file_load_from_file (kf, filename,
 
102
                                  G_KEY_FILE_KEEP_COMMENTS|
 
103
                                  G_KEY_FILE_KEEP_TRANSLATIONS,
 
104
                                  NULL)) {
 
105
    g_key_file_free (kf);
 
106
    return;
 
107
  }
 
108
 
 
109
  if (!desktop_file_fixup (kf, filename)) {
 
110
    g_key_file_free (kf);
124
111
    exit (1);
 
112
  }
125
113
 
126
114
  if (copy_name_to_generic_name)
127
 
    gnome_desktop_file_copy_key (df, NULL, "Name", "GenericName");
 
115
    dfu_key_file_copy_key (kf, GROUP_DESKTOP_ENTRY, "Name",
 
116
                               GROUP_DESKTOP_ENTRY, "GenericName");
128
117
 
129
118
  if (copy_generic_name_to_name)
130
 
    gnome_desktop_file_copy_key (df, NULL, "GenericName", "Name");
 
119
    dfu_key_file_copy_key (kf, GROUP_DESKTOP_ENTRY, "GenericName",
 
120
                               GROUP_DESKTOP_ENTRY, "Name");
131
121
  
132
122
  /* Mark file as having been processed by us, so automated
133
123
   * tools can check that desktop files went through our
134
124
   * munging
135
125
   */
136
 
  gnome_desktop_file_set_raw (df, NULL, "X-Desktop-File-Install-Version", NULL, VERSION);
 
126
  g_key_file_set_string (kf, GROUP_DESKTOP_ENTRY,
 
127
                         "X-Desktop-File-Install-Version", VERSION);
137
128
 
138
129
  /* Add categories */
139
130
  tmp = added_categories;
140
131
  while (tmp != NULL)
141
132
    {
142
 
      gnome_desktop_file_merge_string_into_list (df, NULL, "Categories",
143
 
                                                 NULL, tmp->data);
 
133
      dfu_key_file_merge_list (kf, GROUP_DESKTOP_ENTRY,
 
134
                               "Categories", tmp->data);
144
135
 
145
136
      tmp = tmp->next;
146
137
    }
149
140
  tmp = removed_categories;
150
141
  while (tmp != NULL)
151
142
    {
152
 
      gnome_desktop_file_remove_string_from_list (df, NULL, "Categories",
153
 
                                                  NULL, tmp->data);
 
143
      dfu_key_file_remove_list (kf, GROUP_DESKTOP_ENTRY,
 
144
                                "Categories", tmp->data);
154
145
 
155
146
      tmp = tmp->next;
156
147
    }
159
150
  tmp = added_only_show_in;
160
151
  while (tmp != NULL)
161
152
    {
162
 
      gnome_desktop_file_merge_string_into_list (df, NULL, "OnlyShowIn",
163
 
                                                 NULL, tmp->data);
 
153
      dfu_key_file_merge_list (kf, GROUP_DESKTOP_ENTRY,
 
154
                               "OnlyShowIn", tmp->data);
164
155
 
165
156
      tmp = tmp->next;
166
157
    }
169
160
  tmp = removed_only_show_in;
170
161
  while (tmp != NULL)
171
162
    {
172
 
      gnome_desktop_file_remove_string_from_list (df, NULL, "OnlyShowIn",
173
 
                                                  NULL, tmp->data);
 
163
      dfu_key_file_remove_list (kf, GROUP_DESKTOP_ENTRY,
 
164
                                "OnlyShowIn", tmp->data);
174
165
 
175
166
      tmp = tmp->next;
176
167
    }
179
170
  tmp = removed_keys;
180
171
  while (tmp != NULL)
181
172
    {
182
 
      gnome_desktop_file_unset (df, NULL, tmp->data);
183
 
      
 
173
      g_key_file_remove_key (kf, GROUP_DESKTOP_ENTRY, tmp->data, NULL);
 
174
 
184
175
      tmp = tmp->next;
185
176
    }
186
177
 
188
179
  tmp = added_mime_types;
189
180
  while (tmp != NULL)
190
181
    {
191
 
      gnome_desktop_file_merge_string_into_list (df, NULL, "MimeType",
192
 
                                                 NULL, tmp->data);
 
182
      dfu_key_file_merge_list (kf, GROUP_DESKTOP_ENTRY,
 
183
                               "MimeType", tmp->data);
193
184
 
194
185
      tmp = tmp->next;
195
186
    }
198
189
  tmp = removed_mime_types;
199
190
  while (tmp != NULL)
200
191
    {
201
 
      gnome_desktop_file_remove_string_from_list (df, NULL, "MimeType",
202
 
                                                  NULL, tmp->data);
 
192
      dfu_key_file_remove_list (kf, GROUP_DESKTOP_ENTRY,
 
193
                                "MimeType", tmp->data);
203
194
 
204
195
      tmp = tmp->next;
205
196
    }
206
197
 
207
198
 
208
 
  
209
 
  if (!gnome_desktop_file_save (df, new_filename,
210
 
                                permissions, err))
211
 
    goto cleanup;
212
 
  
 
199
  dirname = g_path_get_dirname (filename);
 
200
  basename = g_path_get_basename (filename);
 
201
  
 
202
  if (vendor_name && !g_str_has_prefix (basename, vendor_name))
 
203
    {
 
204
      char *new_base;
 
205
      new_base = g_strconcat (vendor_name, "-", basename, NULL);
 
206
      new_filename = g_build_filename (target_dir, new_base, NULL);
 
207
      g_free (new_base);
 
208
    }
 
209
  else
 
210
    {
 
211
      new_filename = g_build_filename (target_dir, basename, NULL);
 
212
    }
 
213
 
 
214
  g_free (dirname);
 
215
  g_free (basename);
 
216
  
 
217
  if (!dfu_key_file_to_file (kf, new_filename, err)) {
 
218
    g_key_file_free (kf);
 
219
    g_free (new_filename);
 
220
    return;
 
221
  }
 
222
  
 
223
  g_key_file_free (kf);
 
224
 
 
225
  if (g_chmod (new_filename, permissions) < 0)
 
226
    {
 
227
      g_set_error (err, G_FILE_ERROR,
 
228
                   g_file_error_from_errno (errno),
 
229
                   _("Failed to set permissions %o on \"%s\": %s"),
 
230
                   permissions, new_filename, g_strerror (errno));
 
231
 
 
232
      g_unlink (new_filename);
 
233
      g_free (new_filename);
 
234
      return;
 
235
    }
 
236
 
213
237
  if (delete_original &&
214
238
      !files_are_the_same (filename, new_filename))
215
239
    {
216
 
      if (unlink (filename) < 0)
 
240
      if (g_unlink (filename) < 0)
217
241
        g_printerr (_("Error removing original file \"%s\": %s\n"),
218
242
                    filename, g_strerror (errno));
219
243
    }
220
244
 
221
 
  gnome_desktop_file_free (df);
222
 
 
223
245
  /* Load and validate the file we just wrote */
224
 
  df = gnome_desktop_file_load (new_filename, err);
225
 
  if (df == NULL)
226
 
    goto cleanup;
227
 
  
228
 
  if (!desktop_file_validate (df, new_filename))
 
246
  if (!desktop_file_validate (new_filename, FALSE, TRUE))
229
247
    {
230
248
      g_printerr (_("desktop-file-install created an invalid desktop file!\n"));
 
249
      g_free (new_filename);
231
250
      exit (1);
232
251
    }
233
252
 
240
259
        g_propagate_error (err, rebuild_error);
241
260
    }
242
261
  
243
 
 cleanup:
244
262
  g_free (new_filename);
245
 
  
246
 
  if (df)
247
 
    gnome_desktop_file_free (df);
248
263
}
249
264
 
250
265
static gboolean parse_options_callback (const gchar  *option_name,
323
338
    G_OPTION_ARG_CALLBACK,
324
339
    parse_options_callback,
325
340
    N_("Specify a category to be added to the Categories field."),
326
 
    NULL
 
341
    N_("CATEGORY")
327
342
  },
328
343
  {
329
344
#define OPTION_REMOVE_CATEGORY "remove-category"
333
348
    G_OPTION_ARG_CALLBACK,
334
349
    parse_options_callback,
335
350
    N_("Specify a category to be removed from the Categories field."),
336
 
    NULL
 
351
    N_("CATEGORY")
337
352
  },
338
353
  {
339
354
#define OPTION_ADD_ONLY_SHOW_IN "add-only-show-in"
343
358
    G_OPTION_ARG_CALLBACK,
344
359
    parse_options_callback,
345
360
    N_("Specify a product name to be added to the OnlyShowIn field."),
346
 
    NULL
 
361
    N_("PRODUCT")
347
362
  },
348
363
  {
349
364
#define OPTION_REMOVE_ONLY_SHOW_IN "remove-only-show-in"
353
368
    G_OPTION_ARG_CALLBACK,
354
369
    parse_options_callback,
355
370
    N_("Specify a product name to be removed from the OnlyShowIn field."),
356
 
    NULL
 
371
    N_("PRODUCT")
357
372
  },
358
373
  {
359
374
    "copy-name-to-generic-name",
381
396
    G_OPTION_ARG_CALLBACK,
382
397
    parse_options_callback,
383
398
    N_("Specify a field to be removed from the desktop file."),
384
 
    NULL
 
399
    N_("KEY")
385
400
  },
386
401
  {
387
402
#define OPTION_ADD_MIME_TYPE "add-mime-type"
391
406
    G_OPTION_ARG_CALLBACK,
392
407
    parse_options_callback,
393
408
    N_("Specify a mime-type to be added to the MimeType field."),
394
 
    NULL
 
409
    N_("MIME-TYPE")
395
410
  },
396
411
  {
397
412
#define OPTION_REMOVE_MIME_TYPE "remove-mime-type"
401
416
    G_OPTION_ARG_CALLBACK,
402
417
    parse_options_callback,
403
418
    N_("Specify a mime-type to be removed from the MimeType field."),
404
 
    NULL
 
419
    N_("MIME-TYPE")
405
420
  },
406
421
  {
407
422
    NULL
561
576
          return 1;
562
577
  }
563
578
 
564
 
  if (vendor_name == NULL)
 
579
  if (vendor_name == NULL && g_getenv ("DESKTOP_FILE_VENDOR"))
565
580
    vendor_name = g_strdup (g_getenv ("DESKTOP_FILE_VENDOR"));
566
581
  
567
 
  if (vendor_name == NULL)
568
 
    {
569
 
      g_printerr (_("Must specify the vendor namespace for these files with --vendor\n"));
570
 
      return 1;
571
 
    }
572
 
 
573
582
  if (copy_generic_name_to_name && copy_name_to_generic_name)
574
583
    {
575
584
      g_printerr (_("Specifying both --copy-name-to-generic-name and --copy-generic-name-to-name at once doesn't make much sense.\n"));
576
585
      return 1;
577
586
    }
578
587
  
579
 
  if (target_dir == NULL)
 
588
  if (target_dir == NULL && g_getenv ("DESKTOP_FILE_INSTALL_DIR"))
580
589
    target_dir = g_strdup (g_getenv ("DESKTOP_FILE_INSTALL_DIR"));
581
590
 
582
591
  if (target_dir == NULL)