• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.1 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, see <http://www.gnu.org/licenses/>.
23  */
24 
25 #include "config.h"
26 
27 #include "xdgmimeicon.h"
28 #include "xdgmimeint.h"
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <assert.h>
32 #include <string.h>
33 #include <fnmatch.h>
34 
35 #ifndef	FALSE
36 #define	FALSE	(0)
37 #endif
38 
39 #ifndef	TRUE
40 #define	TRUE	(!FALSE)
41 #endif
42 
43 typedef struct XdgIcon XdgIcon;
44 
45 struct XdgIcon
46 {
47   char *mime_type;
48   char *icon_name;
49 };
50 
51 struct XdgIconList
52 {
53   struct XdgIcon *icons;
54   int n_icons;
55 };
56 
57 XdgIconList *
_xdg_mime_icon_list_new(void)58 _xdg_mime_icon_list_new (void)
59 {
60   XdgIconList *list;
61 
62   list = malloc (sizeof (XdgIconList));
63 
64   list->icons = NULL;
65   list->n_icons = 0;
66 
67   return list;
68 }
69 
70 void
_xdg_mime_icon_list_free(XdgIconList * list)71 _xdg_mime_icon_list_free (XdgIconList *list)
72 {
73   int i;
74 
75   if (list->icons)
76     {
77       for (i = 0; i < list->n_icons; i++)
78 	{
79 	  free (list->icons[i].mime_type);
80 	  free (list->icons[i].icon_name);
81 	}
82       free (list->icons);
83     }
84   free (list);
85 }
86 
87 static int
icon_entry_cmp(const void * v1,const void * v2)88 icon_entry_cmp (const void *v1, const void *v2)
89 {
90   return strcmp (((XdgIcon *)v1)->mime_type, ((XdgIcon *)v2)->mime_type);
91 }
92 
93 const char  *
_xdg_mime_icon_list_lookup(XdgIconList * list,const char * mime_type)94 _xdg_mime_icon_list_lookup (XdgIconList *list,
95 			    const char  *mime_type)
96 {
97   XdgIcon *entry;
98   XdgIcon key;
99 
100   if (list->n_icons > 0)
101     {
102       key.mime_type = (char *)mime_type;
103       key.icon_name = NULL;
104 
105       entry = bsearch (&key, list->icons, list->n_icons,
106 		       sizeof (XdgIcon), icon_entry_cmp);
107       if (entry)
108         return entry->icon_name;
109     }
110 
111   return NULL;
112 }
113 
114 void
_xdg_mime_icon_read_from_file(XdgIconList * list,const char * file_name)115 _xdg_mime_icon_read_from_file (XdgIconList *list,
116 			       const char   *file_name)
117 {
118   FILE *file;
119   char line[255];
120   int alloc;
121 
122   file = fopen (file_name, "r");
123 
124   if (file == NULL)
125     return;
126 
127   /* FIXME: Not UTF-8 safe.  Doesn't work if lines are greater than 255 chars.
128    * Blah */
129   alloc = list->n_icons + 16;
130   list->icons = realloc (list->icons, alloc * sizeof (XdgIcon));
131   while (fgets (line, 255, file) != NULL)
132     {
133       char *sep;
134       if (line[0] == '#')
135 	continue;
136 
137       sep = strchr (line, ':');
138       if (sep == NULL)
139 	continue;
140       *(sep++) = '\000';
141       sep[strlen (sep) -1] = '\000';
142       if (list->n_icons == alloc)
143 	{
144 	  alloc <<= 1;
145 	  list->icons = realloc (list->icons,
146 				   alloc * sizeof (XdgIcon));
147 	}
148       list->icons[list->n_icons].mime_type = strdup (line);
149       list->icons[list->n_icons].icon_name = strdup (sep);
150       list->n_icons++;
151     }
152   list->icons = realloc (list->icons,
153 			   list->n_icons * sizeof (XdgIcon));
154 
155   fclose (file);
156 
157   if (list->n_icons > 1)
158     qsort (list->icons, list->n_icons,
159            sizeof (XdgIcon), icon_entry_cmp);
160 }
161 
162 #ifdef NOT_USED_IN_GIO
163 
164 void
_xdg_mime_icon_list_dump(XdgIconList * list)165 _xdg_mime_icon_list_dump (XdgIconList *list)
166 {
167   int i;
168 
169   if (list->icons)
170     {
171       for (i = 0; i < list->n_icons; i++)
172 	{
173 	  printf ("%s %s\n",
174 		  list->icons[i].mime_type,
175 		  list->icons[i].icon_name);
176 	}
177     }
178 }
179 
180 #endif
181