wi_string_t * wi_plist_string_for_instance(wi_runtime_instance_t *instance) { wi_string_t *string = NULL; xmlDocPtr doc; xmlDtdPtr dtd; xmlNodePtr root_node; xmlChar *buffer; int length; doc = xmlNewDoc((xmlChar *) "1.0"); dtd = xmlNewDtd(doc, (xmlChar *) "plist", (xmlChar *) "-//Apple//DTD PLIST 1.0//EN", (xmlChar *) "http://www.apple.com/DTDs/PropertyList-1.0.dtd"); xmlAddChild((xmlNodePtr) doc, (xmlNodePtr) dtd); root_node = xmlNewNode(NULL, (xmlChar *) "plist"); xmlSetProp(root_node, (xmlChar *) "version", (xmlChar *) "1.0"); xmlDocSetRootElement(doc, root_node); if(_wi_plist_write_instance_to_node(instance, root_node)) { xmlDocDumpFormatMemoryEnc(doc, &buffer, &length, "UTF-8", 1); string = wi_string_with_bytes(buffer, length); xmlFree(buffer); } xmlFreeDoc(doc); return string; }
wi_array_t * wi_p7_message_list_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { wi_p7_spec_field_t *field; wi_p7_spec_type_t *listtype; wi_array_t *list; wi_runtime_instance_t *instance; unsigned char *binary; wi_p7_type_t listtype_id; uint32_t field_size, list_size, string_size; field = wi_p7_spec_field_with_name(p7_message->spec, field_name); if(!field) { wi_error_set_libwired_error_with_format(WI_ERROR_P7_UNKNOWNFIELD, WI_STR("No id found for field \"%@\""), field_name); if(wi_p7_message_debug) wi_log_debug(WI_STR("wi_p7_message_list_for_name: %m")); return NULL; } listtype = wi_p7_spec_field_listtype(field); listtype_id = wi_p7_spec_type_id(listtype); if(listtype_id != WI_P7_STRING) { wi_error_set_libwired_error_with_format(WI_ERROR_P7_UNKNOWNFIELD, WI_STR("Unhandled type %@ in list"), wi_p7_spec_type_name(listtype)); if(wi_p7_message_debug) wi_log_debug(WI_STR("wi_p7_message_list_for_name: %m")); return NULL; } list = wi_mutable_array(); if(!_wi_p7_message_get_binary_buffer_for_reading_for_name(p7_message, field_name, &binary, &field_size)) return NULL; list_size = 0; while(list_size < field_size) { if(listtype_id == WI_P7_STRING) { string_size = wi_read_swap_big_to_host_int32(binary, list_size); list_size += 4; instance = wi_string_with_bytes(binary + list_size, string_size - 1); list_size += string_size; } wi_mutable_array_add_data(list, instance); } wi_runtime_make_immutable(list); return list; }
wi_string_t * wi_p7_message_string_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { unsigned char *binary; uint32_t field_size; if(!_wi_p7_message_get_binary_buffer_for_reading_for_name(p7_message, field_name, &binary, &field_size)) return NULL; return wi_string_with_bytes(binary, field_size - 1); }
void wi_test_string_encoding_conversion(void) { #ifdef WI_STRING_ENCODING wi_string_t *string, *path; wi_data_t *data; wi_string_encoding_t *encoding; encoding = wi_string_encoding_with_charset(WI_STR("ISO-8859-1"), 0); string = wi_string_with_c_string("hello world", encoding); WI_TEST_ASSERT_EQUAL_INSTANCES(string, WI_STR("hello world"), ""); data = wi_data_with_base64_string(WI_STR("aGVsbG8gd29ybGQ=")); string = wi_string_with_data(data, encoding); WI_TEST_ASSERT_EQUAL_INSTANCES(string, WI_STR("hello world"), ""); string = wi_string_with_bytes(wi_data_bytes(data), wi_data_length(data), encoding); WI_TEST_ASSERT_EQUAL_INSTANCES(string, WI_STR("hello world"), ""); path = wi_string_by_appending_path_component(wi_test_fixture_path, WI_STR("wi-string-encoding-tests-1.txt")); string = wi_string_with_contents_of_file(path, encoding); WI_TEST_ASSERT_NOT_NULL(string, ""); WI_TEST_ASSERT_EQUALS(wi_string_character_at_index(string, 0), 'h', ""); WI_TEST_ASSERT_EQUALS(wi_string_length(string), 14, ""); data = wi_string_data(WI_STR("hello world"), encoding); WI_TEST_ASSERT_EQUAL_INSTANCES(data, wi_data_with_base64_string(WI_STR("aGVsbG8gd29ybGQ=")), ""); encoding = wi_string_encoding_with_charset(WI_STR("ASCII"), 0); string = wi_string_with_contents_of_file(path, encoding); WI_TEST_ASSERT_NULL(string, ""); encoding = wi_string_encoding_with_charset(WI_STR("hello world"), 0); string = wi_string_with_contents_of_file(path, encoding); WI_TEST_ASSERT_NULL(string, ""); #endif }
static wi_string_t * _wi_p7_message_description(wi_runtime_instance_t *instance) { wi_p7_message_t *p7_message = instance; wi_hash_t *fields; wi_enumerator_t *enumerator; wi_string_t *description, *xml_string, *field_name; description = wi_string_init_with_format(wi_string_alloc(), WI_STR("<%@ %p>{name = %@, serialization = %@"), wi_runtime_class_name(p7_message), p7_message, p7_message->name, p7_message->serialization == WI_P7_BINARY ? WI_STR("binary") : WI_STR("xml")); if(p7_message->serialization == WI_P7_BINARY) { wi_string_append_format(description, WI_STR(", buffer = %@, fields = (\n"), wi_data_with_bytes_no_copy(p7_message->binary_buffer, p7_message->binary_size, false)); } else { if(p7_message->xml_string) xml_string = p7_message->xml_string; else xml_string = wi_string_with_bytes(p7_message->xml_buffer, p7_message->xml_length); wi_string_append_format(description, WI_STR(", xml = \"%@\", fields = (\n"), xml_string); } fields = wi_p7_message_fields(p7_message); enumerator = wi_hash_key_enumerator(fields); while((field_name = wi_enumerator_next_data(enumerator))) { wi_string_append_format(description, WI_STR(" %@ = %@\n"), field_name, wi_hash_data_for_key(fields, field_name)); } wi_string_append_string(description, WI_STR(")}")); return wi_autorelease(description); }