- fix some error handling in blend loader, correct error codes
were not always returned.
This commit is contained in:
@@ -163,7 +163,9 @@ int BLO_idcode_from_name(char *name)
|
|||||||
|
|
||||||
BlendHandle *BLO_blendhandle_from_file(char *file)
|
BlendHandle *BLO_blendhandle_from_file(char *file)
|
||||||
{
|
{
|
||||||
return (BlendHandle*) blo_openblenderfile(file);
|
BlendReadError err;
|
||||||
|
|
||||||
|
return (BlendHandle*) blo_openblenderfile(file, &err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
|
void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
|
||||||
@@ -254,7 +256,7 @@ BlendFileData *BLO_read_from_file(char *file, BlendReadError *error_r)
|
|||||||
BlendFileData *bfd = NULL;
|
BlendFileData *bfd = NULL;
|
||||||
FileData *fd;
|
FileData *fd;
|
||||||
|
|
||||||
fd = blo_openblenderfile(file);
|
fd = blo_openblenderfile(file, error_r);
|
||||||
if (fd) {
|
if (fd) {
|
||||||
bfd= blo_read_file_internal(fd, error_r);
|
bfd= blo_read_file_internal(fd, error_r);
|
||||||
if (bfd) {
|
if (bfd) {
|
||||||
@@ -272,7 +274,7 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, BlendReadError *erro
|
|||||||
BlendFileData *bfd = NULL;
|
BlendFileData *bfd = NULL;
|
||||||
FileData *fd;
|
FileData *fd;
|
||||||
|
|
||||||
fd = blo_openblendermemory(mem, memsize);
|
fd = blo_openblendermemory(mem, memsize, error_r);
|
||||||
if (fd) {
|
if (fd) {
|
||||||
bfd= blo_read_file_internal(fd, error_r);
|
bfd= blo_read_file_internal(fd, error_r);
|
||||||
if (bfd) {
|
if (bfd) {
|
||||||
@@ -290,7 +292,7 @@ BlendFileData *BLO_read_from_memfile(MemFile *memfile, BlendReadError *error_r)
|
|||||||
BlendFileData *bfd = NULL;
|
BlendFileData *bfd = NULL;
|
||||||
FileData *fd;
|
FileData *fd;
|
||||||
|
|
||||||
fd = blo_openblendermemfile(memfile);
|
fd = blo_openblendermemfile(memfile, error_r);
|
||||||
if (fd) {
|
if (fd) {
|
||||||
bfd= blo_read_file_internal(fd, error_r);
|
bfd= blo_read_file_internal(fd, error_r);
|
||||||
if (bfd) {
|
if (bfd) {
|
||||||
|
@@ -854,7 +854,26 @@ static FileData *filedata_new(void)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileData *blo_openblenderfile(char *name)
|
static FileData *blo_decode_and_check(FileData *fd, BlendReadError *error_r)
|
||||||
|
{
|
||||||
|
decode_blender_header(fd);
|
||||||
|
|
||||||
|
if (fd->flags & FD_FLAGS_FILE_OK) {
|
||||||
|
if (!read_file_dna(fd)) {
|
||||||
|
*error_r = BRE_INCOMPLETE;
|
||||||
|
blo_freefiledata(fd);
|
||||||
|
fd= NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*error_r = BRE_NOT_A_BLEND;
|
||||||
|
blo_freefiledata(fd);
|
||||||
|
fd= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileData *blo_openblenderfile(char *name, BlendReadError *error_r)
|
||||||
{
|
{
|
||||||
int file;
|
int file;
|
||||||
char name1[FILE_MAXDIR+FILE_MAXFILE];
|
char name1[FILE_MAXDIR+FILE_MAXFILE];
|
||||||
@@ -869,6 +888,7 @@ FileData *blo_openblenderfile(char *name)
|
|||||||
file= open(name1, O_BINARY|O_RDONLY);
|
file= open(name1, O_BINARY|O_RDONLY);
|
||||||
|
|
||||||
if (file == -1) {
|
if (file == -1) {
|
||||||
|
*error_r = BRE_UNABLE_TO_OPEN;
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
FileData *fd = filedata_new();
|
FileData *fd = filedata_new();
|
||||||
@@ -877,25 +897,14 @@ FileData *blo_openblenderfile(char *name)
|
|||||||
fd->buffersize = BLI_filesize(file);
|
fd->buffersize = BLI_filesize(file);
|
||||||
fd->read = fd_read_from_file;
|
fd->read = fd_read_from_file;
|
||||||
|
|
||||||
decode_blender_header(fd);
|
return blo_decode_and_check(fd, error_r);
|
||||||
|
|
||||||
if (fd->flags & FD_FLAGS_FILE_OK) {
|
|
||||||
if (!read_file_dna(fd)) {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FileData *blo_openblendermemory(void *mem, int memsize)
|
FileData *blo_openblendermemory(void *mem, int memsize, BlendReadError *error_r)
|
||||||
{
|
{
|
||||||
if (!mem || memsize<SIZEOFBLENDERHEADER) {
|
if (!mem || memsize<SIZEOFBLENDERHEADER) {
|
||||||
|
*error_r = mem?BRE_UNABLE_TO_READ:BRE_UNABLE_TO_OPEN;
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
FileData *fd= filedata_new();
|
FileData *fd= filedata_new();
|
||||||
@@ -904,25 +913,14 @@ FileData *blo_openblendermemory(void *mem, int memsize)
|
|||||||
fd->read= fd_read_from_memory;
|
fd->read= fd_read_from_memory;
|
||||||
fd->flags|= FD_FLAGS_NOT_MY_BUFFER;
|
fd->flags|= FD_FLAGS_NOT_MY_BUFFER;
|
||||||
|
|
||||||
decode_blender_header(fd);
|
return blo_decode_and_check(fd, error_r);
|
||||||
|
|
||||||
if (fd->flags & FD_FLAGS_FILE_OK) {
|
|
||||||
if (!read_file_dna(fd)) {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FileData *blo_openblendermemfile(MemFile *memfile)
|
FileData *blo_openblendermemfile(MemFile *memfile, BlendReadError *error_r)
|
||||||
{
|
{
|
||||||
if (!memfile) {
|
if (!memfile) {
|
||||||
|
*error_r = BRE_UNABLE_TO_OPEN;
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
FileData *fd= filedata_new();
|
FileData *fd= filedata_new();
|
||||||
@@ -931,19 +929,7 @@ FileData *blo_openblendermemfile(MemFile *memfile)
|
|||||||
fd->read= fd_read_from_memfile;
|
fd->read= fd_read_from_memfile;
|
||||||
fd->flags|= FD_FLAGS_NOT_MY_BUFFER;
|
fd->flags|= FD_FLAGS_NOT_MY_BUFFER;
|
||||||
|
|
||||||
decode_blender_header(fd);
|
return blo_decode_and_check(fd, error_r);
|
||||||
|
|
||||||
if (fd->flags & FD_FLAGS_FILE_OK) {
|
|
||||||
if (!read_file_dna(fd)) {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5759,8 +5745,9 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
|
|||||||
FileData *fd= mainptr->curlib->filedata;
|
FileData *fd= mainptr->curlib->filedata;
|
||||||
|
|
||||||
if(fd==NULL) {
|
if(fd==NULL) {
|
||||||
|
BlendReadError err;
|
||||||
printf("read lib %s\n", mainptr->curlib->name);
|
printf("read lib %s\n", mainptr->curlib->name);
|
||||||
fd= blo_openblenderfile(mainptr->curlib->name);
|
fd= blo_openblenderfile(mainptr->curlib->name, &err);
|
||||||
if (fd) {
|
if (fd) {
|
||||||
if (fd->libmap)
|
if (fd->libmap)
|
||||||
oldnewmap_free(fd->libmap);
|
oldnewmap_free(fd->libmap);
|
||||||
@@ -5859,19 +5846,9 @@ BlendFileData *blo_read_blendafterruntime(int file, int actualsize, BlendReadErr
|
|||||||
fd->buffersize = actualsize;
|
fd->buffersize = actualsize;
|
||||||
fd->read = fd_read_from_file;
|
fd->read = fd_read_from_file;
|
||||||
|
|
||||||
decode_blender_header(fd);
|
fd = blo_decode_and_check(fd, error_r);
|
||||||
|
if (!fd)
|
||||||
if (fd->flags & FD_FLAGS_FILE_OK) {
|
|
||||||
if (!read_file_dna(fd)) {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
blo_freefiledata(fd);
|
|
||||||
fd= NULL;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
bfd= blo_read_file_internal(fd, error_r);
|
bfd= blo_read_file_internal(fd, error_r);
|
||||||
blo_freefiledata(fd);
|
blo_freefiledata(fd);
|
||||||
|
@@ -100,9 +100,9 @@ void blo_split_main(ListBase *mainlist);
|
|||||||
|
|
||||||
BlendFileData *blo_read_file_internal( FileData *fd, BlendReadError *error_r);
|
BlendFileData *blo_read_file_internal( FileData *fd, BlendReadError *error_r);
|
||||||
|
|
||||||
FileData *blo_openblenderfile( char *name);
|
FileData *blo_openblenderfile( char *name, BlendReadError *error_r);
|
||||||
FileData *blo_openblendermemory( void *buffer, int buffersize);
|
FileData *blo_openblendermemory( void *buffer, int buffersize, BlendReadError *error_r);
|
||||||
FileData *blo_openblendermemfile(struct MemFile *memfile);
|
FileData *blo_openblendermemfile(struct MemFile *memfile, BlendReadError *error_r);
|
||||||
|
|
||||||
void blo_freefiledata( FileData *fd);
|
void blo_freefiledata( FileData *fd);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user