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