home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / MMSRC029.ZIP / mmail-0.29 / mmail / compress.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-14  |  2.6 KB  |  126 lines

  1. /*
  2.  * MultiMail offline mail reader
  3.  * compress and decompress packets
  4.  
  5.  Copyright (c) 1997 John Zero <john@graphisoft.hu>
  6.  Copyright (c) 1999 William McBrine <wmcbrine@clark.net>
  7.  
  8.  Distributed under the GNU General Public License.
  9.  For details, see the file COPYING in the parent directory. */
  10.  
  11. #include "compress.h"
  12.  
  13. enum atype {A_ARJ, A_ZIP, A_LHA, A_RAR, A_UNKNOWN, A_UNEXIST};
  14.  
  15. atype lastAType = A_UNKNOWN;    // saves last atype for compress routine
  16.  
  17. atype getArchiveType(const char *fname)
  18. {
  19.     FILE *f;
  20.     unsigned magic;
  21.     atype tip = A_UNKNOWN;
  22.  
  23.     if (!(f = fopen(fname, "rb")))
  24.         return A_UNEXIST;
  25.     magic = fgetc(f) << 8;
  26.     magic += fgetc(f);
  27.  
  28.     switch (magic) {
  29.     case 0x60EA:
  30.         tip = A_ARJ;
  31.         break;
  32.     case 0x504B:        // PK - check for ZIP
  33.         if (3 == fgetc(f))
  34.             if (4 == fgetc(f))
  35.                 tip = A_ZIP;
  36.         break;
  37.     case 0x5261:        // Ra - chech for RAR
  38.         if ('r' == fgetc(f))
  39.             if ('!' == fgetc(f))
  40.                 tip = A_RAR;
  41.         break;
  42.     default:        // can be LHA - check 3. and 4. bytes
  43.         if ('-' == fgetc(f))
  44.             if ('l' == fgetc(f))
  45.                 tip = A_LHA;
  46.     // we should check another byte (l/z) but i'm lazy
  47.     }
  48.     fclose(f);
  49.  
  50.     return tip;
  51. }
  52.  
  53. // clears the working directory and uncompresses the packet into it.
  54. pktstatus uncompressFile(resource *ro, const char *fname,
  55.     const char *todir, bool setAType)
  56. {
  57.     char command[255];
  58.     const char *cm;
  59.     atype at;
  60.  
  61.     clearDirectory(todir);
  62.     at = getArchiveType(fname);
  63.     if (at == A_UNEXIST)
  64.         return PKT_UNFOUND;
  65.     if (setAType)
  66.         lastAType = at;
  67.  
  68.     switch (at) {
  69.     case A_ARJ:
  70.         cm = ro->get(arjUncompressCommand);
  71.         break;
  72.     case A_ZIP:
  73.         cm = ro->get(zipUncompressCommand);
  74.         break;
  75.     case A_LHA:
  76.         cm = ro->get(lhaUncompressCommand);
  77.         break;
  78.     case A_RAR:
  79.         cm = ro->get(rarUncompressCommand);
  80.         break;
  81.     default:
  82.         cm = ro->get(unknownUncompressCommand);
  83.     }
  84.  
  85.     sprintf(command, "%s %s", cm, canonize(fname));
  86.  
  87.     return mysystem(command) ? UNCOMP_FAIL : PKT_OK;
  88. };
  89.  
  90. int compressAddFile(resource *ro, const char *arcdir, const char *arcfile, 
  91.             const char *addfname)
  92. {
  93.     char tmp[256], tmp2[256];
  94.     const char *cm;
  95.     int result;
  96.  
  97.     switch (lastAType) {
  98.     case A_ARJ:
  99.         cm = ro->get(arjCompressCommand);
  100.         break;
  101.     case A_ZIP:
  102.         cm = ro->get(zipCompressCommand);
  103.         break;
  104.     case A_LHA:
  105.         cm = ro->get(lhaCompressCommand);
  106.         break;
  107.     case A_RAR:
  108.         cm = ro->get(rarCompressCommand);
  109.         break;
  110.     default:
  111.         cm = ro->get(unknownCompressCommand);
  112.     }
  113.  
  114.     sprintf(tmp2, "%s/%s", arcdir, arcfile);
  115.     sprintf(tmp, "%s %s %s", cm, canonize(tmp2), addfname);
  116.     result = mysystem(tmp);
  117.  
  118.     if (lastAType == A_LHA) {    // then the fixup
  119.         strcpy(tmp2, arcfile);
  120.         strtok(tmp2, ".");
  121.         sprintf(tmp, "%s/%s.bak", arcdir, tmp2);
  122.         remove(tmp);
  123.     }
  124.     return result;
  125. };
  126.