home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ANews 1
/
AnewsCD01.iso
/
Indispensables
/
Compression
/
xad
/
Developer
/
Sources
/
clients
/
xpkstuff.c
< prev
Wrap
C/C++ Source or Header
|
1999-08-09
|
3KB
|
113 lines
#ifndef XADMASTER_XPKSTUFF_C
#define XADMASTER_XPKSTUFF_C
/* Programmheader
Name: xpkstuff.c
Main: xadmaster
Versionstring: $VER: xpkstuff.c 1.2 (20.06.1999)
Author: SDI
Distribution: Freeware
Description: xpk decrunch handling
1.0 14.06.98 : first version
1.1 10.08.98 : completed xpkDecrunch
1.2 20.06.99 : removed AllocMem calls
*/
#include <proto/xpkmaster.h>
#include <proto/xadmaster.h>
#include <proto/exec.h>
#include <exec/memory.h>
LONG GetXpkError(LONG err);
/* reads XPKF file from current input stream and stores a pointer to
decrunched file in *str and the size in *size */
LONG xpkDecrunch(STRPTR *str, ULONG *size, struct xadArchiveInfo *ai,
struct xadMasterBase *xadMasterBase)
{
struct Library *XpkBase;
struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
ULONG buf[2];
LONG err;
ULONG *mem;
if((XpkBase = OpenLibrary("xpkmaster.library", 4)))
{
if(!(err = xadHookAccess(XADAC_READ, 8, buf, ai)))
{
if((mem = xadAllocVec(buf[1]+8, MEMF_PUBLIC)))
{
if(!(err = xadHookAccess(XADAC_READ, buf[1], mem+2, ai)))
{
struct XpkFib xfib;
mem[0] = buf[0];
mem[1] = buf[1];
if(!XpkExamineTags(&xfib, XPK_InBuf, mem,
XPK_InLen, buf[1]+8, TAG_DONE))
{
STRPTR mem2;
if((mem2 = (STRPTR) xadAllocVec(xfib.xf_ULen+XPK_MARGIN,
MEMF_PUBLIC|MEMF_CLEAR)))
{
*str = mem2;
*size = xfib.xf_ULen;
if((err = GetXpkError(XpkUnpackTags(XPK_InBuf, mem,
XPK_InLen, buf[1]+8, XPK_OutBuf, mem2, XPK_OutBufLen,
*size + XPK_MARGIN, ai->xai_Password ? XPK_Password :
TAG_IGNORE, ai->xai_Password, XPK_UseXfdMaster, 0,
XPK_PassRequest, FALSE, TAG_DONE))))
{
xadFreeObjectA(mem2, 0); *str = 0; *size = 0;
}
}
}
else
err = XADERR_ILLEGALDATA;
}
xadFreeObjectA(mem, 0);
} /* xadAllocVec */
else
err = XADERR_NOMEMORY;
} /* Hook Read */
CloseLibrary(XpkBase);
} /* OpenLibrary */
else
err = XADERR_RESOURCE;
return err;
}
LONG GetXpkError(LONG err)
{
LONG ret;
switch(err)
{
case XPKERR_OK: ret = XADERR_OK; break;
case XPKERR_IOERRIN: ret = XADERR_INPUT; break;
case XPKERR_IOERROUT: ret = XADERR_OUTPUT; break;
case XPKERR_CORRUPTPKD:
case XPKERR_TRUNCATED: ret = XADERR_ILLEGALDATA; break;
case XPKERR_NOMEM: ret = XADERR_NOMEMORY; break;
case XPKERR_WRONGCPU:
case XPKERR_MISSINGLIB:
case XPKERR_VERSION:
case XPKERR_OLDMASTLIB:
case XPKERR_OLDSUBLIB:
case XPKERR_NOHARDWARE:
case XPKERR_BADHARDWARE: ret = XADERR_RESOURCE; break;
case XPKERR_NEEDPASSWD:
case XPKERR_WRONGPW: ret = XADERR_PASSWORD; break;
default: ret = XADERR_DECRUNCH; break;
};
return ret;
}
#endif /* XADASTER_XPKSTUFF_C */