svn merge -r 21041:21301 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / blender / blenkernel / intern / packedFile.c
index 22e4e8a8309e71b0234298820e555affd72a9327..4d88556d8bf33c9faa315a3e4e9c443fb44141c9 100644 (file)
@@ -61,8 +61,9 @@
 #include "BKE_image.h"
 #include "BKE_font.h"
 #include "BKE_packedFile.h"
+#include "BKE_report.h"
 
-int seekPackedFile(PackedFile * pf, int offset, int whence)
+int seekPackedFile(PackedFile *pf, int offset, int whence)
 {
        int oldseek = -1, seek = 0;
 
@@ -92,12 +93,12 @@ int seekPackedFile(PackedFile * pf, int offset, int whence)
        return(oldseek);
 }
        
-void rewindPackedFile(PackedFile * pf)
+void rewindPackedFile(PackedFile *pf)
 {
        seekPackedFile(pf, 0, SEEK_SET);
 }
 
-int readPackedFile(PackedFile * pf, void * data, int size)
+int readPackedFile(PackedFile *pf, void *data, int size)
 { 
        if ((pf != NULL) && (size >= 0) && (data != NULL)) {
                if (size + pf->seek > pf->size) {
@@ -118,66 +119,55 @@ int readPackedFile(PackedFile * pf, void * data, int size)
        return(size);
 }
 
-int countPackedFiles()
+int countPackedFiles(Main *bmain)
 {
-       int count = 0;
        Image *ima;
        VFont *vf;
        bSample *sample;
+       int count = 0;
        
        // let's check if there are packed files...
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile) {
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile)
                        count++;
-               }
-               ima= ima->id.next;
-       }
 
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile) {
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile)
                        count++;
-               }
-               vf = vf->id.next;
-       }
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile) {
-                       count++;
-               }
-               sample = sample->id.next;
-       }
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile)
+                               count++;
 
-       return(count);
+       return count;
 }
 
-void freePackedFile(PackedFile * pf)
+void freePackedFile(PackedFile *pf)
 {
-       if (pf) {
+       if(pf) {
                MEM_freeN(pf->data);
                MEM_freeN(pf);
-       } else {
-               printf("freePackedFile: Trying to free a NULL pointer\n");
        }
+       else
+               printf("freePackedFile: Trying to free a NULL pointer\n");
 }
        
-PackedFile * newPackedFileMemory(void *mem, int memlen)
+PackedFile *newPackedFileMemory(void *mem, int memlen)
 {
-       PackedFile * pf = MEM_callocN(sizeof(*pf), "PackedFile");
+       PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
        pf->data = mem;
        pf->size = memlen;
        
        return pf;
 }
 
-PackedFile * newPackedFile(char * filename)
+PackedFile *newPackedFile(ReportList *reports, char *filename)
 {
-       PackedFile * pf = NULL;
+       PackedFile *pf = NULL;
        int file, filelen;
        char name[FILE_MAXDIR+FILE_MAXFILE];
-       void * data;
+       void *data;
        
        //XXX waitcursor(1);
        
@@ -191,7 +181,7 @@ PackedFile * newPackedFile(char * filename)
 
        file= open(name, O_BINARY|O_RDONLY);
        if (file <= 0) {
-               // error("Can't open file: %s", name);
+               BKE_reportf(reports, RPT_ERROR, "Can't open file: %s", name);
        } else {
                filelen = BLI_filesize(file);
 
@@ -214,36 +204,24 @@ PackedFile * newPackedFile(char * filename)
        return (pf);
 }
 
-void packAll()
+void packAll(Main *bmain, ReportList *reports)
 {
        Image *ima;
        VFont *vf;
        bSample *sample;
        
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile == NULL) {
-                       ima->packedfile = newPackedFile(ima->name);
-               }
-               ima= ima->id.next;
-       }
-       
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile == NULL) {
-                       vf->packedfile = newPackedFile(vf->name);
-               }
-               vf = vf->id.next;
-       }
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile == NULL)
+                       ima->packedfile = newPackedFile(reports, ima->name);
 
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile == NULL)
+                       vf->packedfile = newPackedFile(reports, vf->name);
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile == NULL) {
-                       sound_set_packedfile(sample, newPackedFile(sample->name));
-               }
-               sample = sample->id.next;
-       }
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile == NULL)
+                               sound_set_packedfile(sample, newPackedFile(reports, sample->name));
 }
 
 
@@ -252,10 +230,10 @@ void packAll()
 // attempt to create a function that generates an unique filename
 // this will work when all funtions in fileops.c understand relative filenames...
 
-char * find_new_name(char * name)
+char *find_new_name(char *name)
 {
        char tempname[FILE_MAXDIR + FILE_MAXFILE];
-       char * newname;
+       char *newname;
        
        if (fop_exists(name)) {
                for (number = 1; number <= 999; number++) {
@@ -274,13 +252,13 @@ char * find_new_name(char * name)
        
 */
 
-int writePackedFile(char * filename, PackedFile *pf, int guimode)
+int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int guimode)
 {
        int file, number, remove_tmp = FALSE;
        int ret_value = RET_OK;
        char name[FILE_MAXDIR + FILE_MAXFILE];
        char tempname[FILE_MAXDIR + FILE_MAXFILE];
-/*     void * data; */
+/*     void *data; */
        
        if (guimode); //XXX  waitcursor(1);
        
@@ -305,23 +283,23 @@ int writePackedFile(char * filename, PackedFile *pf, int guimode)
        file = open(name, O_BINARY + O_WRONLY + O_CREAT + O_TRUNC, 0666);
        if (file >= 0) {
                if (write(file, pf->data, pf->size) != pf->size) {
-                       if(guimode) ; //XXX error("Error writing file: %s", name);
+                       BKE_reportf(reports, RPT_ERROR, "Error writing file: %s", name);
                        ret_value = RET_ERROR;
                }
                close(file);
        } else {
-               if(guimode); //XXX error("Error creating file: %s", name);
+               BKE_reportf(reports, RPT_ERROR, "Error creating file: %s", name);
                ret_value = RET_ERROR;
        }
        
        if (remove_tmp) {
                if (ret_value == RET_ERROR) {
                        if (BLI_rename(tempname, name) != 0) {
-                               if(guimode); //XXX error("Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
+                               BKE_reportf(reports, RPT_ERROR, "Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
                        }
                } else {
                        if (BLI_delete(tempname, 0, 0) != 0) {
-                               if(guimode); //XXX error("Error deleting '%s' (ignored)");
+                               BKE_reportf(reports, RPT_ERROR, "Error deleting '%s' (ignored)", tempname);
                        }
                }
        }
@@ -342,7 +320,7 @@ PF_NOFILE           - the original file doens't exist
 
 */
 
-int checkPackedFile(char * filename, PackedFile * pf)
+int checkPackedFile(char *filename, PackedFile *pf)
 {
        struct stat st;
        int ret_val, i, len, file;
@@ -390,68 +368,23 @@ int checkPackedFile(char * filename, PackedFile * pf)
 
 /*
 
-unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
-If how == PF_ASK it offers the user a couple of options what to do with the packed file.
+   unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
 
-It returns a char * to the existing file name / new file name or NULL when
+It returns a char *to the existing file name / new file name or NULL when
 there was an error or when the user desides to cancel the operation.
 
 */
 
-char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
+char *unpackFile(ReportList *reports, char *abs_name, char *local_name, PackedFile *pf, int how)
 {
-       char menu[6 * (FILE_MAXDIR + FILE_MAXFILE + 100)];
+       char menu[6 *(FILE_MAXDIR + FILE_MAXFILE + 100)];
        char line[FILE_MAXDIR + FILE_MAXFILE + 100];
-       char * newname = NULL, * temp = NULL;
+       char *newname = NULL, *temp = NULL;
        
        // char newabs[FILE_MAXDIR + FILE_MAXFILE];
        // char newlocal[FILE_MAXDIR + FILE_MAXFILE];
        
        if (pf != NULL) {
-               if (how == PF_ASK) {
-                       sprintf(menu, "UnPack file%%t|Remove Pack %%x%d", PF_REMOVE);
-                       
-                       if (strcmp(abs_name, local_name)) {
-                               switch (checkPackedFile(local_name, pf)) {
-                                       case PF_NOFILE:
-                                               sprintf(line, "|Create %s%%x%d", local_name, PF_WRITE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                                       case PF_EQUAL:
-                                               sprintf(line, "|Use %s (identical)%%x%d", local_name, PF_USE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                                       case PF_DIFFERS:
-                                               sprintf(line, "|Use %s (differs)%%x%d", local_name, PF_USE_LOCAL);
-                                               strcat(menu, line);
-                                               sprintf(line, "|Overwrite %s%%x%d", local_name, PF_WRITE_LOCAL);
-                                               strcat(menu, line);
-                                               break;
-                               }
-                               // sprintf(line, "|%%x%d", PF_INVALID);
-                               // strcat(menu, line);
-                       }
-                       
-                       switch (checkPackedFile(abs_name, pf)) {
-                               case PF_NOFILE:
-                                       sprintf(line, "|Create %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                               case PF_EQUAL:
-                                       sprintf(line, "|Use %s (identical)%%x%d", abs_name, PF_USE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                               case PF_DIFFERS:
-                                       sprintf(line, "|Use %s (differs)%%x%d", abs_name, PF_USE_ORIGINAL);
-                                       strcat(menu, line);
-                                       sprintf(line, "|Overwrite %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
-                                       strcat(menu, line);
-                                       break;
-                       }
-                       
-                       //XXX how = pupmenu(menu);
-               }
-               
                switch (how) {
                        case -1:
                        case PF_KEEP:
@@ -467,7 +400,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
                                }
                                // else fall through and create it
                        case PF_WRITE_LOCAL:
-                               if (writePackedFile(local_name, pf, 1) == RET_OK) {
+                               if (writePackedFile(reports, local_name, pf, 1) == RET_OK) {
                                        temp = local_name;
                                }
                                break;
@@ -479,7 +412,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
                                }
                                // else fall through and create it
                        case PF_WRITE_ORIGINAL:
-                               if (writePackedFile(abs_name, pf, 1) == RET_OK) {
+                               if (writePackedFile(reports, abs_name, pf, 1) == RET_OK) {
                                        temp = abs_name;
                                }
                                break;
@@ -498,10 +431,10 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
 }
 
 
-int unpackVFont(VFont * vfont, int how)
+int unpackVFont(ReportList *reports, VFont *vfont, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAXFILE], fi[FILE_MAXFILE];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        
        if (vfont != NULL) {
@@ -510,7 +443,7 @@ int unpackVFont(VFont * vfont, int how)
                
                sprintf(localname, "//fonts/%s", fi);
                
-               newname = unpackFile(vfont->name, localname, vfont->packedfile, how);
+               newname = unpackFile(reports, vfont->name, localname, vfont->packedfile, how);
                if (newname != NULL) {
                        ret_value = RET_OK;
                        freePackedFile(vfont->packedfile);
@@ -523,10 +456,10 @@ int unpackVFont(VFont * vfont, int how)
        return (ret_value);
 }
 
-int unpackSample(bSample *sample, int how)
+int unpackSample(ReportList *reports, bSample *sample, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        PackedFile *pf;
        
@@ -535,7 +468,7 @@ int unpackSample(bSample *sample, int how)
                BLI_splitdirstring(localname, fi);
                sprintf(localname, "//samples/%s", fi);
                
-               newname = unpackFile(sample->name, localname, sample->packedfile, how);
+               newname = unpackFile(reports, sample->name, localname, sample->packedfile, how);
                if (newname != NULL) {
                        strcpy(sample->name, newname);
                        MEM_freeN(newname);
@@ -553,10 +486,10 @@ int unpackSample(bSample *sample, int how)
        return(ret_value);
 }
 
-int unpackImage(Image * ima, int how)
+int unpackImage(ReportList *reports, Image *ima, int how)
 {
        char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-       char * newname;
+       char *newname;
        int ret_value = RET_ERROR;
        
        if (ima != NULL) {
@@ -564,7 +497,7 @@ int unpackImage(Image * ima, int how)
                BLI_splitdirstring(localname, fi);
                sprintf(localname, "//textures/%s", fi);
                        
-               newname = unpackFile(ima->name, localname, ima->packedfile, how);
+               newname = unpackFile(reports, ima->name, localname, ima->packedfile, how);
                if (newname != NULL) {
                        ret_value = RET_OK;
                        freePackedFile(ima->packedfile);
@@ -578,33 +511,23 @@ int unpackImage(Image * ima, int how)
        return(ret_value);
 }
 
-void unpackAll(int how)
+void unpackAll(Main *bmain, ReportList *reports, int how)
 {
        Image *ima;
        VFont *vf;
        bSample *sample;
-               
-       ima = G.main->image.first;
-       while (ima) {
-               if (ima->packedfile) {
-                       unpackImage(ima, how);
-               }
-               ima= ima->id.next;
-       }
-       
-       vf = G.main->vfont.first;
-       while (vf) {
-               if (vf->packedfile) {
-                       unpackVFont(vf, how);
-               }
-               vf = vf->id.next;
-       }
 
-       sample = samples->first;
-       while (sample) {
-               if (sample->packedfile) {
-                       unpackSample(sample, how);
-               }
-               sample = sample->id.next;
-       }
+       for(ima=bmain->image.first; ima; ima=ima->id.next)
+               if(ima->packedfile)
+                       unpackImage(reports, ima, how);
+
+       for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+               if(vf->packedfile)
+                       unpackVFont(reports, vf, how);
+
+       if(samples)
+               for(sample=samples->first; sample; sample=sample->id.next)
+                       if(sample->packedfile)
+                               unpackSample(reports, sample, how);
 }
+