[futurebasic] Re: [FB] More R6 Carbon File Basics?

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : March 2002 : Group Archive : Group : All Groups

From: Robert Purves <robert.purves@...>
Date: Fri, 29 Mar 2002 20:59:45 +1200
>The following toolbox access routines allow the user to directly access data
>files. They work fine in R6, except when compiled under carbon they create a
>"function must be defined before using" and other compile errors.
>
>FN OPEN(PBlk&)
>FN CREATE(PBlk&)
>FN FLUSHVOL(PBlk&)
>
>In OS X what is the correct syntax for these routines, if any?

Step 1.  Turn on the checkbox: 
Preferences/DBug/Insure validity of PPC toolboxes. 

Leave it on always (except, perhaps, for compiling your app's shipping version, and even then not a bad idea to leave it on).


Step 2.  Convert old wrong toolbox names in your project to the correct modern names. This avoids ambiguity about what you are actually calling.

Old wrong name             Correct name 

Open, OpenSync, PBOpen     PBOpenSync
Close, CloseSync, PBClose  PBCloseSync
Read,  ReadSync,  PBRead   PBReadSync
FlushVol                   PBFlushVolSync
Create                     PBCreateSync
Control                    PBControlSync
KillIO                     PBKillIOAsync
Status                     PBStatusImmed

Compilation should be unaffected by this renaming.


Step 3. Think: "Why am I using these notoriously incomprehensible ParamBlock routines? They hark back to the 1980's.  Why am I not using the FB file statements: Open, Write #, and so on?  For special toolboxery, if that is really necessary, why don't I use a FSSpec with FSxxxx routines, which would be 1990's code and less conspicuously out of date?" 

Macho Mac programmers would do anything, even drink bad beer, to avoid PBxxxxx calls.

Step 3'  Drink another glass of Fine Old Panther Piss. Go to step 3.


Step 4.  Insert this in your source code, to fix a Release 6 headers bug that wrongly makes PBFlushVolSync seem unavailable in Carbon

#if CarbonLib
toolbox fn PBFlushVolSync(long) = word
#endif


Step 5.    Replace calls to PBCreateSync by PBHCreateSync, which Apple says is (very nearly) an equivalent.

Replace calls to PBOpenSync by PBHOpenDFSync.  This is preferred, according to Apple, over the obvious alternative PBHOpenSync.



Step 6.  Special action is needed whenever a ParamBlock gets its ioRefNum% field set to a wdRefNum, as obtained from FB Files$(...).  A wdRefNum was a workaround introduced by Apple for HFS, to allow old MFS file calls to limp along into System 6. Apple discontinued it in Carbon, where no toolbox routines can accept a wdRefNum parameter.

PBlk&.ioVRefNum%=Vol% ' this is volume reference number
// Note: the var named vol% may be wrongly named and commented.
// If it came from an FB Files$(...) statement, it's a wdRefNum

You *must* call FBWDToPBWD(PBlk&)  before supplying the PBlk to any PBxxxxx toolbox routine.  FBWDToPBWD fixes up the ParamBlock to resolve the obsolete wdRefNum. This is an ingenious Andy Gariepy workaround, to help old FB code to survive into OS X.


HTH,

Robert P.