Blender  V3.3
Classes | Variables
bpath.c File Reference
#include <sys/stat.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include "MEM_guardedalloc.h"
#include "DNA_brush_types.h"
#include "DNA_cachefile_types.h"
#include "DNA_fluid_types.h"
#include "DNA_freestyle_types.h"
#include "DNA_image_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_movieclip_types.h"
#include "DNA_node_types.h"
#include "DNA_object_fluidsim_types.h"
#include "DNA_object_force_types.h"
#include "DNA_object_types.h"
#include "DNA_particle_types.h"
#include "DNA_pointcache_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
#include "DNA_sound_types.h"
#include "DNA_text_types.h"
#include "DNA_texture_types.h"
#include "DNA_vfont_types.h"
#include "DNA_volume_types.h"
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BKE_idtype.h"
#include "BKE_image.h"
#include "BKE_lib_id.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_vfont.h"
#include "BKE_bpath.h"
#include "CLG_log.h"
#include "SEQ_iterator.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  BPathFind_Data
 
struct  BPathRebase_Data
 
struct  BPathRemap_Data
 
struct  PathStore
 

Functions

Generic File Path Traversal API
void BKE_bpath_foreach_path_id (BPathForeachPathData *bpath_data, ID *id)
 
void BKE_bpath_foreach_path_main (BPathForeachPathData *bpath_data)
 
bool BKE_bpath_foreach_path_fixed_process (BPathForeachPathData *bpath_data, char *path)
 
bool BKE_bpath_foreach_path_dirfile_fixed_process (BPathForeachPathData *bpath_data, char *path_dir, char *path_file)
 
bool BKE_bpath_foreach_path_allocated_process (BPathForeachPathData *bpath_data, char **path)
 
Check Missing Files
static bool check_missing_files_foreach_path_cb (BPathForeachPathData *bpath_data, char *UNUSED(path_dst), const char *path_src)
 
void BKE_bpath_missing_files_check (Main *bmain, ReportList *reports)
 
Backup/Restore/Free paths list functions.
static bool bpath_list_append (BPathForeachPathData *bpath_data, char *UNUSED(path_dst), const char *path_src)
 
static bool bpath_list_restore (BPathForeachPathData *bpath_data, char *path_dst, const char *path_src)
 
voidBKE_bpath_list_backup (Main *bmain, const eBPathForeachFlag flag)
 
void BKE_bpath_list_restore (Main *bmain, const eBPathForeachFlag flag, void *path_list_handle)
 
void BKE_bpath_list_free (void *path_list_handle)
 

Variables

static CLG_LogRef LOG = {"bke.bpath"}
 

Find Missing Files

#define MAX_DIR_RECURSE   16
 
#define FILESIZE_INVALID_DIRECTORY   -1
 
typedef struct BPathFind_Data BPathFind_Data
 
static bool missing_files_find__recursive (const char *search_directory, const char *filename_src, char r_filename_new[FILE_MAX], int64_t *r_filesize, int *r_recurse_depth)
 
static bool missing_files_find_foreach_path_cb (BPathForeachPathData *bpath_data, char *path_dst, const char *path_src)
 
void BKE_bpath_missing_files_find (Main *bmain, const char *searchpath, ReportList *reports, const bool find_all)
 

Rebase Relative Paths

typedef struct BPathRebase_Data BPathRebase_Data
 
static bool relative_rebase_foreach_path_cb (BPathForeachPathData *bpath_data, char *path_dst, const char *path_src)
 
void BKE_bpath_relative_rebase (Main *bmain, const char *basedir_src, const char *basedir_dst, ReportList *reports)
 

Make Paths Relative Or Absolute

typedef struct BPathRemap_Data BPathRemap_Data
 
static bool relative_convert_foreach_path_cb (BPathForeachPathData *bpath_data, char *path_dst, const char *path_src)
 
static bool absolute_convert_foreach_path_cb (BPathForeachPathData *bpath_data, char *path_dst, const char *path_src)
 
static void bpath_absolute_relative_convert (Main *bmain, const char *basedir, ReportList *reports, BPathForeachPathFunctionCallback callback_function)
 
void BKE_bpath_relative_convert (Main *bmain, const char *basedir, ReportList *reports)
 
void BKE_bpath_absolute_convert (Main *bmain, const char *basedir, ReportList *reports)
 

Macro Definition Documentation

◆ FILESIZE_INVALID_DIRECTORY

#define FILESIZE_INVALID_DIRECTORY   -1

Definition at line 237 of file bpath.c.

◆ MAX_DIR_RECURSE

#define MAX_DIR_RECURSE   16

Definition at line 236 of file bpath.c.

Typedef Documentation

◆ BPathFind_Data

◆ BPathRebase_Data

◆ BPathRemap_Data

Function Documentation

◆ absolute_convert_foreach_path_cb()

static bool absolute_convert_foreach_path_cb ( BPathForeachPathData bpath_data,
char *  path_dst,
const char *  path_src 
)
static

◆ BKE_bpath_absolute_convert()

void BKE_bpath_absolute_convert ( struct Main bmain,
const char *  basedir,
struct ReportList reports 
)

Make all relative file paths in given bmain absolute, using given basedir as root.

Definition at line 564 of file bpath.c.

References absolute_convert_foreach_path_cb(), and bpath_absolute_relative_convert().

Referenced by BLO_write_file(), make_paths_absolute_exec(), and blender::bke::tests::TEST_F().

◆ BKE_bpath_foreach_path_allocated_process()

bool BKE_bpath_foreach_path_allocated_process ( struct BPathForeachPathData bpath_data,
char **  path 
)

Run the callback on a path, replacing the content of the string as needed.

Parameters
pathA pointer to a MEM-allocated string. If modified, it will be freed and replaced by a new allocated string.
Note
path is expected to be FILE_MAX size or smaller.
Returns
true is path was modified and re-allocated, false otherwise.

Definition at line 175 of file bpath.c.

References BPathForeachPathData::absolute_base_path, BLI_path_abs(), BLI_strdup(), BLI_strncpy(), BPathForeachPathData::callback_function, FILE_MAX, and MEM_freeN.

Referenced by text_foreach_path().

◆ BKE_bpath_foreach_path_dirfile_fixed_process()

bool BKE_bpath_foreach_path_dirfile_fixed_process ( struct BPathForeachPathData bpath_data,
char *  path_dir,
char *  path_file 
)

Run the callback on a (directory + file) path, replacing the content of the two strings as needed.

Parameters
path_dirA fixed, FILE_MAXDIR-sized char buffer.
path_fileA fixed, FILE_MAXFILE-sized char buffer.
Returns
true is path_dir and/or path_file were modified, false otherwise.

Definition at line 149 of file bpath.c.

References BPathForeachPathData::absolute_base_path, BLI_join_dirfile(), BLI_path_abs(), BLI_split_dirfile(), BLI_strncpy(), BPathForeachPathData::callback_function, FILE_MAX, FILE_MAXDIR, and FILE_MAXFILE.

Referenced by seq_foreach_path_callback().

◆ BKE_bpath_foreach_path_fixed_process()

bool BKE_bpath_foreach_path_fixed_process ( struct BPathForeachPathData bpath_data,
char *  path 
)

◆ BKE_bpath_foreach_path_id()

void BKE_bpath_foreach_path_id ( BPathForeachPathData bpath_data,
struct ID id 
)

◆ BKE_bpath_foreach_path_main()

void BKE_bpath_foreach_path_main ( BPathForeachPathData bpath_data)

◆ BKE_bpath_list_backup()

void* BKE_bpath_list_backup ( struct Main bmain,
eBPathForeachFlag  flag 
)

Temp backup of paths from all IDs in given bmain.

Returns
An opaque handle to pass to BKE_bpath_list_restore and BKE_bpath_list_free.

Definition at line 619 of file bpath.c.

References BKE_bpath_foreach_path_main(), bpath_list_append(), and MEM_callocN.

Referenced by BKE_blendfile_write_partial(), BLO_write_file(), and blender::bke::tests::TEST_F().

◆ BKE_bpath_list_free()

void BKE_bpath_list_free ( void path_list_handle)

Free the temp backup of paths in path_list_handle.

Note
This function assumes that the path list has already been restored with a call to BKE_bpath_list_restore, and is therefore empty.

Definition at line 641 of file bpath.c.

References BLI_assert, BLI_freelistN(), BLI_listbase_is_empty(), and MEM_freeN.

Referenced by BKE_blendfile_write_partial(), BLO_write_file(), and blender::bke::tests::TEST_F().

◆ BKE_bpath_list_restore()

void BKE_bpath_list_restore ( struct Main bmain,
eBPathForeachFlag  flag,
void path_list_handle 
)

Restore the temp backup of paths from path_list_handle into all IDs in given bmain.

Note
This function assumes that the data in given Main did not change (no addition/deletion/re-ordering of IDs, or their file paths) since the call to BKE_bpath_list_backup that generated the given path_list_handle.

Definition at line 631 of file bpath.c.

References BKE_bpath_foreach_path_main(), and bpath_list_restore().

Referenced by BKE_blendfile_write_partial(), BLO_write_file(), and blender::bke::tests::TEST_F().

◆ BKE_bpath_missing_files_check()

void BKE_bpath_missing_files_check ( struct Main bmain,
struct ReportList reports 
)

◆ BKE_bpath_missing_files_find()

void BKE_bpath_missing_files_find ( struct Main bmain,
const char *  searchpath,
struct ReportList reports,
bool  find_all 
)

Recursively search into given search directory, for all file paths of all IDs in given bmain, and replace existing paths as needed.

Note
The search will happen into the whole search directory tree recursively (with a limit of MAX_DIR_RECURSE), if several files are found matching a searched filename, the biggest one will be used. This is so that things like thumbnails don't get selected instead of the actual image e.g.
Parameters
searchpathThe root directory in which the new filepaths should be searched for.
find_allIf true, also search for files which current path is still valid, if false skip those still valid paths.

Definition at line 368 of file bpath.c.

References BKE_BPATH_FOREACH_PATH_ABSOLUTE, BKE_bpath_foreach_path_main(), BKE_BPATH_FOREACH_PATH_RELOAD_EDITED, BKE_BPATH_FOREACH_PATH_RESOLVE_TOKEN, BKE_main_blendfile_path(), data, BPathFind_Data::find_all, missing_files_find_foreach_path_cb(), NULL, and BPathFind_Data::reports.

Referenced by find_missing_files_exec().

◆ BKE_bpath_relative_convert()

void BKE_bpath_relative_convert ( struct Main bmain,
const char *  basedir,
struct ReportList reports 
)

Make all absolute file paths in given bmain relative to given basedir.

Definition at line 559 of file bpath.c.

References bpath_absolute_relative_convert(), and relative_convert_foreach_path_cb().

Referenced by BLO_write_file(), make_paths_relative_exec(), and blender::bke::tests::TEST_F().

◆ BKE_bpath_relative_rebase()

void BKE_bpath_relative_rebase ( struct Main bmain,
const char *  basedir_src,
const char *  basedir_dst,
struct ReportList reports 
)

Rebase all relative file paths in given bmain from basedir_src to basedir_dst.

Definition at line 439 of file bpath.c.

References BKE_bpath_foreach_path_main(), BKE_BPATH_FOREACH_PATH_SKIP_LINKED, BKE_BPATH_FOREACH_PATH_SKIP_MULTIFILE, BKE_reportf(), BLI_assert, data, NULL, relative_rebase_foreach_path_cb(), RPT_INFO, and RPT_WARNING.

Referenced by BLO_write_file(), and blender::bke::tests::TEST_F().

◆ bpath_absolute_relative_convert()

static void bpath_absolute_relative_convert ( Main bmain,
const char *  basedir,
ReportList reports,
BPathForeachPathFunctionCallback  callback_function 
)
static

◆ bpath_list_append()

static bool bpath_list_append ( BPathForeachPathData bpath_data,
char *  UNUSEDpath_dst,
const char *  path_src 
)
static

Definition at line 580 of file bpath.c.

References BLI_addtail(), BLI_strncpy(), MEM_mallocN, and BPathForeachPathData::user_data.

Referenced by BKE_bpath_list_backup().

◆ bpath_list_restore()

static bool bpath_list_restore ( BPathForeachPathData bpath_data,
char *  path_dst,
const char *  path_src 
)
static

◆ check_missing_files_foreach_path_cb()

static bool check_missing_files_foreach_path_cb ( BPathForeachPathData bpath_data,
char *  UNUSEDpath_dst,
const char *  path_src 
)
static

◆ missing_files_find__recursive()

static bool missing_files_find__recursive ( const char *  search_directory,
const char *  filename_src,
char  r_filename_new[FILE_MAX],
int64_t r_filesize,
int *  r_recurse_depth 
)
static

Find the given filename recursively in the given search directory and its sub-directories.

Note
Use the biggest matching file found, so that thumbnails don't get used by mistake.
Parameters
search_directoryDirectory to search in.
filename_srcSearch for this filename.
r_filename_newThe path of the new found file will be copied here, caller must initialize as empty string.
r_filesizeSize of the file, FILESIZE_INVALID_DIRECTORY if search directory could not be opened.
r_recurse_depthCurrent recursion depth.
Returns
true if found, false otherwise.

Definition at line 253 of file bpath.c.

References BLI_join_dirfile(), BLI_path_ncmp, BLI_stat(), BLI_strncpy(), CLOG_WARN, closedir(), FILE_MAX, FILENAME_IS_CURRPAR, FILESIZE_INVALID_DIRECTORY, LOG, MAX_DIR_RECURSE, NULL, opendir(), readdir(), S_ISDIR, S_ISREG, and size().

Referenced by missing_files_find_foreach_path_cb().

◆ missing_files_find_foreach_path_cb()

static bool missing_files_find_foreach_path_cb ( BPathForeachPathData bpath_data,
char *  path_dst,
const char *  path_src 
)
static

◆ relative_convert_foreach_path_cb()

static bool relative_convert_foreach_path_cb ( BPathForeachPathData bpath_data,
char *  path_dst,
const char *  path_src 
)
static

◆ relative_rebase_foreach_path_cb()

static bool relative_rebase_foreach_path_cb ( BPathForeachPathData bpath_data,
char *  path_dst,
const char *  path_src 
)
static

Variable Documentation

◆ LOG

CLG_LogRef LOG = {"bke.bpath"}
static

Definition at line 74 of file bpath.c.

Referenced by bpath_absolute_relative_convert(), and missing_files_find__recursive().