Blender V5.0
readfile.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10#pragma once
11
12#include <cstdio> /* IWYU pragma: keep. Include header using off_t before poisoning it below. */
13#include <optional>
14
15#ifdef WIN32
16# include "BLI_winstuff.h"
17#endif
18
19#include "BLI_fileops.h"
20#include "BLI_filereader.h"
21#include "BLI_map.hh"
22
23#include "DNA_sdna_types.h"
24#include "DNA_space_types.h"
25
26#include "BLO_core_bhead.hh"
28#include "BLO_readfile.hh"
29
30struct BlendFileData;
34struct BLOCacheStorage;
35struct BHeadSort;
37struct IDNameLib_Map;
38struct Key;
39struct Main;
40struct MemFile;
41struct Object;
42struct OldNewMap;
43struct UserDef;
44
66
67/* Disallow since it's 32bit on ms-windows. */
68#ifdef __GNUC__
69# pragma GCC poison off_t
70#endif
71
78struct FileData {
82 bool is_eof = false;
84
85 FileReader *file = nullptr;
86 std::optional<BLI_stat_t> file_stat;
87
94
102 char relabase[FILE_MAX] = {};
103
105 SDNA *filesdna = nullptr;
106 const SDNA *memsdna = nullptr;
108 const char *compflags = nullptr;
110
111 int fileversion = 0;
117
126 int globalf = 0;
127 int fileflags = 0;
128
131
139
140 OldNewMap *datamap = nullptr;
141 OldNewMap *globmap = nullptr;
143 std::shared_ptr<blender::Map<IDHash, ID *>> id_by_deep_hash;
144
150 OldNewMap *libmap = nullptr;
151
153
154 BHeadSort *bheadmap = nullptr;
156
157 std::optional<blender::Map<blender::StringRefNull, BHead *>> bhead_idname_map;
158
166 Main *bmain = nullptr;
168 Main *old_bmain = nullptr;
175 Main *fd_bmain = nullptr;
176
191
193
195 void *storage_handle = nullptr;
196};
197
208void blo_split_main(Main *bmain, bool do_split_packed_ids = true);
213void blo_join_main(Main *bmain);
214
216
222FileData *blo_filedata_from_file(const char *filepath, BlendFileReadReport *reports);
223FileData *blo_filedata_from_memory(const void *mem, int memsize, BlendFileReadReport *reports);
226 BlendFileReadReport *reports);
227
233
235 ATTR_NONNULL(1, 2);
236
240
242
244BHead *blo_bhead_next(FileData *fd, BHead *thisblock) ATTR_NONNULL(1);
246
253const char *blo_bhead_id_name(FileData *fd, const BHead *bhead);
260short blo_bhead_id_flag(const FileData *fd, const BHead *bhead);
265
266/* do versions stuff */
267
277void blo_do_versions_dna(SDNA *sdna, int versionfile, int subversionfile);
278
279void blo_do_versions_oldnewmap_insert(OldNewMap *onm, const void *oldaddr, void *newaddr, int nr);
284 ID *self_id,
285 const bool is_linked_only,
286 const void *adr);
287
294
298void blo_do_versions_userdef(UserDef *userdef);
299
301void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain);
302void blo_do_versions_260(FileData *fd, Library *lib, Main *bmain);
303void blo_do_versions_270(FileData *fd, Library *lib, Main *bmain);
304void blo_do_versions_280(FileData *fd, Library *lib, Main *bmain);
305void blo_do_versions_290(FileData *fd, Library *lib, Main *bmain);
306void blo_do_versions_300(FileData *fd, Library *lib, Main *bmain);
307void blo_do_versions_400(FileData *fd, Library *lib, Main *bmain);
308void blo_do_versions_410(FileData *fd, Library *lib, Main *bmain);
309void blo_do_versions_420(FileData *fd, Library *lib, Main *bmain);
310void blo_do_versions_430(FileData *fd, Library *lib, Main *bmain);
311void blo_do_versions_440(FileData *fd, Library *lib, Main *bmain);
312void blo_do_versions_450(FileData *fd, Library *lib, Main *bmain);
313void blo_do_versions_500(FileData *fd, Library *lib, Main *bmain);
314
328
329void do_versions_after_setup(Main *new_bmain,
330 BlendfileLinkAppendContext *lapp_context,
331 BlendFileReadReport *reports);
332
339void *blo_read_get_new_globaldata_address(FileData *fd, const void *adr) ATTR_NONNULL(1);
340
341/* Mark the Main data as invalid (.blend file reading should be aborted ASAP, and the already read
342 * data should be discarded). Also add an error report to `fd` including given `message`. */
343void blo_readfile_invalidate(FileData *fd, Main *bmain, const char *message) ATTR_NONNULL(1, 2, 3);
#define ATTR_NONNULL(...)
File and directory operations.
Wrapper for reading from various sources (e.g. raw files, compressed files, memory....
#define FILE_MAX
#define ENUM_OPERATORS(_type, _max)
Compatibility-like things for windows.
external readfile function prototypes.
eBLOReadSkip
@ BLO_READ_SKIP_NONE
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void blo_do_versions_oldnewmap_insert(OldNewMap *onm, const void *oldaddr, void *newaddr, int nr)
Definition readfile.cc:286
void * blo_do_versions_newlibadr(FileData *fd, ID *self_id, const bool is_linked_only, const void *adr)
Definition readfile.cc:1523
FileData * blo_filedata_from_memory(const void *mem, int memsize, BlendFileReadReport *reports)
Definition readfile.cc:1350
void blo_do_versions_400(FileData *fd, Library *lib, Main *bmain)
void blo_join_main(Main *bmain)
Definition readfile.cc:359
void blo_do_versions_300(FileData *fd, Library *lib, Main *bmain)
void blo_do_version_old_trackto_to_constraints(Object *ob)
void blo_readfile_invalidate(FileData *fd, Main *bmain, const char *message) ATTR_NONNULL(1
void do_versions_after_linking_450(FileData *fd, Main *bmain)
void do_versions_after_linking_300(FileData *fd, Main *bmain)
void BHead void void blo_cache_storage_old_bmain_clear(FileData *fd, Main *bmain_old) ATTR_NONNULL(1
void blo_do_versions_dna(SDNA *sdna, int versionfile, int subversionfile)
void blo_do_versions_450(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_linking_500(FileData *fd, Main *bmain)
void do_versions_after_linking_410(FileData *fd, Main *bmain)
void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain)
void BHead void blo_cache_storage_init(FileData *fd, Main *bmain) ATTR_NONNULL(1
void blo_do_versions_410(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_linking_400(FileData *fd, Main *bmain)
void do_versions_after_linking_430(FileData *fd, Main *bmain)
void blo_split_main(Main *bmain, bool do_split_packed_ids=true)
Definition readfile.cc:415
void do_versions_after_linking_250(Main *bmain)
void do_versions_after_linking_290(FileData *fd, Main *bmain)
BHead * blo_bhead_next(FileData *fd, BHead *thisblock) ATTR_NONNULL(1)
Definition readfile.cc:713
eFileDataFlag
Definition readfile.hh:48
@ FD_FLAGS_FILE_POINTSIZE_IS_4
Definition readfile.hh:50
@ FD_FLAGS_POINTSIZE_DIFFERS
Definition readfile.hh:51
@ FD_FLAGS_IS_MEMFILE
Definition readfile.hh:53
@ FD_FLAGS_FILE_OK
Definition readfile.hh:52
@ FD_FLAGS_SWITCH_ENDIAN
Definition readfile.hh:49
@ FD_FLAGS_FILE_FUTURE
Definition readfile.hh:58
@ FD_FLAGS_HAS_INVALID_ID_NAMES
Definition readfile.hh:63
void do_versions_after_linking_440(FileData *fd, Main *bmain)
void do_versions_after_linking_420(FileData *fd, Main *bmain)
void blo_do_versions_userdef(UserDef *userdef)
AssetMetaData * blo_bhead_id_asset_data_address(const FileData *fd, const BHead *bhead)
Definition readfile.cc:808
void blo_do_versions_500(FileData *fd, Library *lib, Main *bmain)
FileData * blo_filedata_from_memfile(MemFile *memfile, const BlendFileReadParams *params, BlendFileReadReport *reports)
Definition readfile.cc:1382
BlendFileData FileData * blo_filedata_from_file(const char *filepath, BlendFileReadReport *reports)
Definition readfile.cc:1320
void BHead void void void blo_cache_storage_end(FileData *fd) ATTR_NONNULL(1)
Definition readfile.cc:1754
void blo_do_versions_420(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_linking_280(FileData *fd, Main *bmain)
void blo_do_versions_290(FileData *fd, Library *lib, Main *bmain)
BHead const char * blo_bhead_id_name(FileData *fd, const BHead *bhead)
Definition readfile.cc:784
void blo_filedata_free(FileData *fd) ATTR_NONNULL(1)
Definition readfile.cc:1399
void blo_do_versions_270(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_linking_270(Main *bmain)
void BHead * blo_read_asset_data_block(FileData *fd, BHead *bhead, AssetMetaData **r_asset_data) ATTR_NONNULL(1
BHead * blo_bhead_first(FileData *fd) ATTR_NONNULL(1)
Definition readfile.cc:685
void blo_do_versions_key_uidgen(Key *key)
Definition readfile.cc:2394
BHead * blo_bhead_prev(FileData *fd, BHead *thisblock) ATTR_NONNULL(1
void blo_do_versions_440(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_setup(Main *new_bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport *reports)
BlendFileData * blo_read_file_internal(FileData *fd, const char *filepath) ATTR_NONNULL(1
void blo_do_versions_430(FileData *fd, Library *lib, Main *bmain)
void do_versions_after_linking_260(Main *bmain)
short blo_bhead_id_flag(const FileData *fd, const BHead *bhead)
Definition readfile.cc:798
void blo_do_versions_260(FileData *fd, Library *lib, Main *bmain)
void * blo_read_get_new_globaldata_address(FileData *fd, const void *adr) ATTR_NONNULL(1)
Definition readfile.cc:1512
void blo_make_old_idmap_from_main(FileData *fd, Main *bmain) ATTR_NONNULL(1
void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
void blo_do_versions_280(FileData *fd, Library *lib, Main *bmain)
The meta-data of an asset. By creating and giving this for a data-block (ID.asset_data),...
eBLOReadSkip skip_flags
Definition readfile.hh:130
int undo_direction
Definition readfile.hh:93
int id_asset_data_offset
Definition readfile.hh:122
enum eFileDataFlag flags
Definition readfile.hh:81
ListBase bhead_list
Definition readfile.hh:80
int fileversion
Definition readfile.hh:111
BlenderHeader blender_header
Definition readfile.hh:83
void * storage_handle
Definition readfile.hh:195
int fileflags
Definition readfile.hh:127
DNA_ReconstructInfo * reconstruct_info
Definition readfile.hh:109
BHeadSort * bheadmap
Definition readfile.hh:154
std::optional< blender::Map< blender::StringRefNull, BHead * > > bhead_idname_map
Definition readfile.hh:157
IDNameLib_Map * new_idmap_uid
Definition readfile.hh:190
Main * old_bmain
Definition readfile.hh:168
OldNewMap * globmap
Definition readfile.hh:141
OldNewMap * datamap
Definition readfile.hh:140
int filesubversion
Definition readfile.hh:116
int id_tag_extra
Definition readfile.hh:138
FileReader * file
Definition readfile.hh:85
char relabase[FILE_MAX]
Definition readfile.hh:102
const char * compflags
Definition readfile.hh:108
BLOCacheStorage * cache_storage
Definition readfile.hh:152
std::shared_ptr< blender::Map< IDHash, ID * > > id_by_deep_hash
Definition readfile.hh:143
int globalf
Definition readfile.hh:126
Main * bmain
Definition readfile.hh:166
int id_name_offset
Definition readfile.hh:119
OldNewMap * libmap
Definition readfile.hh:150
BlendFileReadReport * reports
Definition readfile.hh:192
Main * fd_bmain
Definition readfile.hh:175
bool is_eof
Definition readfile.hh:82
int tot_bheadmap
Definition readfile.hh:155
const SDNA * memsdna
Definition readfile.hh:106
IDNameLib_Map * old_idmap_uid
Definition readfile.hh:180
SDNA * filesdna
Definition readfile.hh:105
int id_deep_hash_offset
Definition readfile.hh:124
int id_flag_offset
Definition readfile.hh:123
std::optional< BLI_stat_t > file_stat
Definition readfile.hh:86
Definition DNA_ID.h:414
static DynamicLibrary lib