1 /* 2 * The 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_LIST_H ) 23 #define _LIBFDATA_INTERNAL_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_libfcache.h" 32 #include "libfdata_types.h" 33 34 #if defined( __cplusplus ) 35 extern "C" { 36 #endif 37 38 typedef struct libfdata_internal_list libfdata_internal_list_t; 39 40 struct libfdata_internal_list 41 { 42 /* The current (most recently used) element index 43 */ 44 int current_element_index; 45 46 /* The mapped offset 47 */ 48 off64_t mapped_offset; 49 50 /* The (list) size 51 */ 52 size64_t size; 53 54 /* The (list) elements array 55 */ 56 libcdata_array_t *elements_array; 57 58 /* The mapped ranges array 59 */ 60 libcdata_array_t *mapped_ranges_array; 61 62 /* The flags 63 */ 64 uint8_t flags; 65 66 /* The data handle 67 */ 68 intptr_t *data_handle; 69 70 /* The free data handle function 71 */ 72 int (*free_data_handle)( 73 intptr_t **data_handle, 74 libcerror_error_t **error ); 75 76 /* The clone (duplicate) data handle function 77 */ 78 int (*clone_data_handle)( 79 intptr_t **destination_data_handle, 80 intptr_t *source_data_handle, 81 libcerror_error_t **error ); 82 83 /* The read element data function 84 */ 85 int (*read_element_data)( 86 intptr_t *data_handle, 87 intptr_t *file_io_handle, 88 libfdata_list_element_t *list_element, 89 libfdata_cache_t *cache, 90 int element_data_file_index, 91 off64_t element_data_offset, 92 size64_t element_data_size, 93 uint32_t element_data_flags, 94 uint8_t read_flags, 95 libcerror_error_t **error ); 96 97 /* The write element data function 98 */ 99 int (*write_element_data)( 100 intptr_t *data_handle, 101 intptr_t *file_io_handle, 102 libfdata_list_element_t *list_element, 103 libfdata_cache_t *cache, 104 int element_data_file_index, 105 off64_t element_data_offset, 106 size64_t element_data_size, 107 uint32_t element_data_flags, 108 uint8_t write_flags, 109 libcerror_error_t **error ); 110 }; 111 112 LIBFDATA_EXTERN \ 113 int libfdata_list_initialize( 114 libfdata_list_t **list, 115 intptr_t *data_handle, 116 int (*free_data_handle)( 117 intptr_t **data_handle, 118 libcerror_error_t **error ), 119 int (*clone_data_handle)( 120 intptr_t **destination_data_handle, 121 intptr_t *source_data_handle, 122 libcerror_error_t **error ), 123 int (*read_element_data)( 124 intptr_t *data_handle, 125 intptr_t *file_io_handle, 126 libfdata_list_element_t *list_element, 127 libfdata_cache_t *cache, 128 int element_data_file_index, 129 off64_t element_data_offset, 130 size64_t element_data_size, 131 uint32_t element_data_flags, 132 uint8_t read_flags, 133 libcerror_error_t **error ), 134 int (*write_element_data)( 135 intptr_t *data_handle, 136 intptr_t *file_io_handle, 137 libfdata_list_element_t *list_element, 138 libfdata_cache_t *cache, 139 int element_data_file_index, 140 off64_t element_data_offset, 141 size64_t element_data_size, 142 uint32_t element_data_flags, 143 uint8_t write_flags, 144 libcerror_error_t **error ), 145 uint8_t flags, 146 libcerror_error_t **error ); 147 148 LIBFDATA_EXTERN \ 149 int libfdata_list_free( 150 libfdata_list_t **list, 151 libcerror_error_t **error ); 152 153 LIBFDATA_EXTERN \ 154 int libfdata_list_clone( 155 libfdata_list_t **destination_list, 156 libfdata_list_t *source_list, 157 libcerror_error_t **error ); 158 159 int libfdata_list_set_calculate_mapped_ranges_flag( 160 libfdata_list_t *list, 161 libcerror_error_t **error ); 162 163 /* List elements functions 164 */ 165 LIBFDATA_EXTERN \ 166 int libfdata_list_empty( 167 libfdata_list_t *list, 168 libcerror_error_t **error ); 169 170 LIBFDATA_EXTERN \ 171 int libfdata_list_resize( 172 libfdata_list_t *list, 173 int number_of_elements, 174 libcerror_error_t **error ); 175 176 LIBFDATA_EXTERN \ 177 int libfdata_list_reverse( 178 libfdata_list_t *list, 179 libcerror_error_t **error ); 180 181 LIBFDATA_EXTERN \ 182 int libfdata_list_get_number_of_elements( 183 libfdata_list_t *list, 184 int *number_of_elements, 185 libcerror_error_t **error ); 186 187 LIBFDATA_EXTERN \ 188 int libfdata_list_get_list_element_by_index( 189 libfdata_list_t *list, 190 int element_index, 191 libfdata_list_element_t **element, 192 libcerror_error_t **error ); 193 194 LIBFDATA_EXTERN \ 195 int libfdata_list_get_element_by_index( 196 libfdata_list_t *list, 197 int element_index, 198 int *element_file_index, 199 off64_t *element_offset, 200 size64_t *element_size, 201 uint32_t *element_flags, 202 libcerror_error_t **error ); 203 204 LIBFDATA_EXTERN \ 205 int libfdata_list_set_element_by_index( 206 libfdata_list_t *list, 207 int element_index, 208 int element_file_index, 209 off64_t element_offset, 210 size64_t element_size, 211 uint32_t element_flags, 212 libcerror_error_t **error ); 213 214 LIBFDATA_EXTERN \ 215 int libfdata_list_prepend_element( 216 libfdata_list_t *list, 217 int element_file_index, 218 off64_t element_offset, 219 size64_t element_size, 220 uint32_t element_flags, 221 libcerror_error_t **error ); 222 223 LIBFDATA_EXTERN \ 224 int libfdata_list_append_element( 225 libfdata_list_t *list, 226 int *element_index, 227 int element_file_index, 228 off64_t element_offset, 229 size64_t element_size, 230 uint32_t element_flags, 231 libcerror_error_t **error ); 232 233 LIBFDATA_EXTERN \ 234 int libfdata_list_append_list( 235 libfdata_list_t *list, 236 libfdata_list_t *source_list, 237 libcerror_error_t **error ); 238 239 LIBFDATA_EXTERN \ 240 int libfdata_list_is_element_set( 241 libfdata_list_t *list, 242 int element_index, 243 libcerror_error_t **error ); 244 245 /* Mapped range functions 246 */ 247 LIBFDATA_EXTERN \ 248 int libfdata_list_get_element_mapped_range( 249 libfdata_list_t *list, 250 int element_index, 251 off64_t *mapped_range_offset, 252 size64_t *mapped_range_size, 253 libcerror_error_t **error ); 254 255 LIBFDATA_EXTERN \ 256 int libfdata_list_get_mapped_offset( 257 libfdata_list_t *list, 258 off64_t *mapped_offset, 259 libcerror_error_t **error ); 260 261 LIBFDATA_EXTERN \ 262 int libfdata_list_set_mapped_offset( 263 libfdata_list_t *list, 264 off64_t mapped_offset, 265 libcerror_error_t **error ); 266 267 LIBFDATA_EXTERN \ 268 int libfdata_list_get_mapped_size_by_index( 269 libfdata_list_t *list, 270 int element_index, 271 size64_t *mapped_size, 272 libcerror_error_t **error ); 273 274 LIBFDATA_EXTERN \ 275 int libfdata_list_set_mapped_size_by_index( 276 libfdata_list_t *list, 277 int element_index, 278 size64_t mapped_size, 279 libcerror_error_t **error ); 280 281 LIBFDATA_EXTERN \ 282 int libfdata_list_get_element_by_index_with_mapped_size( 283 libfdata_list_t *list, 284 int element_index, 285 int *element_file_index, 286 off64_t *element_offset, 287 size64_t *element_size, 288 uint32_t *element_flags, 289 size64_t *mapped_size, 290 libcerror_error_t **error ); 291 292 LIBFDATA_EXTERN \ 293 int libfdata_list_set_element_by_index_with_mapped_size( 294 libfdata_list_t *list, 295 int element_index, 296 int element_file_index, 297 off64_t element_offset, 298 size64_t element_size, 299 uint32_t element_flags, 300 size64_t mapped_size, 301 libcerror_error_t **error ); 302 303 /* TODO libfdata_list_prepend_element_with_mapped_size */ 304 305 LIBFDATA_EXTERN \ 306 int libfdata_list_append_element_with_mapped_size( 307 libfdata_list_t *list, 308 int *element_index, 309 int element_file_index, 310 off64_t element_offset, 311 size64_t element_size, 312 uint32_t element_flags, 313 size64_t mapped_size, 314 libcerror_error_t **error ); 315 316 int libfdata_list_calculate_mapped_ranges( 317 libfdata_internal_list_t *internal_list, 318 libcerror_error_t **error ); 319 320 LIBFDATA_EXTERN \ 321 int libfdata_list_get_element_index_at_offset( 322 libfdata_list_t *list, 323 off64_t offset, 324 int *element_index, 325 off64_t *element_data_offset, 326 libcerror_error_t **error ); 327 328 LIBFDATA_EXTERN \ 329 int libfdata_list_get_list_element_at_offset( 330 libfdata_list_t *list, 331 off64_t offset, 332 int *element_index, 333 off64_t *element_data_offset, 334 libfdata_list_element_t **element, 335 libcerror_error_t **error ); 336 337 LIBFDATA_EXTERN \ 338 int libfdata_list_get_element_at_offset( 339 libfdata_list_t *list, 340 off64_t offset, 341 int *element_index, 342 off64_t *element_data_offset, 343 int *element_file_index, 344 off64_t *element_offset, 345 size64_t *element_size, 346 uint32_t *element_flags, 347 libcerror_error_t **error ); 348 349 /* TODO add libfdata_list_set_element_at_offset */ 350 351 /* List element value functions 352 */ 353 LIBFDATA_EXTERN \ 354 int libfdata_list_cache_element_value( 355 libfdata_list_t *list, 356 libfdata_cache_t *cache, 357 int element_index, 358 int element_file_index, 359 off64_t element_data_offset, 360 size64_t element_data_size, 361 uint32_t element_data_flags, 362 int64_t element_timestamp, 363 intptr_t *element_value, 364 int (*free_element_value)( 365 intptr_t **element_value, 366 libcerror_error_t **error ), 367 uint8_t write_flags, 368 libcerror_error_t **error ); 369 370 int libfdata_list_get_element_value( 371 libfdata_list_t *list, 372 intptr_t *file_io_handle, 373 libfdata_cache_t *cache, 374 libfdata_list_element_t *element, 375 intptr_t **element_value, 376 uint8_t read_flags, 377 libcerror_error_t **error ); 378 379 LIBFDATA_EXTERN \ 380 int libfdata_list_get_element_value_by_index( 381 libfdata_list_t *list, 382 intptr_t *file_io_handle, 383 libfdata_cache_t *cache, 384 int element_index, 385 intptr_t **element_value, 386 uint8_t read_flags, 387 libcerror_error_t **error ); 388 389 LIBFDATA_EXTERN \ 390 int libfdata_list_get_element_value_at_offset( 391 libfdata_list_t *list, 392 intptr_t *file_io_handle, 393 libfdata_cache_t *cache, 394 off64_t offset, 395 int *element_index, 396 off64_t *element_data_offset, 397 intptr_t **element_value, 398 uint8_t read_flags, 399 libcerror_error_t **error ); 400 401 int libfdata_list_set_element_value( 402 libfdata_list_t *list, 403 intptr_t *file_io_handle, 404 libfdata_cache_t *cache, 405 libfdata_list_element_t *element, 406 intptr_t *element_value, 407 int (*free_element_value)( 408 intptr_t **element_value, 409 libcerror_error_t **error ), 410 uint8_t write_flags, 411 libcerror_error_t **error ); 412 413 LIBFDATA_EXTERN \ 414 int libfdata_list_set_element_value_by_index( 415 libfdata_list_t *list, 416 intptr_t *file_io_handle, 417 libfdata_cache_t *cache, 418 int element_index, 419 intptr_t *element_value, 420 int (*free_element_value)( 421 intptr_t **element_value, 422 libcerror_error_t **error ), 423 uint8_t write_flags, 424 libcerror_error_t **error ); 425 426 LIBFDATA_EXTERN \ 427 int libfdata_list_set_element_value_at_offset( 428 libfdata_list_t *list, 429 intptr_t *file_io_handle, 430 libfdata_cache_t *cache, 431 off64_t offset, 432 intptr_t *element_value, 433 int (*free_element_value)( 434 intptr_t **element_value, 435 libcerror_error_t **error ), 436 uint8_t write_flags, 437 libcerror_error_t **error ); 438 439 /* IO functions 440 */ 441 LIBFDATA_EXTERN \ 442 int libfdata_list_get_size( 443 libfdata_list_t *list, 444 size64_t *size, 445 libcerror_error_t **error ); 446 447 #if defined( __cplusplus ) 448 } 449 #endif 450 451 #endif /* !defined( _LIBFDATA_INTERNAL_LIST_H ) */ 452 453