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