home *** CD-ROM | disk | FTP | other *** search
/ ANews 1 / AnewsCD01.iso / Indispensables / Compression / xad / Developer / Sources / clients / xMash.c < prev    next >
C/C++ Source or Header  |  1999-08-09  |  5KB  |  206 lines

  1. #ifndef XADMASTER_XMASH_C
  2. #define XADMASTER_XMASH_C
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        xMash.c
  7.     Main:        xadmaster
  8.     Versionstring:    $VER: xMash.c 1.3 (29.06.1999)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    xMash disk archiver client
  12.  
  13.  1.0   05.09.98 : first version
  14.  1.1   04.02.99 : added new InfoText system
  15.  1.2   20.06.99 : removed exec.library calls
  16.  1.3   29.06.99 : now uses master free stuff
  17. */
  18.  
  19. #include <proto/xadmaster.h>
  20. #include "SDI_compiler.h"
  21. #include "xpkstuff.c"
  22.  
  23. #ifndef XADMASTERFILE
  24. #define xMash_Client        FirstClient
  25. #define NEXTCLIENT        0
  26. UBYTE version[] = "$VER: xMash 1.3 (29.06.1999)";
  27. #endif
  28. #define XMASH_VERSION        1
  29. #define XMASH_REVISION        3
  30.  
  31. /*
  32.   structure of one xMash chunk:
  33.     UBYTE        xmc_Type;
  34.     UBYTE        xmc_Start
  35.     UBYTE        xmc_Num;
  36.     ULONG        xmc_Size;
  37. */
  38.  
  39. #define XMASH_INFOTEXT    0x46
  40. #define XMASH_BANNER    0x42
  41. #define XMASH_ARCHIVE    0x44
  42.  
  43. struct xMashHead {
  44.   UBYTE    type;
  45.   UBYTE start;
  46.   UBYTE num;
  47. };
  48.  
  49. ASM(BOOL) xMash_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
  50. REG(a6, struct xadMasterBase *xadMasterBase))
  51. {
  52.   if(data[0] == 'M' && data[1] == 'S' && data[2] == 'H' &&
  53.   (data[3] == XMASH_BANNER || data[3] == XMASH_ARCHIVE || data[3] ==
  54.   XMASH_INFOTEXT))
  55.     return 1;
  56.   else
  57.     return 0;
  58. }
  59.  
  60. ASM(LONG) xMash_GetInfo(REG(a0, struct xadArchiveInfo *ai),
  61. REG(a6, struct xadMasterBase *xadMasterBase))
  62. {
  63.   LONG err, lowcyl = 80, highcyl = -1;
  64.   ULONG dat[9], start = 3;
  65.   struct xadDiskInfo *xdi;
  66.   struct xadTextInfo *ti = 0;
  67.   struct xMashHead h;
  68.  
  69.   if(!(xdi = (struct xadDiskInfo *) xadAllocObjectA(XADOBJ_DISKINFO, 0)))
  70.     return XADERR_NOMEMORY;
  71.   ai->xai_DiskInfo = xdi;
  72.  
  73.   xdi->xdi_EntryNumber = 1;
  74.   xdi->xdi_SectorSize = 512;
  75.   xdi->xdi_Cylinders = 80;
  76.   xdi->xdi_Heads = 2;
  77.   xdi->xdi_TrackSectors = 11;
  78.   xdi->xdi_CylSectors = 22;
  79.   xdi->xdi_TotalSectors = 80 * 22;
  80.  
  81.   if((err = xadHookAccess(XADAC_INPUTSEEK, 3, 0, ai))) /* skip MSH */
  82.     return err;
  83.  
  84.   while(ai->xai_InPos < ai->xai_InSize && !err)
  85.   {
  86.     if(!(err = xadHookAccess(XADAC_READ, 3, &h, ai)) &&
  87.     !(err = xadHookAccess(XADAC_READ, 4, dat, ai)))
  88.     {
  89.       switch(h.type)
  90.       {
  91.       case XMASH_INFOTEXT: case XMASH_BANNER:
  92.         {
  93.           struct xadTextInfo *ti2;
  94.           if((ti2 = (struct xadTextInfo *) xadAllocObjectA(XADOBJ_TEXTINFO, 0)))
  95.           {
  96.         if(h.type == XMASH_BANNER)
  97.               ti2->xti_Flags |= XADTIF_BANNER;
  98.  
  99.             err = xpkDecrunch(&ti2->xti_Text, &ti2->xti_Size, ai, xadMasterBase);
  100.  
  101.             start = ai->xai_InPos;
  102.  
  103.             if(!ti)
  104.               xdi->xdi_TextInfo = ti2;
  105.             else
  106.               ti->xti_Next = ti2;
  107.             ti = ti2;
  108.           }
  109.           else
  110.             err = XADERR_NOMEMORY;
  111.         break;
  112.         }
  113.       case XMASH_ARCHIVE:
  114.         if(!(err = xadHookAccess(XADAC_READ, 36, dat, ai)) &&
  115.         !(err = xadHookAccess(XADAC_INPUTSEEK, dat[1]-28, 0, ai)))
  116.         {
  117.           if(dat[8] & (1<<25))
  118.           { /* check for password flag in every entry */
  119.             ai->xai_Flags |= XADAIF_CRYPTED;
  120.             xdi->xdi_Flags |= XADDIF_CRYPTED;
  121.           }
  122.           h.num = ((h.num+h.start) >> 1)-1;
  123.           h.start >>= 1;
  124.           if(h.start < lowcyl)
  125.             lowcyl = h.start;
  126.           if(h.num > highcyl)
  127.             highcyl = h.num;
  128.         }
  129.         break;
  130.       }
  131.     }
  132.   }
  133.  
  134.   if(lowcyl <= highcyl)
  135.   {
  136.     xdi->xdi_LowCyl  = lowcyl;
  137.     xdi->xdi_HighCyl = highcyl;
  138.   }
  139.   else
  140.     err = XADERR_INPUT;
  141.  
  142.   if(!err)
  143.     err = xadHookAccess(XADAC_INPUTSEEK, start-ai->xai_InPos, 0, ai);
  144.  
  145.   return err;
  146. }
  147.  
  148. ASM(LONG) xMash_UnArchive(REG(a0, struct xadArchiveInfo *ai),
  149. REG(a6, struct xadMasterBase *xadMasterBase))
  150. {
  151.   struct xMashHead h;
  152.   LONG err = 0, u;
  153.   ULONG size, lowcyl;
  154.   STRPTR a;
  155.  
  156.   u = ai->xai_InPos;
  157.   lowcyl = ai->xai_LowCyl;
  158.  
  159.   while(!err && lowcyl <= ai->xai_HighCyl)
  160.   {
  161.     if(!(err = xadHookAccess(XADAC_READ, 3, &h, ai)) &&
  162.     !(err = xadHookAccess(XADAC_READ, 4, &size, ai)))
  163.     {
  164.       LONG endcyl, startcyl, skipbyte;
  165.  
  166.       startcyl = h.start>>1;
  167.       endcyl = ((h.start+h.num)>>1)-1;
  168.  
  169.       if(endcyl < lowcyl)
  170.         err = xadHookAccess(XADAC_INPUTSEEK, size, 0, ai);
  171.       else
  172.       {
  173.     ULONG size;
  174.         if(!(err = xpkDecrunch(&a, &size, ai, xadMasterBase)))
  175.         {
  176.       skipbyte = 0;
  177.  
  178.           if(startcyl < lowcyl)
  179.             skipbyte = (lowcyl-startcyl)*22*512;
  180.           if(endcyl > ai->xai_HighCyl)
  181.             endcyl = ai->xai_HighCyl;
  182.       size = (endcyl+1-lowcyl)*22*512;
  183.             
  184.           err = xadHookAccess(XADAC_WRITE, size, a+skipbyte, ai);
  185.           xadFreeObjectA(a, 0);
  186.           lowcyl = endcyl+1;
  187.         }
  188.       }
  189.     }
  190.   }
  191.  
  192.   /* seek back to start */
  193.   if(!err)
  194.     err = xadHookAccess(XADAC_INPUTSEEK, u-ai->xai_InPos, 0, ai);
  195.  
  196.   return err;
  197. }
  198.  
  199. struct xadClient xMash_Client = {
  200. NEXTCLIENT, XADCLIENT_VERSION, 2, XMASH_VERSION, XMASH_REVISION, 3,
  201. XADCF_DISKARCHIVER|XADCF_FREEDISKINFO|XADCF_FREETEXTINFO|XADCF_FREETEXTINFOTEXT,
  202. XADCID_XMASH, "xMash", (BOOL (*)()) xMash_RecogData,
  203. (LONG (*)()) xMash_GetInfo, (LONG (*)()) xMash_UnArchive, 0};
  204.  
  205. #endif /* XADASTER_XMASH_C */
  206.