1 /* -*- mode: C; c-file-style: "gnu" -*- */ 2 /* xdgmimeicon.c: Private file. Datastructure for storing the aliases. 3 * 4 * More info can be found at http://www.freedesktop.org/standards/ 5 * 6 * Copyright (C) 2008 Red Hat, Inc. 7 * 8 * Licensed under the Academic Free License version 2.0 9 * Or under the following terms: 10 * 11 * This library is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2 of the License, or (at your option) any later version. 15 * 16 * This library is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with this library; if not, write to the 23 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 24 * Boston, MA 02111-1307, USA. 25 */ 26 27 #ifdef HAVE_CONFIG_H 28 #include "config.h" 29 #endif 30 31 #include "xdgmimeicon.h" 32 #include "xdgmimeint.h" 33 #include <stdlib.h> 34 #include <stdio.h> 35 #include <assert.h> 36 #include <string.h> 37 #include <fnmatch.h> 38 39 #ifndef FALSE 40 #define FALSE (0) 41 #endif 42 43 #ifndef TRUE 44 #define TRUE (!FALSE) 45 #endif 46 47 typedef struct XdgIcon XdgIcon; 48 49 struct XdgIcon 50 { 51 char *mime_type; 52 char *icon_name; 53 }; 54 55 struct XdgIconList 56 { 57 struct XdgIcon *icons; 58 int n_icons; 59 }; 60 61 XdgIconList * 62 _xdg_mime_icon_list_new (void) 63 { 64 XdgIconList *list; 65 66 list = malloc (sizeof (XdgIconList)); 67 68 list->icons = NULL; 69 list->n_icons = 0; 70 71 return list; 72 } 73 74 void 75 _xdg_mime_icon_list_free (XdgIconList *list) 76 { 77 int i; 78 79 if (list->icons) 80 { 81 for (i = 0; i < list->n_icons; i++) 82 { 83 free (list->icons[i].mime_type); 84 free (list->icons[i].icon_name); 85 } 86 free (list->icons); 87 } 88 free (list); 89 } 90 91 static int 92 icon_entry_cmp (const void *v1, const void *v2) 93 { 94 return strcmp (((XdgIcon *)v1)->mime_type, ((XdgIcon *)v2)->mime_type); 95 } 96 97 const char * 98 _xdg_mime_icon_list_lookup (XdgIconList *list, 99 const char *mime_type) 100 { 101 XdgIcon *entry; 102 XdgIcon key; 103 104 if (list->n_icons > 0) 105 { 106 key.mime_type = (char *)mime_type; 107 key.icon_name = NULL; 108 109 entry = bsearch (&key, list->icons, list->n_icons, 110 sizeof (XdgIcon), icon_entry_cmp); 111 if (entry) 112 return entry->icon_name; 113 } 114 115 return NULL; 116 } 117 118 void 119 _xdg_mime_icon_read_from_file (XdgIconList *list, 120 const char *file_name) 121 { 122 FILE *file; 123 char line[255]; 124 int alloc; 125 126 file = fopen (file_name, "r"); 127 128 if (file == NULL) 129 return; 130 131 /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. 132 * Blah */ 133 alloc = list->n_icons + 16; 134 list->icons = realloc (list->icons, alloc * sizeof (XdgIcon)); 135 while (fgets (line, 255, file) != NULL) 136 { 137 char *sep; 138 if (line[0] == '#') 139 continue; 140 141 sep = strchr (line, ':'); 142 if (sep == NULL) 143 continue; 144 *(sep++) = '\000'; 145 sep[strlen (sep) -1] = '\000'; 146 if (list->n_icons == alloc) 147 { 148 alloc <<= 1; 149 list->icons = realloc (list->icons, 150 alloc * sizeof (XdgIcon)); 151 } 152 list->icons[list->n_icons].mime_type = strdup (line); 153 list->icons[list->n_icons].icon_name = strdup (sep); 154 list->n_icons++; 155 } 156 list->icons = realloc (list->icons, 157 list->n_icons * sizeof (XdgIcon)); 158 159 fclose (file); 160 161 if (list->n_icons > 1) 162 qsort (list->icons, list->n_icons, 163 sizeof (XdgIcon), icon_entry_cmp); 164 } 165 166 167 void 168 _xdg_mime_icon_list_dump (XdgIconList *list) 169 { 170 int i; 171 172 if (list->icons) 173 { 174 for (i = 0; i < list->n_icons; i++) 175 { 176 printf ("%s %s\n", 177 list->icons[i].mime_type, 178 list->icons[i].icon_name); 179 } 180 } 181 } 182 183 184