/* Retrieves the sub item for the specific UTF-8 encoded path * The path separator is the \ character * Returns 1 if successful, 0 if no such item or -1 on error */ int libolecf_item_get_sub_item_by_utf8_path( libolecf_item_t *item, const uint8_t *utf8_string, size_t utf8_string_length, libolecf_item_t **sub_item, libcerror_error_t **error ) { libolecf_internal_item_t *internal_item = NULL; libcdata_tree_node_t *directory_tree_node = NULL; libcdata_tree_node_t *sub_directory_tree_node = NULL; uint8_t *utf8_string_segment = NULL; static char *function = "libolecf_item_get_sub_item_by_utf8_path"; libuna_unicode_character_t unicode_character = 0; size_t utf8_string_index = 0; size_t utf8_string_segment_length = 0; int result = 0; if( item == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid item.", function ); return( -1 ); } internal_item = (libolecf_internal_item_t *) item; if( internal_item->io_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid item - missing IO handle.", function ); return( -1 ); } if( sub_item == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid sub item.", function ); return( -1 ); } if( *sub_item != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: sub item already set.", function ); return( -1 ); } directory_tree_node = internal_item->directory_tree_node; if( utf8_string_length > 0 ) { /* Ignore a leading separator */ if( utf8_string[ utf8_string_index ] == (uint8_t) LIBOLECF_SEPARATOR ) { utf8_string_index++; } } if( ( utf8_string_length == 0 ) || ( utf8_string_length == 1 ) ) { result = 1; } else while( utf8_string_index < utf8_string_length ) { utf8_string_segment = (uint8_t *) &( utf8_string[ utf8_string_index ] ); utf8_string_segment_length = utf8_string_index; while( utf8_string_index < utf8_string_length ) { if( libuna_unicode_character_copy_from_utf8( &unicode_character, utf8_string, utf8_string_length, &utf8_string_index, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_COPY_FAILED, "%s: unable to copy UTF-8 string to Unicode character.", function ); return( -1 ); } if( ( unicode_character == (libuna_unicode_character_t) LIBOLECF_SEPARATOR ) || ( unicode_character == 0 ) ) { utf8_string_segment_length += 1; break; } } utf8_string_segment_length = utf8_string_index - utf8_string_segment_length; if( utf8_string_segment_length == 0 ) { result = 0; } else { result = libolecf_directory_tree_get_sub_node_by_utf8_name( directory_tree_node, utf8_string_segment, utf8_string_segment_length, internal_item->io_handle->byte_order, &sub_directory_tree_node, error ); } if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve directory tree sub node by UTF-8 name.", function ); return( -1 ); } else if( result == 0 ) { break; } directory_tree_node = sub_directory_tree_node; } if( result != 0 ) { if( libolecf_item_initialize( sub_item, internal_item->io_handle, internal_item->file_io_handle, internal_item->file, directory_tree_node, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create sub item.", function ); return( -1 ); } } return( result ); }
/* Retrieves the root item from the file * Returns 1 if successful or -1 on error */ int libolecf_file_get_root_item( libolecf_file_t *file, libolecf_item_t **root_item, libcerror_error_t **error ) { libolecf_internal_file_t *internal_file = NULL; static char *function = "libolecf_file_get_root_item"; if( file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid file.", function ); return( -1 ); } internal_file = (libolecf_internal_file_t *) file; if( internal_file->directory_tree_root_node == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid file - missing directory tree root node.", function ); return( -1 ); } if( root_item == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid root item.", function ); return( -1 ); } if( *root_item != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: root item already set.", function ); return( -1 ); } if( libolecf_item_initialize( root_item, internal_file->io_handle, internal_file->file_io_handle, internal_file, internal_file->directory_tree_root_node, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create root item.", function ); return( -1 ); } return( 1 ); }