MateWPItem * mate_wp_item_new (const gchar * filename,
				 GHashTable * wallpapers,
				 MateDesktopThumbnailFactory * thumbnails) {
  MateWPItem *item = g_new0 (MateWPItem, 1);

  item->filename = g_strdup (filename);
  item->fileinfo = mate_wp_info_new (filename, thumbnails);

  if (item->fileinfo != NULL && item->fileinfo->mime_type != NULL &&
      (g_str_has_prefix (item->fileinfo->mime_type, "image/") ||
       strcmp (item->fileinfo->mime_type, "application/xml") == 0)) {

    if (g_utf8_validate (item->fileinfo->name, -1, NULL))
      item->name = g_strdup (item->fileinfo->name);
    else
      item->name = g_filename_to_utf8 (item->fileinfo->name, -1, NULL,
				       NULL, NULL);

    mate_wp_item_update (item);
    mate_wp_item_ensure_mate_bg (item);
    mate_wp_item_update_description (item);

    g_hash_table_insert (wallpapers, item->filename, item);
  } else {
    mate_wp_item_free (item);
    item = NULL;
  }

  return item;
}
static void mate_wp_load_legacy (AppearanceData *data) {
    FILE * fp;
    gchar * foo, * filename;

    filename = g_build_filename (g_get_home_dir (), ".mate2",
                                 "wallpapers.list", NULL);

    if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
        if ((fp = fopen (filename, "r")) != NULL) {
            foo = (gchar *) g_malloc (sizeof (gchar) * 4096);
            while (fgets (foo, 4096, fp)) {
                MateWPItem * item;

                if (foo[strlen (foo) - 1] == '\n') {
                    foo[strlen (foo) - 1] = '\0';
                }

                item = g_hash_table_lookup (data->wp_hash, foo);
                if (item != NULL) {
                    continue;
                }

                if (!g_file_test (foo, G_FILE_TEST_EXISTS)) {
                    continue;
                }

                item = mate_wp_item_new (foo, data->wp_hash, data->thumb_factory);
                if (item != NULL && item->fileinfo == NULL) {
                    mate_wp_item_free (item);
                }
            }
            fclose (fp);
            g_free (foo);
        }
    }

    g_free (filename);
}
static void mate_wp_xml_load_xml (AppearanceData *data,
                                  const gchar * filename) {
    xmlDoc * wplist;
    xmlNode * root, * list, * wpa;
    xmlChar * nodelang;
    const gchar * const * syslangs;
    GdkColor color1, color2;
    gint i;

    wplist = xmlParseFile (filename);

    if (!wplist)
        return;

    syslangs = g_get_language_names ();

    root = xmlDocGetRootElement (wplist);

    for (list = root->children; list != NULL; list = list->next) {
        if (!strcmp ((gchar *)list->name, "wallpaper")) {
            MateWPItem * wp;
            gchar *pcolor = NULL, *scolor = NULL;
            gchar *s;
            gboolean have_scale = FALSE, have_shade = FALSE;

            wp = g_new0 (MateWPItem, 1);

            wp->deleted = mate_wp_xml_get_bool (list, "deleted");

            for (wpa = list->children; wpa != NULL; wpa = wpa->next) {
                if (wpa->type == XML_COMMENT_NODE) {
                    continue;
                } else if (!strcmp ((gchar *)wpa->name, "filename")) {
                    if (wpa->last != NULL && wpa->last->content != NULL) {
                        const char * none = "(none)";
                        gchar *content = g_strstrip ((gchar *)wpa->last->content);

                        if (!strcmp (content, none))
                            wp->filename = g_strdup (content);
                        else if (g_utf8_validate (content, -1, NULL) &&
                                 g_file_test (content, G_FILE_TEST_EXISTS))
                            wp->filename = g_strdup (content);
                        else
                            wp->filename = g_filename_from_utf8 (content, -1, NULL, NULL, NULL);
                    } else {
                        break;
                    }
                } else if (!strcmp ((gchar *)wpa->name, "name")) {
                    if (wpa->last != NULL && wpa->last->content != NULL) {
                        nodelang = xmlNodeGetLang (wpa->last);

                        if (wp->name == NULL && nodelang == NULL) {
                            wp->name = g_strdup (g_strstrip ((gchar *)wpa->last->content));
                        } else {
                            for (i = 0; syslangs[i] != NULL; i++) {
                                if (!strcmp (syslangs[i], (gchar *)nodelang)) {
                                    g_free (wp->name);
                                    wp->name = g_strdup (g_strstrip ((gchar *)wpa->last->content));
                                    break;
                                }
                            }
                        }

                        xmlFree (nodelang);
                    } else {
                        break;
                    }
                } else if (!strcmp ((gchar *)wpa->name, "options")) {
                    if (wpa->last != NULL) {
                        wp->options = wp_item_string_to_option (g_strstrip ((gchar *)wpa->last->content));
                        have_scale = TRUE;
                    }
                } else if (!strcmp ((gchar *)wpa->name, "shade_type")) {
                    if (wpa->last != NULL) {
                        wp->shade_type = wp_item_string_to_shading (g_strstrip ((gchar *)wpa->last->content));
                        have_shade = TRUE;
                    }
                } else if (!strcmp ((gchar *)wpa->name, "pcolor")) {
                    if (wpa->last != NULL) {
                        pcolor = g_strdup (g_strstrip ((gchar *)wpa->last->content));
                    }
                } else if (!strcmp ((gchar *)wpa->name, "scolor")) {
                    if (wpa->last != NULL) {
                        scolor = g_strdup (g_strstrip ((gchar *)wpa->last->content));
                    }
                } else if (!strcmp ((gchar *)wpa->name, "text")) {
                    /* Do nothing here, libxml2 is being weird */
                } else {
                    g_warning ("Unknown Tag: %s", wpa->name);
                }
            }

            /* Make sure we don't already have this one and that filename exists */
            if (wp->filename == NULL ||
                    g_hash_table_lookup (data->wp_hash, wp->filename) != NULL) {

                mate_wp_item_free (wp);
                g_free (pcolor);
                g_free (scolor);
                continue;
            }

            /* Verify the colors and alloc some GdkColors here */
            if (!have_scale) {
                s = mateconf_client_get_string (data->client, WP_OPTIONS_KEY, NULL);
                wp->options = wp_item_string_to_option (s);
                g_free (s);
            }

            if (!have_shade) {
                s = mateconf_client_get_string (data->client, WP_SHADING_KEY, NULL);
                wp->shade_type = wp_item_string_to_shading (s);
                g_free (s);
            }

            if (pcolor == NULL) {
                pcolor = mateconf_client_get_string (data->client,
                                                     WP_PCOLOR_KEY, NULL);
            }
            if (scolor == NULL) {
                scolor = mateconf_client_get_string (data->client,
                                                     WP_SCOLOR_KEY, NULL);
            }
            gdk_color_parse (pcolor, &color1);
            gdk_color_parse (scolor, &color2);
            g_free (pcolor);
            g_free (scolor);

            wp->pcolor = gdk_color_copy (&color1);
            wp->scolor = gdk_color_copy (&color2);

            if ((wp->filename != NULL &&
                    g_file_test (wp->filename, G_FILE_TEST_EXISTS)) ||
                    !strcmp (wp->filename, "(none)")) {
                wp->fileinfo = mate_wp_info_new (wp->filename, data->thumb_factory);

                if (wp->name == NULL || !strcmp (wp->filename, "(none)")) {
                    g_free (wp->name);
                    wp->name = g_strdup (wp->fileinfo->name);
                }

                mate_wp_item_ensure_mate_bg (wp);
                mate_wp_item_update_description (wp);
                g_hash_table_insert (data->wp_hash, wp->filename, wp);
            } else {
                mate_wp_item_free (wp);
                wp = NULL;
            }
        }
    }
    xmlFreeDoc (wplist);
}
void mate_wp_xml_save_list (AppearanceData *data) {
    xmlDoc * wplist;
    xmlNode * root, * wallpaper, * item;
    GSList * list = NULL;
    gchar * wpfile;

    g_hash_table_foreach (data->wp_hash,
                          (GHFunc) mate_wp_list_flatten, &list);
    g_hash_table_destroy (data->wp_hash);
    list = g_slist_reverse (list);

    wpfile = g_build_filename (g_get_home_dir (),
                               "/.mate2",
                               "backgrounds.xml",
                               NULL);

    xmlKeepBlanksDefault (0);

    wplist = xmlNewDoc ((xmlChar *)"1.0");
    xmlCreateIntSubset (wplist, (xmlChar *)"wallpapers", NULL, (xmlChar *)"mate-wp-list.dtd");
    root = xmlNewNode (NULL, (xmlChar *)"wallpapers");
    xmlDocSetRootElement (wplist, root);

    while (list != NULL) {
        MateWPItem * wpitem = list->data;
        const char * none = "(none)";
        gchar * filename;
        const gchar * scale, * shade;
        gchar * pcolor, * scolor;

        if (!strcmp (wpitem->filename, none) ||
                (g_utf8_validate (wpitem->filename, -1, NULL) &&
                 g_file_test (wpitem->filename, G_FILE_TEST_EXISTS)))
            filename = g_strdup (wpitem->filename);
        else
            filename = g_filename_to_utf8 (wpitem->filename, -1, NULL, NULL, NULL);

        pcolor = gdk_color_to_string (wpitem->pcolor);
        scolor = gdk_color_to_string (wpitem->scolor);
        scale = wp_item_option_to_string (wpitem->options);
        shade = wp_item_shading_to_string (wpitem->shade_type);

        wallpaper = xmlNewChild (root, NULL, (xmlChar *)"wallpaper", NULL);
        mate_wp_xml_set_bool (wallpaper, (xmlChar *)"deleted", wpitem->deleted);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"name", (xmlChar *)wpitem->name);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"filename", (xmlChar *)filename);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"options", (xmlChar *)scale);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"shade_type", (xmlChar *)shade);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"pcolor", (xmlChar *)pcolor);
        item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"scolor", (xmlChar *)scolor);
        g_free (pcolor);
        g_free (scolor);
        g_free (filename);

        list = g_slist_delete_link (list, list);
        mate_wp_item_free (wpitem);
    }
    xmlSaveFormatFile (wpfile, wplist, 1);
    xmlFreeDoc (wplist);
    g_free (wpfile);
}