desktop-entries.c: Refactor to eliminate double-loading of desktop
file. Use g_key_file_load_from_file, followed by
g_desktop_app_info_new_from_keyfile.
Michael Webster
7 years ago
265 | 265 | static DesktopEntryResultCode |
266 | 266 | desktop_entry_load (DesktopEntry *entry) |
267 | 267 | { |
268 | DesktopEntryResultCode rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER; | |
269 | ||
268 | 270 | if (strstr (entry->path, "/menu-xdg/")) |
269 | return DESKTOP_ENTRY_LOAD_FAIL_OTHER; | |
271 | return rescode; | |
272 | ||
270 | 273 | if (entry->type == DESKTOP_ENTRY_DESKTOP) |
271 | 274 | { |
272 | 275 | GKeyFile *key_file = NULL; |
273 | 276 | DesktopEntryDesktop *entry_desktop = (DesktopEntryDesktop*)entry; |
274 | const char *categories_str; | |
275 | ||
276 | entry_desktop->appinfo = g_desktop_app_info_new_from_filename (entry->path); | |
277 | if (!entry_desktop->appinfo || | |
278 | !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) || | |
279 | !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo))) | |
277 | ||
278 | key_file = g_key_file_new (); | |
279 | ||
280 | if (g_key_file_load_from_file (key_file, entry->path, 0, NULL)) | |
280 | 281 | { |
281 | menu_verbose ("Failed to load \"%s\"\n", entry->path); | |
282 | return DESKTOP_ENTRY_LOAD_FAIL_APPINFO; | |
282 | entry_desktop->appinfo = g_desktop_app_info_new_from_keyfile (key_file); | |
283 | ||
284 | if (!entry_desktop->appinfo || | |
285 | !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) || | |
286 | !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo))) | |
287 | { | |
288 | menu_verbose ("Failed to load appinfo for \"%s\"\n", entry->path); | |
289 | rescode = DESKTOP_ENTRY_LOAD_FAIL_APPINFO; | |
290 | } | |
291 | else | |
292 | { | |
293 | const char *categories_str; | |
294 | categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo); | |
295 | ||
296 | if (categories_str) | |
297 | { | |
298 | char **categories; | |
299 | int i; | |
300 | ||
301 | categories = g_strsplit (categories_str, ";", -1); | |
302 | entry_desktop->categories = g_new0 (GQuark, g_strv_length (categories) + 1); | |
303 | ||
304 | for (i = 0; categories[i]; i++) | |
305 | entry_desktop->categories[i] = g_quark_from_string (categories[i]); | |
306 | ||
307 | g_strfreev (categories); | |
308 | } | |
309 | ||
310 | entry_desktop->showin = key_file_get_show_in (key_file); | |
311 | ||
312 | rescode = DESKTOP_ENTRY_LOAD_SUCCESS; | |
313 | } | |
283 | 314 | } |
284 | ||
285 | categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo); | |
286 | if (categories_str) | |
315 | else | |
287 | 316 | { |
288 | char **categories; | |
289 | int i; | |
290 | ||
291 | categories = g_strsplit (categories_str, ";", -1); | |
292 | entry_desktop->categories = g_new0 (GQuark, g_strv_length (categories) + 1); | |
293 | ||
294 | for (i = 0; categories[i]; i++) | |
295 | entry_desktop->categories[i] = g_quark_from_string (categories[i]); | |
296 | ||
297 | g_strfreev (categories); | |
317 | menu_verbose ("Failed to read contents of \"%s\"\n", entry->path); | |
318 | rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER; | |
298 | 319 | } |
299 | ||
300 | key_file = g_key_file_new (); | |
301 | ||
302 | if (!g_key_file_load_from_file (key_file, entry->path, 0, NULL)) | |
303 | entry_desktop->showin = TRUE; | |
304 | else | |
305 | entry_desktop->showin = key_file_get_show_in (key_file); | |
306 | ||
307 | 320 | g_key_file_free (key_file); |
308 | ||
309 | return DESKTOP_ENTRY_LOAD_SUCCESS; | |
310 | 321 | } |
311 | 322 | else if (entry->type == DESKTOP_ENTRY_DIRECTORY) |
312 | 323 | { |
313 | 324 | GKeyFile *key_file = NULL; |
314 | 325 | GError *error = NULL; |
315 | DesktopEntryResultCode rescode = DESKTOP_ENTRY_LOAD_SUCCESS; | |
326 | rescode = DESKTOP_ENTRY_LOAD_SUCCESS; | |
316 | 327 | |
317 | 328 | key_file = g_key_file_new (); |
318 | 329 | |
343 | 354 | else |
344 | 355 | menu_verbose ("Failed to load \"%s\"\n", entry->path); |
345 | 356 | } |
346 | ||
347 | return rescode; | |
348 | 357 | } |
349 | 358 | else |
350 | 359 | g_assert_not_reached (); |
351 | 360 | |
352 | return DESKTOP_ENTRY_LOAD_FAIL_OTHER; | |
361 | return rescode; | |
353 | 362 | } |
354 | 363 | |
355 | 364 | static gboolean |