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

  1. #ifndef XADMASTER_XPKSTUFF_C
  2. #define XADMASTER_XPKSTUFF_C
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        xpkstuff.c
  7.     Main:        xadmaster
  8.     Versionstring:    $VER: xpkstuff.c 1.2 (20.06.1999)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    xpk decrunch handling
  12.  
  13.  1.0   14.06.98 : first version
  14.  1.1   10.08.98 : completed xpkDecrunch
  15.  1.2   20.06.99 : removed AllocMem calls
  16. */
  17.  
  18. #include <proto/xpkmaster.h>
  19. #include <proto/xadmaster.h>
  20. #include <proto/exec.h>
  21. #include <exec/memory.h>
  22.  
  23. LONG GetXpkError(LONG err);
  24.  
  25. /* reads XPKF file from current input stream and stores a pointer to
  26. decrunched file in *str and the size in *size */
  27. LONG xpkDecrunch(STRPTR *str, ULONG *size, struct xadArchiveInfo *ai,
  28. struct xadMasterBase *xadMasterBase)
  29. {
  30.   struct Library *XpkBase;
  31.   struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
  32.   ULONG buf[2];
  33.   LONG err;
  34.   ULONG *mem;
  35.   
  36.   if((XpkBase = OpenLibrary("xpkmaster.library", 4)))
  37.   {
  38.     if(!(err = xadHookAccess(XADAC_READ, 8, buf, ai)))
  39.     {
  40.       if((mem = xadAllocVec(buf[1]+8, MEMF_PUBLIC)))
  41.       {
  42.         if(!(err = xadHookAccess(XADAC_READ, buf[1], mem+2, ai)))
  43.         {
  44.           struct XpkFib xfib;
  45.  
  46.           mem[0] = buf[0];
  47.           mem[1] = buf[1];
  48.  
  49.           if(!XpkExamineTags(&xfib, XPK_InBuf, mem,
  50.           XPK_InLen, buf[1]+8, TAG_DONE))
  51.           {
  52.             STRPTR mem2;
  53.  
  54.         if((mem2 = (STRPTR) xadAllocVec(xfib.xf_ULen+XPK_MARGIN,
  55.         MEMF_PUBLIC|MEMF_CLEAR)))
  56.         {
  57.           *str = mem2;
  58.           *size = xfib.xf_ULen;
  59.  
  60.               if((err = GetXpkError(XpkUnpackTags(XPK_InBuf, mem,
  61.               XPK_InLen, buf[1]+8, XPK_OutBuf, mem2, XPK_OutBufLen,
  62.               *size + XPK_MARGIN, ai->xai_Password ? XPK_Password :
  63.               TAG_IGNORE, ai->xai_Password, XPK_UseXfdMaster, 0,
  64.               XPK_PassRequest, FALSE, TAG_DONE))))
  65.               {
  66.                 xadFreeObjectA(mem2, 0); *str = 0; *size = 0;
  67.               }
  68.             }
  69.           }
  70.           else
  71.             err = XADERR_ILLEGALDATA;
  72.         }  
  73.         xadFreeObjectA(mem, 0);
  74.       } /* xadAllocVec */
  75.       else
  76.         err = XADERR_NOMEMORY;
  77.     } /* Hook Read */
  78.     CloseLibrary(XpkBase);
  79.   } /* OpenLibrary */
  80.   else
  81.     err = XADERR_RESOURCE;
  82.  
  83.   return err;
  84. }
  85.  
  86. LONG GetXpkError(LONG err)
  87. {
  88.   LONG ret;
  89.  
  90.   switch(err)
  91.   {
  92.     case XPKERR_OK:        ret = XADERR_OK; break;
  93.     case XPKERR_IOERRIN:    ret = XADERR_INPUT; break;
  94.     case XPKERR_IOERROUT:    ret = XADERR_OUTPUT; break;
  95.     case XPKERR_CORRUPTPKD:
  96.     case XPKERR_TRUNCATED:    ret = XADERR_ILLEGALDATA; break;
  97.     case XPKERR_NOMEM:        ret = XADERR_NOMEMORY; break;
  98.     case XPKERR_WRONGCPU:
  99.     case XPKERR_MISSINGLIB:
  100.     case XPKERR_VERSION:
  101.     case XPKERR_OLDMASTLIB:
  102.     case XPKERR_OLDSUBLIB:
  103.     case XPKERR_NOHARDWARE:
  104.     case XPKERR_BADHARDWARE:    ret = XADERR_RESOURCE; break;
  105.     case XPKERR_NEEDPASSWD:
  106.     case XPKERR_WRONGPW:    ret = XADERR_PASSWORD; break;
  107.     default:            ret = XADERR_DECRUNCH; break;
  108.   };
  109.   return ret;
  110. }
  111.  
  112. #endif /* XADASTER_XPKSTUFF_C */
  113.