1 /* 2 * The range list functions 3 * 4 * Copyright (C) 2010-2020, Joachim Metz <joachim.metz@gmail.com> 5 * 6 * Refer to AUTHORS for acknowledgements. 7 * 8 * This program is free software: you can redistribute it and/or modify 9 * it under the terms of the GNU Lesser General Public License as published by 10 * the Free Software Foundation, either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public License 19 * along with this program. If not, see <https://www.gnu.org/licenses/>. 20 */ 21 22 #if !defined( _LIBFDATA_INTERNAL_RANGE_LIST_H ) 23 #define _LIBFDATA_INTERNAL_RANGE_LIST_H 24 25 #include <common.h> 26 #include <types.h> 27 28 #include "libfdata_extern.h" 29 #include "libfdata_libcdata.h" 30 #include "libfdata_libcerror.h" 31 #include "libfdata_types.h" 32 33 #if defined( __cplusplus ) 34 extern "C" { 35 #endif 36 37 typedef struct libfdata_internal_range_list libfdata_internal_range_list_t; 38 39 struct libfdata_internal_range_list 40 { 41 /* The (list) elements range list 42 */ 43 libcdata_range_list_t *elements_range_list; 44 45 /* The flags 46 */ 47 uint8_t flags; 48 49 /* The data handle 50 */ 51 intptr_t *data_handle; 52 53 /* The free data handle function 54 */ 55 int (*free_data_handle)( 56 intptr_t **data_handle, 57 libcerror_error_t **error ); 58 59 /* The clone (duplicate) data handle function 60 */ 61 int (*clone_data_handle)( 62 intptr_t **destination_data_handle, 63 intptr_t *source_data_handle, 64 libcerror_error_t **error ); 65 66 /* The read element data function 67 */ 68 int (*read_element_data)( 69 intptr_t *data_handle, 70 intptr_t *file_io_handle, 71 libfdata_list_element_t *list_element, 72 libfdata_cache_t *cache, 73 int element_file_index, 74 off64_t element_offset, 75 size64_t element_size, 76 uint32_t element_flags, 77 uint8_t read_flags, 78 libcerror_error_t **error ); 79 80 /* The write element data function 81 */ 82 int (*write_element_data)( 83 intptr_t *data_handle, 84 intptr_t *file_io_handle, 85 libfdata_list_element_t *list_element, 86 libfdata_cache_t *cache, 87 int element_file_index, 88 off64_t element_offset, 89 size64_t element_size, 90 uint32_t element_flags, 91 uint8_t write_flags, 92 libcerror_error_t **error ); 93 }; 94 95 LIBFDATA_EXTERN \ 96 int libfdata_range_list_initialize( 97 libfdata_range_list_t **range_list, 98 intptr_t *data_handle, 99 int (*free_data_handle)( 100 intptr_t **data_handle, 101 libcerror_error_t **error ), 102 int (*clone_data_handle)( 103 intptr_t **destination_data_handle, 104 intptr_t *source_data_handle, 105 libcerror_error_t **error ), 106 int (*read_element_data)( 107 intptr_t *data_handle, 108 intptr_t *file_io_handle, 109 libfdata_list_element_t *list_element, 110 libfdata_cache_t *cache, 111 int element_file_index, 112 off64_t element_offset, 113 size64_t element_size, 114 uint32_t element_flags, 115 uint8_t read_flags, 116 libcerror_error_t **error ), 117 int (*write_element_data)( 118 intptr_t *data_handle, 119 intptr_t *file_io_handle, 120 libfdata_list_element_t *list_element, 121 libfdata_cache_t *cache, 122 int element_file_index, 123 off64_t element_offset, 124 size64_t element_size, 125 uint32_t element_flags, 126 uint8_t write_flags, 127 libcerror_error_t **error ), 128 uint8_t flags, 129 libcerror_error_t **error ); 130 131 LIBFDATA_EXTERN \ 132 int libfdata_range_list_free( 133 libfdata_range_list_t **range_list, 134 libcerror_error_t **error ); 135 136 LIBFDATA_EXTERN \ 137 int libfdata_range_list_clone( 138 libfdata_range_list_t **destination_range_list, 139 libfdata_range_list_t *source_range_list, 140 libcerror_error_t **error ); 141 142 /* List elements functions 143 */ 144 LIBFDATA_EXTERN \ 145 int libfdata_range_list_empty( 146 libfdata_range_list_t *range_list, 147 libcerror_error_t **error ); 148 149 /* Mapped range functions 150 */ 151 152 LIBFDATA_EXTERN \ 153 int libfdata_range_list_get_list_element_at_offset( 154 libfdata_range_list_t *range_list, 155 off64_t offset, 156 off64_t *element_data_offset, 157 libfdata_list_element_t **element, 158 libcerror_error_t **error ); 159 160 LIBFDATA_EXTERN \ 161 int libfdata_range_list_get_element_at_offset( 162 libfdata_range_list_t *range_list, 163 off64_t offset, 164 off64_t *element_data_offset, 165 int *element_file_index, 166 off64_t *element_offset, 167 size64_t *element_size, 168 uint32_t *element_flags, 169 libcerror_error_t **error ); 170 171 LIBFDATA_EXTERN \ 172 int libfdata_range_list_insert_element( 173 libfdata_range_list_t *range_list, 174 off64_t offset, 175 size64_t size, 176 int element_file_index, 177 off64_t element_offset, 178 size64_t element_size, 179 uint32_t element_flags, 180 libcerror_error_t **error ); 181 182 /* List element value functions 183 */ 184 185 LIBFDATA_EXTERN \ 186 int libfdata_range_list_get_element_value_at_offset( 187 libfdata_range_list_t *range_list, 188 intptr_t *file_io_handle, 189 libfdata_cache_t *cache, 190 off64_t offset, 191 off64_t *element_data_offset, 192 intptr_t **element_value, 193 uint8_t read_flags, 194 libcerror_error_t **error ); 195 196 LIBFDATA_EXTERN \ 197 int libfdata_range_list_set_element_value_at_offset( 198 libfdata_range_list_t *range_list, 199 intptr_t *file_io_handle, 200 libfdata_cache_t *cache, 201 off64_t offset, 202 intptr_t *element_value, 203 int (*free_element_value)( 204 intptr_t **element_value, 205 libcerror_error_t **error ), 206 uint8_t write_flags, 207 libcerror_error_t **error ); 208 209 #if defined( __cplusplus ) 210 } 211 #endif 212 213 #endif /* !defined( _LIBFDATA_INTERNAL_RANGE_LIST_H ) */ 214 215