/* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould */ #include "helpers.h" /* Check to make sure we have the sections and keys we want */ static gboolean verify_keyfile (GKeyFile * inkeyfile, const gchar * desktop) { if (inkeyfile == NULL) return FALSE; if (!g_key_file_has_group(inkeyfile, "Desktop Entry")) { g_warning("Desktop file '%s' is missing the 'Desktop Entry' group", desktop); return FALSE; } if (!g_key_file_has_key(inkeyfile, "Desktop Entry", "Exec", NULL)) { g_warning("Desktop file '%s' is missing the 'Exec' key", desktop); return FALSE; } return TRUE; } /* Try to find a desktop file in a particular data directory */ static GKeyFile * try_dir (const char * dir, const gchar * desktop) { gchar * fullpath = g_build_filename(dir, "applications", desktop, NULL); GKeyFile * keyfile = g_key_file_new(); /* NOTE: Leaving off the error here as we'll get a bunch of them, so individuals aren't really useful */ gboolean loaded = g_key_file_load_from_file(keyfile, fullpath, G_KEY_FILE_NONE, NULL); g_free(fullpath); if (!loaded) { g_key_file_free(keyfile); return NULL; } if (!verify_keyfile(keyfile, desktop)) { g_key_file_free(keyfile); return NULL; } return keyfile; } /* Find the keyfile that we need for a particular AppID and return it. Or NULL if we can't find it. */ GKeyFile * keyfile_for_appid (const gchar * appid, gchar ** desktopfile) { gchar * desktop = g_strdup_printf("%s.desktop", appid); const char * const * data_dirs = g_get_system_data_dirs(); GKeyFile * keyfile = NULL; int i; keyfile = try_dir(g_get_user_data_dir(), desktop); if (keyfile != NULL && desktopfile != NULL && *desktopfile == NULL) { *desktopfile = g_build_filename(g_get_user_data_dir(), "applications", desktop, NULL); } for (i = 0; data_dirs[i] != NULL && keyfile == NULL; i++) { keyfile = try_dir(data_dirs[i], desktop); if (keyfile != NULL && desktopfile != NULL && *desktopfile == NULL) { *desktopfile = g_build_filename(data_dirs[i], "applications", desktop, NULL); } } g_free(desktop); return keyfile; }