84 # include "winsock2.h"
94 #define DNA_DEPRECATED_ALLOW
132 #define U (*((const UserDef *)&U))
137 #define MYWRITE_BUFFER_SIZE (MEM_SIZE_OPTIMAL(1 << 17))
138 #define MYWRITE_MAX_CHUNK (MEM_SIZE_OPTIMAL(1 << 15))
170 #define FILE_HANDLE(ww) (ww)->_user_data.file_handle
196 #define FILE_HANDLE(ww) (ww)->_user_data.gz_handle
204 if (
file != Z_NULL) {
225 memset(r_ww, 0,
sizeof(*r_ww));
259 #ifdef USE_WRITE_DATA_LEN
301 if ((wd ==
NULL) || wd->
error || (mem ==
NULL) || memlen < 1) {
305 if (memlen > INT_MAX) {
306 BLI_assert(!
"Cannot write chunks bigger than INT_MAX.");
319 if (wd->
ww->
write(wd->
ww, mem, memlen) != memlen) {
367 #ifdef USE_WRITE_DATA_LEN
368 wd->write_len +=
len;
386 adr = (
const char *)adr + writelen;
416 if (current !=
NULL) {
463 (prev_memchunk !=
NULL &&
499 WriteData *wd,
int filecode,
const int struct_nr,
int nr,
const void *adr,
const void *
data)
503 BLI_assert(struct_nr > 0 && struct_nr < SDNA_TYPE_MAX);
528 WriteData *wd,
int filecode,
const int struct_nr,
int nr,
const void *adr)
543 BLI_assert(!
"Cannot write chunks bigger than INT_MAX.");
548 len = (
len + 3) & ~((
size_t)3);
573 static void writelist_id(
WriteData *wd,
int filecode,
const char *structname,
const ListBase *lb)
579 if (struct_nr == -1) {
580 printf(
"error: can't find SDNA code <%s>\n", structname);
592 #define writestruct_at_address(wd, filecode, struct_id, nr, adr, data) \
593 writestruct_at_address_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr, data)
595 #define writestruct(wd, filecode, struct_id, nr, adr) \
596 writestruct_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), nr, adr)
598 #define writelist(wd, filecode, struct_id, lb) \
599 writelist_nr(wd, filecode, SDNA_TYPE_FROM_STRUCT(struct_id), lb)
627 if (use_active_win) {
636 if (window ==
NULL) {
646 *r_scene = (window) ? window->
scene :
NULL;
673 if (sce->id.lib ==
NULL && (sce == curscene || (sce->r.scemode &
R_BG_RENDER))) {
675 data.sfra = sce->r.sfra;
676 data.efra = sce->r.efra;
677 memset(
data.scene_name, 0,
sizeof(
data.scene_name));
707 if (kmdi->remove_item) {
710 if (kmdi->add_item) {
783 if (
main->curlib &&
main->curlib->packedfile) {
793 while (!found_one && tot--) {
794 for (
id = lbarray[tot]->first;
id;
id =
id->
next) {
816 if (
main->curlib->packedfile) {
819 printf(
"write packed .blend: %s\n",
main->curlib->filepath);
825 for (
id = lbarray[
a]->first;
id;
id =
id->
next) {
831 "ERROR: write file: data-block '%s' from lib '%s' is not linkable "
832 "but is flagged as directly linked",
834 main->curlib->filepath_abs);
860 memset(fg.
_pad, 0,
sizeof(fg.
_pad));
881 memcpy(fg.
subvstr, subvstr, 4);
886 #ifdef WITH_BUILDINFO
939 (
sizeof(
void *) == 8) ?
'-' :
'_',
957 #define ID_BUFFER_STATIC_SIZE 8192
961 Main *bmain = mainvar;
973 void *id_buffer = id_buffer_static;
977 id_buffer =
MEM_mallocN(idtype_struct_size, __func__);
980 for (;
id;
id =
id->
next) {
986 const bool do_override = !
ELEM(override_storage,
NULL, bmain) &&
997 id->recalc_up_to_undo_push =
id->recalc_after_undo_push;
998 id->recalc_after_undo_push = 0;
1001 if (nodetree !=
NULL) {
1017 memcpy(id_buffer,
id, idtype_struct_size);
1019 ((
ID *)id_buffer)->tag = 0;
1023 ((
ID *)id_buffer)->prev =
NULL;
1024 ((
ID *)id_buffer)->next =
NULL;
1038 if (id_buffer != id_buffer_static) {
1044 }
while ((bmain != override_storage) && (bmain = override_storage));
1046 if (override_storage) {
1048 override_storage =
NULL;
1068 memset(&bhead, 0,
sizeof(
BHead));
1082 int hisnr =
U.versions;
1084 if (
U.versions == 0) {
1088 if (strlen(name) < 2) {
1094 BLI_snprintf(tempname1,
sizeof(tempname1),
"%s%d", name, hisnr - 1);
1096 BLI_snprintf(tempname2,
sizeof(tempname2),
"%s%d", name, hisnr);
1108 BLI_snprintf(tempname1,
sizeof(tempname1),
"%s%d", name, hisnr);
1129 const char *filepath,
1130 const int write_flags,
1139 const bool use_save_versions =
params->use_save_versions;
1140 const bool use_save_as_copy =
params->use_save_as_copy;
1141 const bool use_userdef =
params->use_userdef;
1145 void *path_list_backup =
NULL;
1149 BKE_report(reports,
RPT_INFO,
"Checking sanity of current .blend file *BEFORE* save to disk");
1155 BLI_snprintf(tempname,
sizeof(tempname),
"%s@", filepath);
1166 if (ww.
open(&ww, tempname) ==
false) {
1168 reports,
RPT_ERROR,
"Cannot open file %s for writing: %s", tempname, strerror(errno));
1178 if (
G.relbase_valid ==
false) {
1194 if (
G.relbase_valid && (
BLI_path_cmp(dir_dst, dir_src) == 0)) {
1200 if (
G.relbase_valid ==
false) {
1213 switch (remap_mode) {
1252 if (use_save_versions) {
1253 const bool err_hist =
do_history(filepath, reports);
1266 BKE_report(reports,
RPT_INFO,
"Checking sanity of current .blend file *AFTER* save to disk");
1278 bool use_userdef =
false;
1281 mainvar,
NULL, compare, current, write_flags, use_userdef,
NULL);
1297 const char *struct_name,
1299 const void *data_ptr)
1303 printf(
"error: can't find SDNA code <%s>\n", struct_name);
1316 const void *address,
1317 const void *data_ptr)
1323 BlendWriter *writer,
int filecode,
int struct_id,
const void *address,
const void *data_ptr)
1331 const void *data_ptr)
1337 BlendWriter *writer,
int struct_id,
int array_size,
const void *address,
const void *data_ptr)
1351 printf(
"error: can't find SDNA code <%s>\n", struct_name);
1380 BLO_write_raw(writer,
sizeof(
float) * (
size_t)num, data_ptr);
1385 BLO_write_raw(writer,
sizeof(
double) * (
size_t)num, data_ptr);
1390 BLO_write_raw(writer,
sizeof(
void *) * (
size_t)num, data_ptr);
1395 BLO_write_raw(writer,
sizeof(
float[3]) * (
size_t)num, data_ptr);
1403 if (data_ptr !=
NULL) {
#define BLENDER_FILE_SUBVERSION
#define BLENDER_FILE_MIN_VERSION
#define BLENDER_FILE_VERSION
#define BLENDER_FILE_MIN_SUBVERSION
void BKE_bpath_relative_rebase(struct Main *bmain, const char *basedir_src, const char *basedir_dst, struct ReportList *reports)
void BKE_bpath_list_restore(struct Main *bmain, const int flag, void *ls_handle)
void BKE_bpath_relative_convert(struct Main *bmain, const char *basedir, struct ReportList *reports)
void BKE_bpath_list_free(void *ls_handle)
@ BKE_BPATH_TRAVERSE_SKIP_MULTIFILE
@ BKE_BPATH_TRAVERSE_SKIP_LIBRARY
void * BKE_bpath_list_backup(struct Main *bmain, const int flag)
void BKE_bpath_absolute_convert(struct Main *bmain, const char *basedir, struct ReportList *reports)
#define G_FILE_FLAG_ALL_RUNTIME
void IDP_BlendWrite(struct BlendWriter *writer, const struct IDProperty *prop)
bool BKE_idtype_idcode_is_linkable(const short idcode)
const struct IDTypeInfo * BKE_idtype_get_info_from_id(const struct ID *id)
struct ViewLayer * BKE_view_layer_find(const struct Scene *scene, const char *layer_name)
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
#define MAIN_ID_SESSION_UUID_UNSET
void BKE_lib_override_library_operations_store_finalize(OverrideLibraryStorage *override_storage)
void BKE_lib_override_library_operations_store_end(OverrideLibraryStorage *override_storage, struct ID *local)
struct ID * BKE_lib_override_library_operations_store_start(struct Main *bmain, OverrideLibraryStorage *override_storage, struct ID *local)
OverrideLibraryStorage * BKE_lib_override_library_operations_store_init(void)
int set_listbasepointers(struct Main *main, struct ListBase *lb[])
struct bNodeTree * ntreeFromID(struct ID *id)
void BKE_packedfile_blend_write(struct BlendWriter *writer, struct PackedFile *pf)
void BKE_report(ReportList *reports, ReportType type, const char *message)
void BKE_reportf(ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
struct bScreen * BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS
int BLI_open(const char *filename, int oflag, int pmode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_rename(const char *from, const char *to) ATTR_NONNULL()
void * BLI_gzopen(const char *filename, const char *mode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
#define LISTBASE_FOREACH(type, var, list)
void BLI_split_dir_part(const char *string, char *dir, const size_t dirlen)
void BLI_path_normalize(const char *relabase, char *path) ATTR_NONNULL(2)
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
#define POINTER_FROM_UINT(i)
Compatibility-like things for windows.
defines for blend-file codes.
#define BLEN_THUMB_MEMSIZE_FILE(_x, _y)
Utils ensuring .blend file (i.e. Main) is in valid state during write and/or read process.
bool BLO_main_validate_shapekeys(struct Main *bmain, struct ReportList *reports)
bool BLO_main_validate_libraries(struct Main *bmain, struct ReportList *reports)
#define BLO_write_struct(writer, struct_name, data_ptr)
external readfile function prototypes.
void BLO_memfile_chunk_add(MemFileWriteData *mem_data, const char *buf, size_t size)
void BLO_memfile_write_init(MemFileWriteData *mem_data, MemFile *written_memfile, MemFile *reference_memfile)
void BLO_memfile_write_finalize(MemFileWriteData *mem_data)
external writefile function prototypes.
@ BLO_WRITE_PATH_REMAP_NONE
@ BLO_WRITE_PATH_REMAP_RELATIVE_ALL
@ BLO_WRITE_PATH_REMAP_ABSOLUTE
@ BLO_WRITE_PATH_REMAP_RELATIVE
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
@ LIB_TAG_NO_USER_REFCOUNT
#define ID_LINK_PLACEHOLDER
Object groups, one object can be in many groups at once.
blenloader genfile private function prototypes
int DNA_struct_find_nr(const struct SDNA *sdna, const char *str)
const struct SDNA * DNA_sdna_current_get(void)
@ USER_MENU_TYPE_OPERATOR
Read Guarded memory(de)allocation.
ulong build_commit_timestamp
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
int main(int argc, char **argv)
static void WriteData(png_structp png_ptr, png_bytep data, png_size_t length)
void blo_split_main(ListBase *mainlist, Main *main)
void blo_join_main(ListBase *mainlist)
struct ViewLayer * cur_view_layer
uint64_t build_commit_timestamp
struct bScreen * curscreen
IDTypeBlendWriteFunction blend_write
int recalc_after_undo_push
unsigned int session_uuid
int recalc_up_to_undo_push
struct GHash * id_session_uuid_mapping
MemFileChunk * reference_current_chunk
uint current_id_session_uuid
char scene_name[MAX_ID_NAME - 2]
struct Collection * master_collection
struct ListBase user_keymaps
struct ListBase autoexec_paths
struct ListBase user_keyconfig_prefs
struct ListBase user_menus
struct ListBase asset_libraries
bool(* close)(WriteWrap *ww)
size_t(* write)(WriteWrap *ww, const char *data, size_t data_len)
union WriteWrap::@130 _user_data
bool(* open)(WriteWrap *ww, const char *filepath)
struct WorkSpaceInstanceHook * workspace_hook
void BLO_write_double_array(BlendWriter *writer, uint num, const double *data_ptr)
void BLO_write_uint32_array(BlendWriter *writer, uint num, const uint32_t *data_ptr)
static void mywrite_id_begin(WriteData *wd, ID *id)
static void write_thumb(WriteData *wd, const BlendThumbnail *thumb)
static WriteData * mywrite_begin(WriteWrap *ww, MemFile *compare, MemFile *current)
#define MYWRITE_BUFFER_SIZE
#define writestruct(wd, filecode, struct_id, nr, adr)
void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
static void writelist_nr(WriteData *wd, int filecode, const int struct_nr, const ListBase *lb)
void BLO_write_struct_at_address_by_id_with_filecode(BlendWriter *writer, int filecode, int struct_id, const void *address, const void *data_ptr)
static void writestruct_at_address_nr(WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr, const void *data)
static bool ww_open_none(WriteWrap *ww, const char *filepath)
bool BLO_write_file(Main *mainvar, const char *filepath, const int write_flags, const struct BlendFileWriteParams *params, ReportList *reports)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
static void writedata_free(WriteData *wd)
void BLO_write_int32_array(BlendWriter *writer, uint num, const int32_t *data_ptr)
static void write_keymapitem(BlendWriter *writer, const wmKeyMapItem *kmi)
static size_t ww_write_none(WriteWrap *ww, const char *buf, size_t buf_len)
void blo_write_id_struct(BlendWriter *writer, int struct_id, const void *id_address, const ID *id)
struct BlendWriter BlendWriter
static void write_renderinfo(WriteData *wd, Main *mainvar)
static bool ww_close_zlib(WriteWrap *ww)
static void write_userdef(BlendWriter *writer, const UserDef *userdef)
static void write_libraries(WriteData *wd, Main *main)
#define ID_BUFFER_STATIC_SIZE
static size_t ww_write_zlib(WriteWrap *ww, const char *buf, size_t buf_len)
void BLO_write_struct_array_by_id(BlendWriter *writer, int struct_id, int array_size, const void *data_ptr)
static void write_global(WriteData *wd, int fileflags, Main *mainvar)
static WriteData * writedata_new(WriteWrap *ww)
void BLO_write_struct_list_by_id(BlendWriter *writer, int struct_id, ListBase *list)
static void writestruct_nr(WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr)
void BLO_write_float_array(BlendWriter *writer, uint num, const float *data_ptr)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
static void ww_handle_init(eWriteWrapType ww_type, WriteWrap *r_ww)
int BLO_get_struct_id_by_name(BlendWriter *writer, const char *struct_name)
void BLO_write_struct_array_by_name(BlendWriter *writer, const char *struct_name, int array_size, const void *data_ptr)
static bool mywrite_end(WriteData *wd)
static void mywrite_flush(WriteData *wd)
static bool ww_open_zlib(WriteWrap *ww, const char *filepath)
static bool do_history(const char *name, ReportList *reports)
static void writedata(WriteData *wd, int filecode, size_t len, const void *adr)
void BLO_write_raw(BlendWriter *writer, size_t size_in_bytes, const void *data_ptr)
void BLO_write_struct_at_address_by_id(BlendWriter *writer, int struct_id, const void *address, const void *data_ptr)
static void current_screen_compat(Main *mainvar, bool use_active_win, bScreen **r_screen, Scene **r_scene, ViewLayer **r_view_layer)
void BLO_write_struct_array_at_address_by_id(BlendWriter *writer, int struct_id, int array_size, const void *address, const void *data_ptr)
static void writedata_do_write(WriteData *wd, const void *mem, size_t memlen)
bool BLO_write_is_undo(BlendWriter *writer)
static void mywrite(WriteData *wd, const void *adr, size_t len)
bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags)
static void mywrite_id_end(WriteData *wd, ID *UNUSED(id))
static bool ww_close_none(WriteWrap *ww)
#define MYWRITE_MAX_CHUNK
static bool write_file_handle(Main *mainvar, WriteWrap *ww, MemFile *compare, MemFile *current, int write_flags, bool use_userdef, const BlendThumbnail *thumb)
void BLO_write_struct_by_id(BlendWriter *writer, int struct_id, const void *data_ptr)
void BLO_write_struct_list_by_name(BlendWriter *writer, const char *struct_name, ListBase *list)
void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr)
struct RenderInfo RenderInfo