home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / FlyPak / flypakutil.cpp < prev   
Encoding:
C/C++ Source or Header  |  2000-02-27  |  4.6 KB  |  260 lines

  1. #include "../Fly3D.h"
  2. #include <direct.h>
  3.  
  4. bool fly_pak_util::implode(char *foldername)
  5. {
  6.     char *str;
  7.     bool rslt;
  8.  
  9.     strcpy(folder, foldername);
  10.  
  11.     str=new char[strlen(foldername)+5];
  12.  
  13.     strcpy(str, foldername);
  14.     strcat(str,".fpk");
  15.     
  16.     fpk=fopen(str, "wb");
  17.  
  18.     delete str;
  19.     
  20.     if(!fpk)
  21.         return false;
  22.  
  23.     filelist=(struct fileinfo *)malloc(0);
  24.     lenfilelist=0;
  25.  
  26.     totalsize=0;
  27.     currsize=0;
  28.  
  29.     rslt=browse(foldername);
  30.  
  31.     if(rslt) rslt=add_header();
  32.     if(rslt) rslt=add_data();
  33.  
  34.     fclose(fpk);
  35.  
  36.     free(filelist);
  37.     
  38.     return rslt;
  39. }
  40.  
  41. bool fly_pak_util::browse(char *foldername)
  42. {
  43.     HANDLE hFindFile;
  44.     WIN32_FIND_DATA FindFileData;
  45.     char *str;
  46.     bool rslt;
  47.  
  48.     str=new char[strlen(foldername)+3];
  49.  
  50.     strcpy(str, foldername);
  51.     strcat(str, "\\*");
  52.  
  53.     hFindFile=FindFirstFile(str, &FindFileData);
  54.  
  55.     delete str;
  56.  
  57.     if(hFindFile==INVALID_HANDLE_VALUE)
  58.         return false;
  59.  
  60.     rslt=true;
  61.  
  62.     do
  63.     {
  64.         if(0==strcmp(FindFileData.cFileName, ".") ||
  65.            0==strcmp(FindFileData.cFileName, ".."))
  66.             continue;
  67.  
  68.         str=new char[strlen(foldername)+strlen(FindFileData.cFileName)+2];
  69.  
  70.         strcpy(str, foldername);
  71.         strcat(str, "\\");
  72.         strcat(str, FindFileData.cFileName);
  73.  
  74.         if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  75.             rslt=browse(str);
  76.         else
  77.             add_filelist(str, (FindFileData.nFileSizeHigh * MAXDWORD) + FindFileData.nFileSizeLow);
  78.  
  79.         delete str;
  80.     }
  81.     while(rslt && FindNextFile(hFindFile, &FindFileData));
  82.  
  83.     FindClose(hFindFile);
  84.  
  85.     return rslt;
  86. }
  87.  
  88. bool fly_pak_util::add(int i)
  89. {
  90.     FILE *f;
  91.     char fb[MAXP];
  92.     bool rslt;
  93.     char bl[10240];
  94.     unsigned long curread;
  95.  
  96.     strcpy(fb, folder);
  97.     strcat(fb, "\\");
  98.     strcat(fb, filelist[i].filename);
  99.  
  100.     if(!(f=fopen(fb,"rb")))
  101.         return false;
  102.  
  103.     rslt=true;
  104.  
  105.     while(rslt && (curread=fread(bl, 1, 10240, f)) )
  106.         if((rslt=(fwrite(bl, 1, curread, fpk)==curread)))
  107.             currsize+=curread;
  108.  
  109.     fclose(f);
  110.  
  111.     return rslt;
  112. }
  113.  
  114. bool fly_pak_util::explode(char *filename)
  115. {
  116.     unsigned int i;
  117.     char str[MAXP], *p;
  118.  
  119.     if(!(fpk=fopen(filename,"rb")))
  120.         return false;
  121.  
  122.     while(p=strrchr(filename, '/')) *p='\\';
  123.  
  124.     if(p=strstr(filename, ".fpk"))
  125.         *p=0;
  126.     else
  127.     {
  128.         fclose(fpk);
  129.         return false;
  130.     }
  131.  
  132.     fread(&lenfilelist, sizeof(unsigned int), 1, fpk);
  133.  
  134.     if(lenfilelist==0)
  135.     {
  136.         fclose(fpk);
  137.         return true;
  138.     }
  139.  
  140.     filelist=new fileinfo[lenfilelist];
  141.  
  142.     fread(filelist, sizeof(struct fileinfo), lenfilelist, fpk);
  143.  
  144.     currsize=0;
  145.     totalsize=0;
  146.  
  147.     for(i=0; i<lenfilelist; i++)
  148.         totalsize+=filelist[i].size;
  149.  
  150.     fseek(fpk, sizeof(unsigned int)+lenfilelist*sizeof(struct fileinfo), SEEK_SET);
  151.  
  152.     for(i=0; i<lenfilelist; i++)
  153.     {
  154.         create_dir(filename, filelist[i].filename);
  155.         strcpy(str, filename);
  156.         strcat(str, "\\");
  157.         strcat(str, filelist[i].filename);
  158.         if(!extract(str, filelist[i].size))
  159.             break;
  160.  
  161.         update_status(filelist[i].filename, filelist[i].size);
  162.     }
  163.  
  164.     fclose(fpk);
  165.     
  166.     return i==lenfilelist;
  167. }
  168.  
  169. bool fly_pak_util::extract(char *filename, unsigned long size)
  170. {
  171.     FILE *fp;
  172.     char bl[10240];
  173.     unsigned long curread, curfile=0;
  174.     unsigned long curb;
  175.     
  176.     if(!(fp=fopen(filename, "wb")))
  177.         return false;
  178.  
  179.     while(curfile<size)
  180.     {
  181.         if(10240+curfile>size)
  182.             curb=size-curfile;
  183.         else
  184.             curb=10240;
  185.  
  186.         if((curread=fread(bl, 1, curb, fpk)) && (fwrite(bl, 1, curread, fp)==curread))
  187.         {
  188.             curfile+=curread;
  189.             currsize+=curread;
  190. //            if(totalsize==0)
  191. //                update_status(100);
  192. //            else
  193. //                update_status((int)((100.0*currsize)/totalsize));
  194.         }
  195.         else
  196.             break;
  197.     }
  198.  
  199.     fclose(fp);
  200.  
  201.     return curfile==size;
  202. }
  203.  
  204. void fly_pak_util::create_dir(char *basefolder, char *filename)
  205. {
  206.     char *p=filename;
  207.     char str[MAXP];
  208.  
  209.     _mkdir(basefolder);
  210.     while(p=strchr(p+1, '\\'))
  211.     {
  212.         *p='\0';
  213.         strcpy(str, basefolder);
  214.         strcat(str, "\\");
  215.         strcat(str, filename);
  216.         _mkdir(str);
  217.         *p='\\';
  218.     }
  219. }
  220.  
  221. void fly_pak_util::add_filelist(char *filename, unsigned long size)
  222. {
  223.     filelist=(struct fileinfo *)realloc(filelist, (++lenfilelist)*sizeof(struct fileinfo));
  224.  
  225.     strcpy(filelist[lenfilelist-1].filename, &filename[strlen(folder)+1]);
  226.     filelist[lenfilelist-1].size=size;
  227.  
  228.     totalsize+=size;
  229. }
  230.  
  231. bool fly_pak_util::add_header()
  232. {
  233.     if(fwrite(&lenfilelist, sizeof(unsigned int), 1, fpk)!=1)
  234.         return false;
  235.  
  236.     if(fwrite(filelist, sizeof(struct fileinfo), lenfilelist, fpk)!=lenfilelist)
  237.         return false;
  238.  
  239.     return true;
  240. }
  241.  
  242. bool fly_pak_util::add_data()
  243. {
  244.     unsigned int i;
  245.  
  246.     for(i=0; i<lenfilelist; i++)
  247.     {
  248.         if(!add(i))
  249.             break;
  250.         
  251.         update_status(filelist[i].filename, filelist[i].size);
  252.     }
  253.  
  254.     return i==lenfilelist;
  255. }
  256.  
  257. void fly_pak_util::update_status(char *filename, unsigned long size)
  258. {
  259. }
  260.