home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / varie / xad / developer / sources / clients / xmash.c < prev   
Encoding:
C/C++ Source or Header  |  2000-06-25  |  4.8 KB  |  202 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.4 (29.08.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.  1.4   29.08.99 : now uses xdi_DataPos
  18. */
  19.  
  20. #include <proto/xadmaster.h>
  21. #include "SDI_compiler.h"
  22. #include "xadXPK.c"
  23.  
  24. #ifndef XADMASTERFILE
  25. #define xMash_Client        FirstClient
  26. #define NEXTCLIENT        0
  27. UBYTE version[] = "$VER: xMash 1.4 (29.08.1999)";
  28. #endif
  29. #define XMASH_VERSION        1
  30. #define XMASH_REVISION        4
  31.  
  32. /*
  33.   structure of one xMash chunk:
  34.     UBYTE        xmc_Type;
  35.     UBYTE        xmc_Start
  36.     UBYTE        xmc_Num;
  37.     ULONG        xmc_Size;
  38. */
  39.  
  40. #define XMASH_INFOTEXT    0x46
  41. #define XMASH_BANNER    0x42
  42. #define XMASH_ARCHIVE    0x44
  43.  
  44. struct xMashHead {
  45.   UBYTE    type;
  46.   UBYTE start;
  47.   UBYTE num;
  48. };
  49.  
  50. ASM(BOOL) xMash_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
  51. REG(a6, struct xadMasterBase *xadMasterBase))
  52. {
  53.   if(data[0] == 'M' && data[1] == 'S' && data[2] == 'H' &&
  54.   (data[3] == XMASH_BANNER || data[3] == XMASH_ARCHIVE || data[3] ==
  55.   XMASH_INFOTEXT))
  56.     return 1;
  57.   else
  58.     return 0;
  59. }
  60.  
  61. ASM(LONG) xMash_GetInfo(REG(a0, struct xadArchiveInfo *ai),
  62. REG(a6, struct xadMasterBase *xadMasterBase))
  63. {
  64.   LONG err, lowcyl = 80, highcyl = -1;
  65.   ULONG dat[9], start = 3;
  66.   struct xadDiskInfo *xdi;
  67.   struct xadTextInfo *ti = 0;
  68.   struct xMashHead h;
  69.  
  70.   if(!(xdi = (struct xadDiskInfo *) xadAllocObjectA(XADOBJ_DISKINFO, 0)))
  71.     return XADERR_NOMEMORY;
  72.   ai->xai_DiskInfo = xdi;
  73.  
  74.   xdi->xdi_EntryNumber = 1;
  75.   xdi->xdi_SectorSize = 512;
  76.   xdi->xdi_Cylinders = 80;
  77.   xdi->xdi_Heads = 2;
  78.   xdi->xdi_TrackSectors = 11;
  79.   xdi->xdi_CylSectors = 22;
  80.   xdi->xdi_TotalSectors = 80 * 22;
  81.  
  82.   if((err = xadHookAccess(XADAC_INPUTSEEK, 3, 0, ai))) /* skip MSH */
  83.     return err;
  84.  
  85.   while(ai->xai_InPos < ai->xai_InSize && !err)
  86.   {
  87.     if(!(err = xadHookAccess(XADAC_READ, 3, &h, ai)) &&
  88.     !(err = xadHookAccess(XADAC_READ, 4, dat, ai)))
  89.     {
  90.       switch(h.type)
  91.       {
  92.       case XMASH_INFOTEXT: case XMASH_BANNER:
  93.         {
  94.           struct xadTextInfo *ti2;
  95.           if((ti2 = (struct xadTextInfo *) xadAllocObjectA(XADOBJ_TEXTINFO, 0)))
  96.           {
  97.         if(h.type == XMASH_BANNER)
  98.               ti2->xti_Flags |= XADTIF_BANNER;
  99.  
  100.             err = xpkDecrunch(&ti2->xti_Text, &ti2->xti_Size, ai, xadMasterBase);
  101.  
  102.             start = ai->xai_InPos;
  103.  
  104.             if(!ti)
  105.               xdi->xdi_TextInfo = ti2;
  106.             else
  107.               ti->xti_Next = ti2;
  108.             ti = ti2;
  109.           }
  110.           else
  111.             err = XADERR_NOMEMORY;
  112.         break;
  113.         }
  114.       case XMASH_ARCHIVE:
  115.         if(!(err = xadHookAccess(XADAC_READ, 36, dat, ai)) &&
  116.         !(err = xadHookAccess(XADAC_INPUTSEEK, dat[1]-28, 0, ai)))
  117.         {
  118.           if(dat[8] & (1<<25))
  119.           { /* check for password flag in every entry */
  120.             ai->xai_Flags |= XADAIF_CRYPTED;
  121.             xdi->xdi_Flags |= XADDIF_CRYPTED;
  122.           }
  123.           h.num = ((h.num+h.start) >> 1)-1;
  124.           h.start >>= 1;
  125.           if(h.start < lowcyl)
  126.             lowcyl = h.start;
  127.           if(h.num > highcyl)
  128.             highcyl = h.num;
  129.         }
  130.         break;
  131.       }
  132.     }
  133.   }
  134.  
  135.   if(lowcyl <= highcyl)
  136.   {
  137.     xdi->xdi_LowCyl  = lowcyl;
  138.     xdi->xdi_HighCyl = highcyl;
  139.   }
  140.   else
  141.     err = XADERR_INPUT;
  142.  
  143.   xdi->xdi_DataPos = start;
  144.   xdi->xdi_Flags |= XADDIF_SEEKDATAPOS;
  145.  
  146.   return err;
  147. }
  148.  
  149. ASM(LONG) xMash_UnArchive(REG(a0, struct xadArchiveInfo *ai),
  150. REG(a6, struct xadMasterBase *xadMasterBase))
  151. {
  152.   struct xMashHead h;
  153.   LONG err = 0;
  154.   ULONG size, lowcyl;
  155.   STRPTR a;
  156.  
  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.   return err;
  193. }
  194.  
  195. const struct xadClient xMash_Client = {
  196. NEXTCLIENT, XADCLIENT_VERSION, 7, XMASH_VERSION, XMASH_REVISION, 3,
  197. XADCF_DISKARCHIVER|XADCF_FREEDISKINFO|XADCF_FREETEXTINFO|XADCF_FREETEXTINFOTEXT,
  198. XADCID_XMASH, "xMash", (BOOL (*)()) xMash_RecogData,
  199. (LONG (*)()) xMash_GetInfo, (LONG (*)()) xMash_UnArchive, 0};
  200.  
  201. #endif /* XADASTER_XMASH_C */
  202.