+struct ContentRenderer {
+ char * content_type;
+ char * renderer;
+};
+
+static GList * renderer_list = NULL;
+
+static struct ContentRenderer *
+content_renderer_new(char * content_type, char * renderer)
+{
+ struct ContentRenderer * cr;
+
+ cr = g_new(struct ContentRenderer, 1);
+ if (cr == NULL)
+ return NULL;
+
+ cr->content_type = g_strdup(content_type);
+ cr->renderer = g_strdup(renderer);
+
+ return cr;
+}
+
+static void content_renderer_free(struct ContentRenderer * cr)
+{
+ g_free(cr->content_type);
+ g_free(cr->renderer);
+ g_free(cr);
+}
+
+void renderer_read_config(void)
+{
+ gchar buf[BUFFSIZE];
+ FILE * f;
+ gchar * rcpath;
+
+ g_list_foreach(renderer_list, (GFunc) content_renderer_free, NULL);
+ renderer_list = NULL;
+
+ rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, RENDERER_RC, NULL);
+ f = fopen(rcpath, "rb");
+ g_free(rcpath);
+
+ if (f == NULL)
+ return;
+
+ while (fgets(buf, BUFFSIZE, f)) {
+ char * p;
+ struct ContentRenderer * cr;
+
+ strretchomp(buf);
+ p = strchr(buf, ' ');
+ if (p == NULL)
+ continue;
+ * p = 0;
+
+ cr = content_renderer_new(buf, p + 1);
+ if (cr == NULL)
+ continue;
+
+ renderer_list = g_list_append(renderer_list, cr);
+ }
+
+ fclose(f);
+}
+
+void renderer_write_config(void)
+{
+ gchar * rcpath;
+ PrefFile *pfile;
+ GList * cur;
+
+ rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, RENDERER_RC, NULL);
+
+ if ((pfile = prefs_write_open(rcpath)) == NULL) {
+ g_warning("failed to write configuration to file\n");
+ g_free(rcpath);
+ return;
+ }
+
+ g_free(rcpath);
+
+ for(cur = renderer_list ; cur != NULL ; cur = cur->next) {
+ struct ContentRenderer * renderer;
+ renderer = cur->data;
+ fprintf(pfile->fp, "%s %s\n", renderer->content_type,
+ renderer->renderer);
+ }
+
+ if (prefs_file_close(pfile) < 0) {
+ g_warning("failed to write configuration to file\n");
+ return;
+ }
+}
+