예제 #1
0
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);
}
예제 #2
0
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;
}
예제 #3
0
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;
}