1 /* 2 * The list functions 3 * 4 * Copyright (C) 2010-2017, Joachim Metz <joachim.metz@gmail.com> 5 * 6 * Refer to AUTHORS for acknowledgements. 7 * 8 * This software 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 software 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 software. If not, see <http://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 calculate cache entry index value 67 */ 68 int (*calculate_cache_entry_index)( 69 int element_index, 70 int element_file_index, 71 off64_t element_offset, 72 size64_t element_size, 73 uint32_t element_flags, 74 int number_of_cache_entries ); 75 76 /* The data handle 77 */ 78 intptr_t *data_handle; 79 80 /* The free data handle function 81 */ 82 int (*free_data_handle)( 83 intptr_t **data_handle, 84 libcerror_error_t **error ); 85 86 /* The clone (duplicate) data handle function 87 */ 88 int (*clone_data_handle)( 89 intptr_t **destination_data_handle, 90 intptr_t *source_data_handle, 91 libcerror_error_t **error ); 92 93 /* The read element data function 94 */ 95 int (*read_element_data)( 96 intptr_t *data_handle, 97 intptr_t *file_io_handle, 98 libfdata_list_element_t *list_element, 99 libfcache_cache_t *cache, 100 int element_data_file_index, 101 off64_t element_data_offset, 102 size64_t element_data_size, 103 uint32_t element_data_flags, 104 uint8_t read_flags, 105 libcerror_error_t **error ); 106 107 /* The write element data function 108 */ 109 int (*write_element_data)( 110 intptr_t *data_handle, 111 intptr_t *file_io_handle, 112 libfdata_list_element_t *list_element, 113 libfcache_cache_t *cache, 114 int element_data_file_index, 115 off64_t element_data_offset, 116 size64_t element_data_size, 117 uint32_t element_data_flags, 118 uint8_t write_flags, 119 libcerror_error_t **error ); 120 }; 121 122 LIBFDATA_EXTERN \ 123 int libfdata_list_initialize( 124 libfdata_list_t **list, 125 intptr_t *data_handle, 126 int (*free_data_handle)( 127 intptr_t **data_handle, 128 libcerror_error_t **error ), 129 int (*clone_data_handle)( 130 intptr_t **destination_data_handle, 131 intptr_t *source_data_handle, 132 libcerror_error_t **error ), 133 int (*read_element_data)( 134 intptr_t *data_handle, 135 intptr_t *file_io_handle, 136 libfdata_list_element_t *list_element, 137 libfcache_cache_t *cache, 138 int element_data_file_index, 139 off64_t element_data_offset, 140 size64_t element_data_size, 141 uint32_t element_data_flags, 142 uint8_t read_flags, 143 libcerror_error_t **error ), 144 int (*write_element_data)( 145 intptr_t *data_handle, 146 intptr_t *file_io_handle, 147 libfdata_list_element_t *list_element, 148 libfcache_cache_t *cache, 149 int element_data_file_index, 150 off64_t element_data_offset, 151 size64_t element_data_size, 152 uint32_t element_data_flags, 153 uint8_t write_flags, 154 libcerror_error_t **error ), 155 uint8_t flags, 156 libcerror_error_t **error ); 157 158 LIBFDATA_EXTERN \ 159 int libfdata_list_free( 160 libfdata_list_t **list, 161 libcerror_error_t **error ); 162 163 LIBFDATA_EXTERN \ 164 int libfdata_list_clone( 165 libfdata_list_t **destination_list, 166 libfdata_list_t *source_list, 167 libcerror_error_t **error ); 168 169 int libfdata_list_set_calculate_mapped_ranges_flag( 170 libfdata_list_t *list, 171 libcerror_error_t **error ); 172 173 /* List elements functions 174 */ 175 LIBFDATA_EXTERN \ 176 int libfdata_list_empty( 177 libfdata_list_t *list, 178 libcerror_error_t **error ); 179 180 LIBFDATA_EXTERN \ 181 int libfdata_list_resize( 182 libfdata_list_t *list, 183 int number_of_elements, 184 libcerror_error_t **error ); 185 186 LIBFDATA_EXTERN \ 187 int libfdata_list_reverse( 188 libfdata_list_t *list, 189 libcerror_error_t **error ); 190 191 LIBFDATA_EXTERN \ 192 int libfdata_list_get_number_of_elements( 193 libfdata_list_t *list, 194 int *number_of_elements, 195 libcerror_error_t **error ); 196 197 LIBFDATA_EXTERN \ 198 int libfdata_list_get_list_element_by_index( 199 libfdata_list_t *list, 200 int element_index, 201 libfdata_list_element_t **element, 202 libcerror_error_t **error ); 203 204 LIBFDATA_EXTERN \ 205 int libfdata_list_get_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_set_element_by_index( 216 libfdata_list_t *list, 217 int element_index, 218 int element_file_index, 219 off64_t element_offset, 220 size64_t element_size, 221 uint32_t element_flags, 222 libcerror_error_t **error ); 223 224 LIBFDATA_EXTERN \ 225 int libfdata_list_prepend_element( 226 libfdata_list_t *list, 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_element( 235 libfdata_list_t *list, 236 int *element_index, 237 int element_file_index, 238 off64_t element_offset, 239 size64_t element_size, 240 uint32_t element_flags, 241 libcerror_error_t **error ); 242 243 LIBFDATA_EXTERN \ 244 int libfdata_list_append_list( 245 libfdata_list_t *list, 246 libfdata_list_t *source_list, 247 libcerror_error_t **error ); 248 249 LIBFDATA_EXTERN \ 250 int libfdata_list_is_element_set( 251 libfdata_list_t *list, 252 int element_index, 253 libcerror_error_t **error ); 254 255 /* Mapped range functions 256 */ 257 LIBFDATA_EXTERN \ 258 int libfdata_list_get_mapped_offset( 259 libfdata_list_t *list, 260 off64_t *mapped_offset, 261 libcerror_error_t **error ); 262 263 LIBFDATA_EXTERN \ 264 int libfdata_list_set_mapped_offset( 265 libfdata_list_t *list, 266 off64_t mapped_offset, 267 libcerror_error_t **error ); 268 269 LIBFDATA_EXTERN \ 270 int libfdata_list_get_mapped_size_by_index( 271 libfdata_list_t *list, 272 int element_index, 273 size64_t *mapped_size, 274 libcerror_error_t **error ); 275 276 LIBFDATA_EXTERN \ 277 int libfdata_list_set_mapped_size_by_index( 278 libfdata_list_t *list, 279 int element_index, 280 size64_t mapped_size, 281 libcerror_error_t **error ); 282 283 LIBFDATA_EXTERN \ 284 int libfdata_list_get_element_by_index_with_mapped_size( 285 libfdata_list_t *list, 286 int element_index, 287 int *element_file_index, 288 off64_t *element_offset, 289 size64_t *element_size, 290 uint32_t *element_flags, 291 size64_t *mapped_size, 292 libcerror_error_t **error ); 293 294 LIBFDATA_EXTERN \ 295 int libfdata_list_set_element_by_index_with_mapped_size( 296 libfdata_list_t *list, 297 int element_index, 298 int element_file_index, 299 off64_t element_offset, 300 size64_t element_size, 301 uint32_t element_flags, 302 size64_t mapped_size, 303 libcerror_error_t **error ); 304 305 /* TODO libfdata_list_prepend_element_with_mapped_size */ 306 307 LIBFDATA_EXTERN \ 308 int libfdata_list_append_element_with_mapped_size( 309 libfdata_list_t *list, 310 int *element_index, 311 int element_file_index, 312 off64_t element_offset, 313 size64_t element_size, 314 uint32_t element_flags, 315 size64_t mapped_size, 316 libcerror_error_t **error ); 317 318 int libfdata_list_calculate_mapped_ranges( 319 libfdata_internal_list_t *internal_list, 320 libcerror_error_t **error ); 321 322 LIBFDATA_EXTERN \ 323 int libfdata_list_get_element_index_at_offset( 324 libfdata_list_t *list, 325 off64_t offset, 326 int *element_index, 327 off64_t *element_data_offset, 328 libcerror_error_t **error ); 329 330 LIBFDATA_EXTERN \ 331 int libfdata_list_get_list_element_at_offset( 332 libfdata_list_t *list, 333 off64_t offset, 334 int *element_index, 335 off64_t *element_data_offset, 336 libfdata_list_element_t **element, 337 libcerror_error_t **error ); 338 339 LIBFDATA_EXTERN \ 340 int libfdata_list_get_element_at_offset( 341 libfdata_list_t *list, 342 off64_t offset, 343 int *element_index, 344 off64_t *element_data_offset, 345 int *element_file_index, 346 off64_t *element_offset, 347 size64_t *element_size, 348 uint32_t *element_flags, 349 libcerror_error_t **error ); 350 351 /* TODO add libfdata_list_set_element_at_offset */ 352 353 /* List element value functions 354 */ 355 LIBFDATA_EXTERN \ 356 int libfdata_list_cache_element_value( 357 libfdata_list_t *list, 358 libfcache_cache_t *cache, 359 int element_index, 360 int element_file_index, 361 off64_t element_offset, 362 size64_t element_size, 363 uint32_t element_flags, 364 time_t element_timestamp, 365 intptr_t *element_value, 366 int (*free_element_value)( 367 intptr_t **element_value, 368 libcerror_error_t **error ), 369 uint8_t write_flags, 370 libcerror_error_t **error ); 371 372 int libfdata_list_get_element_value( 373 libfdata_list_t *list, 374 intptr_t *file_io_handle, 375 libfcache_cache_t *cache, 376 libfdata_list_element_t *element, 377 intptr_t **element_value, 378 uint8_t read_flags, 379 libcerror_error_t **error ); 380 381 LIBFDATA_EXTERN \ 382 int libfdata_list_get_element_value_by_index( 383 libfdata_list_t *list, 384 intptr_t *file_io_handle, 385 libfcache_cache_t *cache, 386 int element_index, 387 intptr_t **element_value, 388 uint8_t read_flags, 389 libcerror_error_t **error ); 390 391 LIBFDATA_EXTERN \ 392 int libfdata_list_get_element_value_at_offset( 393 libfdata_list_t *list, 394 intptr_t *file_io_handle, 395 libfcache_cache_t *cache, 396 off64_t offset, 397 int *element_index, 398 off64_t *element_data_offset, 399 intptr_t **element_value, 400 uint8_t read_flags, 401 libcerror_error_t **error ); 402 403 int libfdata_list_set_element_value( 404 libfdata_list_t *list, 405 intptr_t *file_io_handle, 406 libfcache_cache_t *cache, 407 libfdata_list_element_t *element, 408 intptr_t *element_value, 409 int (*free_element_value)( 410 intptr_t **element_value, 411 libcerror_error_t **error ), 412 uint8_t write_flags, 413 libcerror_error_t **error ); 414 415 LIBFDATA_EXTERN \ 416 int libfdata_list_set_element_value_by_index( 417 libfdata_list_t *list, 418 intptr_t *file_io_handle, 419 libfcache_cache_t *cache, 420 int element_index, 421 intptr_t *element_value, 422 int (*free_element_value)( 423 intptr_t **element_value, 424 libcerror_error_t **error ), 425 uint8_t write_flags, 426 libcerror_error_t **error ); 427 428 LIBFDATA_EXTERN \ 429 int libfdata_list_set_element_value_at_offset( 430 libfdata_list_t *list, 431 intptr_t *file_io_handle, 432 libfcache_cache_t *cache, 433 off64_t offset, 434 intptr_t *element_value, 435 int (*free_element_value)( 436 intptr_t **element_value, 437 libcerror_error_t **error ), 438 uint8_t write_flags, 439 libcerror_error_t **error ); 440 441 /* IO functions 442 */ 443 LIBFDATA_EXTERN \ 444 int libfdata_list_get_size( 445 libfdata_list_t *list, 446 size64_t *size, 447 libcerror_error_t **error ); 448 449 #if defined( __cplusplus ) 450 } 451 #endif 452 453 #endif /* !defined( _LIBFDATA_INTERNAL_LIST_H ) */ 454 455