171 lines
3.8 KiB
C
171 lines
3.8 KiB
C
/* Copyright 1986, 1989, 1990 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_resGetinfo[] =
|
|
"$Id: resGetinfo.c 63 2004-12-24 18:19:43Z ctm $";
|
|
#endif
|
|
|
|
/* Forward declarations in ResourceMgr.h (DO NOT DELETE THIS LINE) */
|
|
|
|
#include "rsys/common.h"
|
|
#include "ResourceMgr.h"
|
|
#include "FileMgr.h"
|
|
#include "rsys/resource.h"
|
|
#include "rsys/glue.h"
|
|
#include "rsys/file.h"
|
|
#include "rsys/prefs.h"
|
|
|
|
#define STEF_GetResInfoFix
|
|
|
|
P1(PUBLIC pascal trap, INTEGER, UniqueID, ResType, typ)
|
|
{
|
|
static INTEGER startid = 0;
|
|
INTEGER curmap;
|
|
resmaphand map;
|
|
resref *rr;
|
|
|
|
curmap = CurMap;
|
|
CurMap = ((resmap *) STARH(MR(TopMapHndl)))->resfn;
|
|
while (ROMlib_typidtop(typ, ++startid, &map, &rr) != resNotFound)
|
|
;
|
|
CurMap = curmap;
|
|
return(startid);
|
|
}
|
|
|
|
P1(PUBLIC pascal trap, INTEGER, Unique1ID, ResType, typ) /* IMIV-16 */
|
|
{
|
|
resmaphand map;
|
|
static INTEGER startid = 0;
|
|
resref *rr;
|
|
|
|
map = ROMlib_rntohandl(Cx(CurMap), (Handle *)0);
|
|
if (!map) {
|
|
ROMlib_setreserr(resFNotFound);
|
|
/*-->*/ return 0;
|
|
}
|
|
while (ROMlib_maptypidtop(map, typ, ++startid, &rr) != resNotFound)
|
|
;
|
|
return(startid);
|
|
}
|
|
|
|
P4(PUBLIC pascal trap, void, GetResInfo, Handle, res, INTEGER *, id,
|
|
ResType *, typ, StringPtr, name)
|
|
{
|
|
resmaphand map;
|
|
typref *tr;
|
|
resref *rr;
|
|
|
|
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
|
|
|
|
#if !defined (STEF_GetResInfoFix)
|
|
if (ResErr != noErr)
|
|
return;
|
|
#else
|
|
if (ResErr != noErr)
|
|
{
|
|
if (id)
|
|
*id = -1;
|
|
if (typ)
|
|
*typ = (ResType) 0;
|
|
if (name)
|
|
name[0] = 0;
|
|
/*-->*/ return;
|
|
}
|
|
#endif
|
|
if (id)
|
|
*id = rr->rid;
|
|
if (typ)
|
|
*typ = tr->rtyp;
|
|
if (name) {
|
|
if (rr->noff != -1)
|
|
str255assign(name,
|
|
(StringPtr)((char *)STARH(map) +Hx(map, namoff) + Cx(rr->noff)));
|
|
else
|
|
name[0] = 0;
|
|
}
|
|
}
|
|
|
|
P1(PUBLIC pascal trap, INTEGER, GetResAttrs, Handle, res)
|
|
{
|
|
resmaphand map;
|
|
typref *tr;
|
|
resref *rr;
|
|
|
|
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
|
|
if (ResErr != noErr)
|
|
/*-->*/ return 0;
|
|
return(Cx(rr->ratr));
|
|
}
|
|
|
|
A2(PUBLIC, LONGINT, ROMlib_SizeResource, Handle, res, BOOLEAN, usehandle)
|
|
{
|
|
resmaphand map;
|
|
typref *tr;
|
|
resref *rr;
|
|
Size retval;
|
|
LONGINT loc, lc;
|
|
|
|
ROMlib_setreserr(ROMlib_findres(res, &map, &tr, &rr));
|
|
if (ResErr != noErr)
|
|
/*-->*/ return -1;
|
|
|
|
if (usehandle && (*res).p) /* STARH is overkill */
|
|
retval = GetHandleSize(res);
|
|
else {
|
|
loc = Hx(map, rh.rdatoff) + B3TOLONG(rr->doff);
|
|
ROMlib_setreserr(SetFPos(Hx(map, resfn), fsFromStart, loc));
|
|
if (ResErr != noErr)
|
|
/*-->*/ return -1;
|
|
|
|
/* If the resource is compressed and we want the memory size, not
|
|
the disk size, we have to look at more than the length on the
|
|
disk */
|
|
|
|
if (usehandle && (rr->ratr & resCompressed) && system_version >= 0x700)
|
|
{
|
|
LONGINT l[4]; /* [0] == diskSize,
|
|
[1] == compressedResourceTag,
|
|
[2] == typeFlags,
|
|
[3] == uncompressedSize */
|
|
LONGINT master_save_pos;
|
|
|
|
lc = sizeof (l);
|
|
GetFPos (Hx(map, resfn), &master_save_pos);
|
|
ROMlib_setreserr(FSReadAll(Hx(map, resfn), &lc, (Ptr) l));
|
|
if (ResErr != noErr || l[1] != CLC (COMPRESSED_TAG))
|
|
{
|
|
SetFPos (Hx(map, resfn), fsFromStart, master_save_pos);
|
|
goto not_compressed_after_all;
|
|
}
|
|
else
|
|
{
|
|
if (l[2] != CLC (COMPRESSED_FLAGS))
|
|
{
|
|
ROMlib_setreserr (CantDecompress);
|
|
return -1;
|
|
}
|
|
else
|
|
retval = CL (l[3]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
not_compressed_after_all:
|
|
lc = sizeof(retval);
|
|
ROMlib_setreserr(FSReadAll(Hx(map, resfn), &lc, (Ptr) &retval));
|
|
retval = CL(retval);
|
|
if (ResErr != noErr)
|
|
/*-->*/ return -1;
|
|
}
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
P1(PUBLIC pascal trap, LONGINT, SizeResource, Handle, res)
|
|
{
|
|
return ROMlib_SizeResource(res, TRUE);
|
|
}
|