Cleanup: Packedfile don't repeat yourself.

Introduced `BKE_packedfile_unpack` that is called from the specialized
implementation for Image, Sound, Font, Volume etc. This is in
preparation for T91252.
This commit is contained in:
2021-09-13 14:13:58 +02:00
parent 603ae580ce
commit 4b06420e65
2 changed files with 48 additions and 39 deletions

View File

@@ -74,6 +74,12 @@ char *BKE_packedfile_unpack_to_file(struct ReportList *reports,
const char *local_name,
struct PackedFile *pf,
enum ePF_FileStatus how);
char *BKE_packedfile_unpack(struct Main *bmain,
struct ReportList *reports,
struct ID *id,
const char *orig_file_name,
struct PackedFile *pf,
enum ePF_FileStatus how);
int BKE_packedfile_unpack_vfont(struct Main *bmain,
struct ReportList *reports,
struct VFont *vfont,

View File

@@ -576,26 +576,42 @@ static void unpack_generate_paths(const char *name,
}
}
char *BKE_packedfile_unpack(Main *bmain,
ReportList *reports,
ID *id,
const char *orig_file_path,
PackedFile *pf,
enum ePF_FileStatus how)
{
char localname[FILE_MAX], absname[FILE_MAX];
char *new_name = NULL;
if (id != NULL) {
unpack_generate_paths(
orig_file_path, id, absname, localname, sizeof(absname), sizeof(localname));
new_name = BKE_packedfile_unpack_to_file(
reports, BKE_main_blendfile_path(bmain), absname, localname, pf, how);
}
return new_name;
}
int BKE_packedfile_unpack_vfont(Main *bmain,
ReportList *reports,
VFont *vfont,
enum ePF_FileStatus how)
{
char localname[FILE_MAX], absname[FILE_MAX];
char *newname;
int ret_value = RET_ERROR;
if (vfont) {
char *new_file_path = BKE_packedfile_unpack(
bmain, reports, (ID *)vfont, vfont->filepath, vfont->packedfile, how);
if (vfont != NULL) {
unpack_generate_paths(
vfont->filepath, (ID *)vfont, absname, localname, sizeof(absname), sizeof(localname));
newname = BKE_packedfile_unpack_to_file(
reports, BKE_main_blendfile_path(bmain), absname, localname, vfont->packedfile, how);
if (newname != NULL) {
if (new_file_path != NULL) {
ret_value = RET_OK;
BKE_packedfile_free(vfont->packedfile);
vfont->packedfile = NULL;
BLI_strncpy(vfont->filepath, newname, sizeof(vfont->filepath));
MEM_freeN(newname);
BLI_strncpy(vfont->filepath, new_file_path, sizeof(vfont->filepath));
MEM_freeN(new_file_path);
}
}
@@ -607,18 +623,14 @@ int BKE_packedfile_unpack_sound(Main *bmain,
bSound *sound,
enum ePF_FileStatus how)
{
char localname[FILE_MAX], absname[FILE_MAX];
char *newname;
int ret_value = RET_ERROR;
if (sound != NULL) {
unpack_generate_paths(
sound->filepath, (ID *)sound, absname, localname, sizeof(absname), sizeof(localname));
newname = BKE_packedfile_unpack_to_file(
reports, BKE_main_blendfile_path(bmain), absname, localname, sound->packedfile, how);
if (newname != NULL) {
BLI_strncpy(sound->filepath, newname, sizeof(sound->filepath));
MEM_freeN(newname);
char *new_file_path = BKE_packedfile_unpack(
bmain, reports, (ID *)sound, sound->filepath, sound->packedfile, how);
if (new_file_path != NULL) {
BLI_strncpy(sound->filepath, new_file_path, sizeof(sound->filepath));
MEM_freeN(new_file_path);
BKE_packedfile_free(sound->packedfile);
sound->packedfile = NULL;
@@ -641,16 +653,11 @@ int BKE_packedfile_unpack_image(Main *bmain,
if (ima != NULL) {
while (ima->packedfiles.last) {
char localname[FILE_MAX], absname[FILE_MAX];
char *newname;
ImagePackedFile *imapf = ima->packedfiles.last;
char *new_file_path = BKE_packedfile_unpack(
bmain, reports, (ID *)ima, imapf->filepath, imapf->packedfile, how);
unpack_generate_paths(
imapf->filepath, (ID *)ima, absname, localname, sizeof(absname), sizeof(localname));
newname = BKE_packedfile_unpack_to_file(
reports, BKE_main_blendfile_path(bmain), absname, localname, imapf->packedfile, how);
if (newname != NULL) {
if (new_file_path != NULL) {
ImageView *iv;
ret_value = ret_value == RET_ERROR ? RET_ERROR : RET_OK;
@@ -660,14 +667,14 @@ int BKE_packedfile_unpack_image(Main *bmain,
/* update the new corresponding view filepath */
iv = BLI_findstring(&ima->views, imapf->filepath, offsetof(ImageView, filepath));
if (iv) {
BLI_strncpy(iv->filepath, newname, sizeof(imapf->filepath));
BLI_strncpy(iv->filepath, new_file_path, sizeof(imapf->filepath));
}
/* keep the new name in the image for non-pack specific reasons */
if (how != PF_REMOVE) {
BLI_strncpy(ima->filepath, newname, sizeof(imapf->filepath));
BLI_strncpy(ima->filepath, new_file_path, sizeof(imapf->filepath));
}
MEM_freeN(newname);
MEM_freeN(new_file_path);
}
else {
ret_value = RET_ERROR;
@@ -690,18 +697,14 @@ int BKE_packedfile_unpack_volume(Main *bmain,
Volume *volume,
enum ePF_FileStatus how)
{
char localname[FILE_MAX], absname[FILE_MAX];
char *newfilepath;
int ret_value = RET_ERROR;
if (volume != NULL) {
unpack_generate_paths(
volume->filepath, (ID *)volume, absname, localname, sizeof(absname), sizeof(localname));
newfilepath = BKE_packedfile_unpack_to_file(
reports, BKE_main_blendfile_path(bmain), absname, localname, volume->packedfile, how);
if (newfilepath != NULL) {
BLI_strncpy(volume->filepath, newfilepath, sizeof(volume->filepath));
MEM_freeN(newfilepath);
char *new_file_path = BKE_packedfile_unpack(
bmain, reports, (ID *)volume, volume->filepath, volume->packedfile, how);
if (new_file_path != NULL) {
BLI_strncpy(volume->filepath, new_file_path, sizeof(volume->filepath));
MEM_freeN(new_file_path);
BKE_packedfile_free(volume->packedfile);
volume->packedfile = NULL;