[comp.sys.mac.programmer] SFGetFile File Filter problem

lbaum@bcsaic.UUCP (Larry Baum) (06/28/90)

I am trying to get the following code, downloaded from apple.com (Mac
DTS Sample Code #18).  It is a file filter for SFGetFile so that only
files with ALRT resources are shown.

This code is for MPW C and I am using Think C.

When I tried this, I first encouneter a bus error at:

	oldResLoad = *(Boolean *)ResLoad;

I changed that to:

	oldResLoad = ResLoad;

The trouble is that

	PBOpenWD(&WDRec,false);

consistently fails with resErr = -35.

p->fileParam.ioVRefNum is always -1.

Any ideas what is wrong?

Larry Baum
Advanced Technology Center              
Boeing Computer Services     uucp:       uw-beaver!bcsaic!lbaum
(206) 865-3365               internet:   lbaum@atc.boeing.com       

------------------------------< cut here >--------------------

pascal Boolean ComplexFileFilter(p)
	ParmBlkPtr	p;
{
	short			refnum, tRefNum;
	WDPBRec			WDRec;
	ParamBlockRec	oldVol, newVol;
	Boolean			oldResLoad, closeIt;
	Handle			tHandle;
	Boolean			returnVal;

	returnVal = true;		/* Don't show it -- default */

/* Save the current setting of ResLoad. Then set it to FALSE. */

	oldResLoad = *(Boolean *)ResLoad;
	SetResLoad(false);

/* Save the current default directory/volume. */

	oldVol.volumeParam.ioNamePtr = nil;
	PBGetVol(&oldVol,false);

/* Create a working directory for the directory we are examining. */

	WDRec.ioNamePtr = nil;
	WDRec.ioVRefNum = p->fileParam.ioVRefNum;
	WDRec.ioWDProcID = 'ERIK';
	WDRec.ioWDDirID = *(long *)CurDirStore;

	PBOpenWD(&WDRec,false);

/* Set the Working Directory we just created to be the default. */

	newVol.volumeParam.ioNamePtr = nil;
	newVol.volumeParam.ioVRefNum = WDRec.ioVRefNum;

	PBSetVol(&newVol,false);

/* Check the current value of TopMapHndl, open the resource file, and */
/* check it again. If it changed, then note that we should close this */
/* file later when we are done with it. */

	tHandle = *(Handle *)TopMapHndl;
	refnum = OpenResFile(p->fileParam.ioNamePtr);
	if (tHandle != *(Handle *)TopMapHndl)
		closeIt = true;
	else
		closeIt = false;

/* If we successfully opened the file, then count the number of ALRT	*/
/* resources in it. Call UseResFile to make sure that the file we just	*/
/* 'opened' is the current one. We have to do this, as OpenResFile will	*/
/* not make the file the current one if it is already open. So save the	*/
/* current resFile, (possibly) change it to the one we want, read the	*/
/* number of ALRT resources in it, and then set the current resource	*/
/* file back to what it was. Finally, if we need to close the file we	*/
/* opened, do so. */

	if (ResError() == noErr) {
		tRefNum = CurResFile();
		UseResFile(refnum);
		if (Count1Resources('ALRT') > 0) returnVal = false;
		UseResFile(tRefNum);
		if (closeIt) CloseResFile(refnum);
	};

/* All done! Reset the default directory and ResLoad, and then blow. */

	PBSetVol(&oldVol,false);
	PBCloseWD(&WDRec,false);
	SetResLoad(oldResLoad);

	return(returnVal);
};
-- 
Larry Baum
Advanced Technology Center              
Boeing Computer Services     uucp:       uw-beaver!bcsaic!lbaum
(206) 865-3365               internet:   lbaum@atc.boeing.com       

russotto@eng.umd.edu (Matthew T. Russotto) (06/28/90)

In article <27161@bcsaic.UUCP> lbaum@bcsaic.UUCP (Larry Baum) writes:
>
>I am trying to get the following code, downloaded from apple.com (Mac
>DTS Sample Code #18).  It is a file filter for SFGetFile so that only
>files with ALRT resources are shown.
>
>This code is for MPW C and I am using Think C.
>
>When I tried this, I first encouneter a bus error at:
>
>	oldResLoad = *(Boolean *)ResLoad;
>
>I changed that to:
>
>	oldResLoad = ResLoad;
>
If you caught this one, you are going to kick yourself for not catching
the next one :-)
>The trouble is that
>
>	PBOpenWD(&WDRec,false);
>
>consistently fails with resErr = -35.
Not resErr.  ioErr.

>	WDRec.ioWDDirID = *(long *)CurDirStore;
>
>	PBOpenWD(&WDRec,false);

Try WDRec.ioWDDirID = CurDirStore
--
Matthew T. Russotto	russotto@eng.umd.edu	russotto@wam.umd.edu
][, ][+, ///, ///+, //e, //c, IIGS, //c+ --- Any questions?