Blender  V3.3
blender_undo.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
10 #ifndef _WIN32
11 # include <unistd.h> /* for read close */
12 #else
13 # include <io.h> /* for open close read */
14 #endif
15 
16 #include <errno.h>
17 #include <fcntl.h> /* for open */
18 #include <stddef.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 
23 #include "MEM_guardedalloc.h"
24 
25 #include "DNA_scene_types.h"
26 
27 #include "BLI_path_util.h"
28 #include "BLI_string.h"
29 #include "BLI_utildefines.h"
30 
31 #include "BKE_appdir.h"
32 #include "BKE_blender_undo.h" /* own include */
33 #include "BKE_blendfile.h"
34 #include "BKE_context.h"
35 #include "BKE_global.h"
36 #include "BKE_main.h"
37 #include "BKE_undo_system.h"
38 
39 #include "BLO_readfile.h"
40 #include "BLO_undofile.h"
41 #include "BLO_writefile.h"
42 
43 #include "DEG_depsgraph.h"
44 
45 /* -------------------------------------------------------------------- */
49 #define UNDO_DISK 0
50 
52  const eUndoStepDir undo_direction,
53  const bool use_old_bmain_data,
54  bContext *C)
55 {
56  Main *bmain = CTX_data_main(C);
57  char mainstr[sizeof(bmain->filepath)];
58  int success = 0, fileflags;
59 
60  BLI_strncpy(mainstr, BKE_main_blendfile_path(bmain), sizeof(mainstr)); /* temporal store */
61 
62  fileflags = G.fileflags;
63  G.fileflags |= G_FILE_NO_UI;
64 
65  if (UNDO_DISK) {
66  const struct BlendFileReadParams params = {0};
67  BlendFileReadReport bf_reports = {.reports = NULL};
68  struct BlendFileData *bfd = BKE_blendfile_read(mfu->filepath, &params, &bf_reports);
69  if (bfd != NULL) {
70  BKE_blendfile_read_setup(C, bfd, &params, &bf_reports);
71  success = true;
72  }
73  }
74  else {
75  struct BlendFileReadParams params = {0};
76  params.undo_direction = undo_direction;
77  if (!use_old_bmain_data) {
78  params.skip_flags |= BLO_READ_SKIP_UNDO_OLD_MAIN;
79  }
81  bmain, &mfu->memfile, &params, NULL);
82  if (bfd != NULL) {
84  success = true;
85  }
86  }
87 
88  /* Restore, bmain has been re-allocated. */
89  bmain = CTX_data_main(C);
90  STRNCPY(bmain->filepath, mainstr);
91  G.fileflags = fileflags;
92 
93  if (success) {
94  /* important not to update time here, else non keyed transforms are lost */
95  DEG_tag_on_visible_update(bmain, false);
96  }
97 
98  return success;
99 }
100 
102 {
103  MemFileUndoData *mfu = MEM_callocN(sizeof(MemFileUndoData), __func__);
104 
105  /* Include recovery information since undo-data is written out as #BLENDER_QUIT_FILE. */
106  const int fileflags = G.fileflags | G_FILE_RECOVER_WRITE;
107 
108  /* disk save version */
109  if (UNDO_DISK) {
110  static int counter = 0;
111  char filepath[FILE_MAX];
112  char numstr[32];
113 
114  /* Calculate current filepath. */
115  counter++;
116  counter = counter % U.undosteps;
117 
118  BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter);
120 
121  /* success = */ /* UNUSED */ BLO_write_file(
122  bmain, filepath, fileflags, &(const struct BlendFileWriteParams){0}, NULL);
123 
124  BLI_strncpy(mfu->filepath, filepath, sizeof(mfu->filepath));
125  }
126  else {
127  MemFile *prevfile = (mfu_prev) ? &(mfu_prev->memfile) : NULL;
128  if (prevfile) {
129  BLO_memfile_clear_future(prevfile);
130  }
131  /* success = */ /* UNUSED */ BLO_write_file_mem(bmain, prevfile, &mfu->memfile, fileflags);
132  mfu->undo_size = mfu->memfile.size;
133  }
134 
135  bmain->is_memfile_undo_written = true;
136 
137  return mfu;
138 }
139 
141 {
142  BLO_memfile_free(&mfu->memfile);
143  MEM_freeN(mfu);
144 }
145 
struct BlendFileData * BKE_blendfile_read_from_memfile(struct Main *bmain, struct MemFile *memfile, const struct BlendFileReadParams *params, struct ReportList *reports)
Definition: blendfile.c:556
struct BlendFileData * BKE_blendfile_read(const char *filepath, const struct BlendFileReadParams *params, struct BlendFileReadReport *reports)
Definition: blendfile.c:514
void BKE_blendfile_read_setup(struct bContext *C, struct BlendFileData *bfd, const struct BlendFileReadParams *params, struct BlendFileReadReport *reports)
Definition: blendfile.c:506
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1074
@ G_FILE_RECOVER_WRITE
Definition: BKE_global.h:233
@ G_FILE_NO_UI
Definition: BKE_global.h:213
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
eUndoStepDir
#define FILE_MAX
void BLI_join_dirfile(char *__restrict dst, size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
Definition: path_util.c:1531
#define STRNCPY(dst, src)
Definition: BLI_string.h:483
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
external readfile function prototypes.
@ BLO_READ_SKIP_UNDO_OLD_MAIN
Definition: BLO_readfile.h:125
void BLO_memfile_clear_future(MemFile *memfile)
Definition: undofile.c:89
void BLO_memfile_free(MemFile *memfile)
Definition: undofile.c:41
external writefile.c function prototypes.
bool BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, const struct BlendFileWriteParams *params, struct ReportList *reports)
Definition: writefile.c:1315
bool BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags)
Definition: writefile.c:1479
void DEG_tag_on_visible_update(struct Main *bmain, bool do_time)
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:25
#define UNDO_DISK
Definition: blender_undo.c:49
MemFileUndoData * BKE_memfile_undo_encode(Main *bmain, MemFileUndoData *mfu_prev)
Definition: blender_undo.c:101
void BKE_memfile_undo_free(MemFileUndoData *mfu)
Definition: blender_undo.c:140
bool BKE_memfile_undo_decode(MemFileUndoData *mfu, const eUndoStepDir undo_direction, const bool use_old_bmain_data, bContext *C)
Definition: blender_undo.c:51
unsigned int U
Definition: btGjkEpa3.h:78
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * BKE_tempdir_session
ccl_gpu_kernel_postfix ccl_global int * counter
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
#define G(x, y, z)
char filepath[1024]
Definition: BLO_readfile.h:61
struct ReportList * reports
Definition: BLO_readfile.h:80
Definition: BKE_main.h:121
char is_memfile_undo_written
Definition: BKE_main.h:140
char filepath[1024]
Definition: BKE_main.h:124
char filepath[1024]
Definition: BLO_undofile.h:49
size_t size
Definition: BLO_undofile.h:34