wi_dictionary_t * wi_dictionary_init_with_plist_file(wi_dictionary_t *dictionary, wi_string_t *path) { wi_runtime_instance_t *instance; wi_release(dictionary); instance = wi_plist_read_instance_from_path(path); if(!instance) return NULL; if(wi_runtime_id(instance) != wi_dictionary_runtime_id()) return NULL; return wi_retain(instance); }
static wi_boolean_t _wi_plist_write_instance_to_node(wi_runtime_instance_t *instance, xmlNodePtr node) { wi_enumerator_t *enumerator; wi_array_t *keys; wi_runtime_instance_t *value; xmlNodePtr child_node; void *key; wi_runtime_id_t id; wi_number_type_t type; id = wi_runtime_id(instance); if(id == wi_string_runtime_id()) { wi_xml_node_new_child(node, WI_STR("string"), instance); } else if(id == wi_number_runtime_id()) { type = wi_number_type(instance); if(type == WI_NUMBER_BOOL) { if(wi_number_bool(instance)) wi_xml_node_new_child(node, WI_STR("true"), NULL); else wi_xml_node_new_child(node, WI_STR("false"), NULL); } else { if(type == WI_NUMBER_FLOAT || type == WI_NUMBER_DOUBLE) wi_xml_node_new_child(node, WI_STR("real"), wi_number_string(instance)); else wi_xml_node_new_child(node, WI_STR("integer"), wi_number_string(instance)); } } else if(id == wi_data_runtime_id()) { wi_xml_node_new_child(node, WI_STR("data"), wi_data_base64(instance)); } else if(id == wi_date_runtime_id()) { wi_xml_node_new_child(node, WI_STR("date"), wi_date_string_with_format(instance, WI_STR("%Y-%m-%dT%H:%M:%SZ"))); } else if(id == wi_dictionary_runtime_id()) { child_node = wi_xml_node_new_child(node, WI_STR("dict"), NULL); keys = wi_dictionary_all_keys(instance); wi_array_sort(keys, wi_string_compare); enumerator = wi_array_data_enumerator(keys); while((key = wi_enumerator_next_data(enumerator))) { value = wi_dictionary_data_for_key(instance, key); wi_xml_node_new_child(child_node, WI_STR("key"), key); if(!_wi_plist_write_instance_to_node(value, child_node)) return false; } } else if(id == wi_array_runtime_id()) { child_node = wi_xml_node_new_child(node, WI_STR("array"), NULL); xmlAddChild(node, child_node); enumerator = wi_array_data_enumerator(instance); while((value = wi_enumerator_next_data(enumerator))) { if(!_wi_plist_write_instance_to_node(value, child_node)) return false; } } else { wi_error_set_libwired_error_with_format(WI_ERROR_PLIST_WRITEFAILED, WI_STR("Unhandled class %@"), wi_runtime_class_name(instance)); return false; } return true; }
static wi_boolean_t _wi_plist_read_node_to_instance(xmlNodePtr content_node, wi_runtime_instance_t *collection) { xmlNodePtr node; wi_string_t *name, *key = NULL; wi_runtime_instance_t *instance = NULL; wi_boolean_t dictionary; dictionary = (wi_runtime_id(collection) == wi_dictionary_runtime_id()); for(node = content_node->children; node != NULL; node = node->next) { if(node->type == XML_ELEMENT_NODE) { name = wi_xml_node_name(node); if(wi_is_equal(name, WI_STR("key"))) key = wi_xml_node_content(node); else if(wi_is_equal(name, WI_STR("string"))) instance = wi_xml_node_content(node); else if(wi_is_equal(name, WI_STR("integer"))) instance = wi_number_with_integer(wi_string_integer(wi_xml_node_content(node))); else if(wi_is_equal(name, WI_STR("real"))) instance = wi_number_with_double(wi_string_double(wi_xml_node_content(node))); else if(wi_is_equal(name, WI_STR("true"))) instance = wi_number_with_bool(true); else if(wi_is_equal(name, WI_STR("false"))) instance = wi_number_with_bool(false); else if(wi_is_equal(name, WI_STR("date"))) instance = wi_date_with_rfc3339_string(wi_xml_node_content(node)); else if(wi_is_equal(name, WI_STR("data"))) instance = wi_data_with_base64(wi_xml_node_content(node)); else if(wi_is_equal(name, WI_STR("dict"))) { instance = wi_autorelease(wi_dictionary_init(wi_dictionary_alloc())); if(!_wi_plist_read_node_to_instance(node, instance)) return false; } else if(wi_is_equal(name, WI_STR("array"))) { instance = wi_autorelease(wi_array_init(wi_array_alloc())); if(!_wi_plist_read_node_to_instance(node, instance)) return false; } else { wi_error_set_libwired_error_with_format(WI_ERROR_PLIST_READFAILED, WI_STR("Unhandled node \"%@\""), name); return false; } } if(instance) { if(dictionary) wi_dictionary_set_data_for_key(collection, instance, key); else wi_array_add_data(collection, instance); instance = NULL; key = NULL; } } return true; }