Import JSON via JSON.parse with javascript

This commit is contained in:
Christian Dywan 2011-05-04 22:25:35 +02:00
parent 8cd4cc270c
commit 41a7a21683

View file

@ -1631,14 +1631,13 @@ speeddial_new_from_file (const gchar* config,
GKeyFile* key_file = g_key_file_new (); GKeyFile* key_file = g_key_file_new ();
gchar* config_file = g_build_filename (config, "speeddial", NULL); gchar* config_file = g_build_filename (config, "speeddial", NULL);
guint i = 0; guint i = 0;
guint columns = 3;
guint slot_count = 0;
guint rows;
gchar* slot = NULL;
gchar* dial_id = NULL;
gchar* uri = NULL;
gchar* json_content; gchar* json_content;
gchar** parts; gsize json_length;
GString* script;
JSGlobalContextRef js_context;
gchar* keyfile;
gchar* thumb_dir;
gchar** tiles;
if (g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_NONE, error)) if (g_key_file_load_from_file (key_file, config_file, G_KEY_FILE_NONE, error))
{ {
@ -1647,114 +1646,62 @@ speeddial_new_from_file (const gchar* config,
} }
katze_assign (config_file, g_build_filename (config, "speeddial.json", NULL)); katze_assign (config_file, g_build_filename (config, "speeddial.json", NULL));
g_file_get_contents (config_file, &json_content, NULL, NULL); g_file_get_contents (config_file, &json_content, &json_length, NULL);
parts = g_strsplit (json_content ? json_content : "", ",", -1); script = g_string_sized_new (json_length);
while (parts && parts[i] != NULL) g_string_append (script, "var json = JSON.parse (");
{ g_string_append_len (script, json_content, json_length);
gchar* key; g_string_append (script, "); "
gchar* val; "var keyfile = '';"
gchar** values = g_strsplit (parts[i], "\"", -1); "for (i in json['shortcuts']) {"
"var tile = json['shortcuts'][i];"
if (*values[1]) "keyfile += '[Dial ' + tile['id'].substring (1) + ']\\n'"
{ " + 'uri=' + tile['href'] + '\\n'"
if (!g_strcmp0 (values[1], "shortcuts")) " + 'img=' + tile['img'] + '\\n'"
{ " + 'title=' + tile['title'] + '\\n\\n';"
key = g_strdup (values[3]); "} "
val = g_strdup (values[5]); "var columns = json['width'] ? json['width'] : 3;"
} "var rows = json['shortcuts'].length / columns;"
else if (!g_strcmp0 (values[1], "thumb")) "keyfile += '[settings]\\n'"
{ " + 'columns=' + columns + '\\n'"
key = g_strdup (values[1]); " + 'rows=' + (rows > 3 ? rows : 3) + '\\n\\n';"
val = g_strdup (values[2]); "keyfile;");
} g_free (json_content);
else js_context = JSGlobalContextCreateInGroup (NULL, NULL);
{ keyfile = sokoke_js_script_eval (js_context, script->str, NULL);
key = g_strdup (values[1]); JSGlobalContextRelease (js_context);
val = g_strdup (values[3]); g_string_free (script, TRUE);
} g_key_file_load_from_data (key_file, keyfile, -1, 0, NULL);
g_free (keyfile);
if (g_str_equal (key, "id")) tiles = g_key_file_get_groups (key_file, NULL);
{
katze_assign (slot, g_strdup (val));
dial_id = g_strdup_printf ("Dial %s", slot + 1);
slot_count++;
}
else if (g_str_equal (key, "href"))
{
katze_assign (uri, g_strdup (val));
g_key_file_set_value (key_file, dial_id, "uri", uri);
}
else if (g_str_equal (key, "img") && (*val && strncmp (val, "#", 1)))
{
gsize sz;
gint state = 0;
guint save = 0;
gchar* thumb_dir;
gchar* thumb_path;
gsize base64_size = strlen (val);
guchar* decoded = g_malloc0 ((base64_size * 3) / 4);
sz = g_base64_decode_step (g_strdup (val), base64_size,
decoded, &state, &save);
thumb_dir = g_build_path (G_DIR_SEPARATOR_S, g_get_user_cache_dir (), thumb_dir = g_build_path (G_DIR_SEPARATOR_S, g_get_user_cache_dir (),
PACKAGE_NAME, "thumbnails", NULL); PACKAGE_NAME, "thumbnails", NULL);
if (!g_file_test (thumb_dir, G_FILE_TEST_EXISTS)) if (!g_file_test (thumb_dir, G_FILE_TEST_EXISTS))
katze_mkdir_with_parents (thumb_dir, 0700); katze_mkdir_with_parents (thumb_dir, 0700);
thumb_path = sokoke_build_thumbnail_path (uri);
g_file_set_contents (thumb_path, (gchar*)decoded, sz, NULL);
g_free (decoded);
g_free (thumb_dir); g_free (thumb_dir);
while (tiles[i] != NULL)
{
gsize sz;
gchar* uri = g_key_file_get_string (key_file, tiles[i], "uri", NULL);
gchar* img = g_key_file_get_string (key_file, tiles[i], "img", NULL);
if (img != NULL && (uri && *uri && *uri != '#'))
{
guchar* decoded = g_base64_decode (img, &sz);
gchar* thumb_path = sokoke_build_thumbnail_path (uri);
g_file_set_contents (thumb_path, (gchar*)decoded, sz, NULL);
g_free (thumb_path); g_free (thumb_path);
g_free (decoded);
} }
else if (g_str_equal (key, "thumb")) g_free (img);
{ g_free (uri);
guint thumb_size; g_key_file_remove_key (key_file, tiles[i], "img", NULL);
gchar* thumb_size_type;
gchar* size_tmp = g_strndup (val + 1, strlen (val) - 3);
thumb_size = atoi (size_tmp);
g_free (size_tmp);
if (thumb_size == 80)
thumb_size_type = g_strdup ("SMALL");
else if (thumb_size == 240)
thumb_size_type = g_strdup ("BIG");
else /* if (thumb_size == 160) */
thumb_size_type = g_strdup ("MEDIUM");
g_key_file_set_value (key_file, "settings", "size", thumb_size_type);
g_free (thumb_size_type);
}
else if (g_str_equal (key, "title") && *val)
{
g_key_file_set_value (key_file, dial_id, key, val);
}
else if (g_str_equal (key, "width"))
{
columns = atoi (val);
}
i++; i++;
g_free (key);
g_free (val);
g_strfreev (values);
} }
} g_strfreev (tiles);
/* Default to 3 x 3 grid. Calculate rows here, columns is initialized as 3 */
rows = slot_count / columns > 3 ? slot_count / columns : 3;
g_key_file_set_integer (key_file, "settings", "columns", columns);
g_key_file_set_integer (key_file, "settings", "rows", rows);
katze_assign (config_file, g_build_filename (config, "speeddial", NULL)); katze_assign (config_file, g_build_filename (config, "speeddial", NULL));
sokoke_key_file_save_to_file (key_file, config_file, NULL); sokoke_key_file_save_to_file (key_file, config_file, NULL);
g_strfreev (parts);
g_free (dial_id);
g_free (slot);
g_free (config_file); g_free (config_file);
g_free (json_content);
return key_file; return key_file;
} }