AppleEvents 101 Bug
Volume Number: | | 9
|
Issue Number: | | 7
|
Column Tag: | | Article Rebuttal
|
Related Info: Notification Mgr Event Manager Apple Event Mgr
Apple Events 101 Bug
Bit Mask vs. Bit Number
By John Theisen, Flagstaff, Arizona
About the author
John Theisen, Macintosh Developer
1000 W. Forest Meadows #262, Flagstaff, AZ 86001 USA INTERNET: jjt@naucse.cse.nau.edu
Dear Sirs,
This letter is in response to the writer of AppleEvents 101 in your May 1993 Issue of MacTech Magazine.
While debugging the code that I had entered I came across a few problems with Dr. Kane's InitMac() routine. His painstaking use of the Gestalt Manager to determine the environment that the application is functioning in was done without a flaw, UNTIL he tests for the PPC attributes.
Dr Kane's code reads as follows:
if (BitTest(&response, gestaltPPCSupportsRealTime) != 0)
theErr = PPCInit();
// if this bit is not set, we need to initialize
OK this looks to be correct given the previous calls to Gestalt() and then the testing of the attributes. Apple Inside Macintosh, Volume VI, Using the PPC Toolbox (page 7-10) specifical states that testing for the gestaltPPCSupportsRealTime should be conducted in the following manner:
{1}
err := Gestalt(gestaltPPCToolboxAttr, PPCAttributes);
IF err = noErr
THEN {PPC Toolbox is present}
BEGIN
IF BAND(PPCAttributes, gestaltPPCSupportsRealTime)=0
THEN
BEGIN
{INIT PPC Toolbox HERE}
END
END
This shows that in order to test for the gestaltPPCSupportsRealTime we are using a Binary AND ... this is *NOT* the same as a BitTest operation.
I have substituted the following code which matches more closely with Apple's version:
/* 2 */
if ((response & gestaltPPCSupportsRealTime) == 0)
theErr = PPCInit();
// if this bit is not set, we need to initialize
if ((response & gestaltPPCSupportsOutGoing) == 0);
// tell the user to turn on AppleTalk
if ((response & gestaltPPCSupportsIncoming) == 0);
// tell the user to activate file sharing or Appletalk
For clarification of the BTST operation in the BitTest() procedure provided by Dr.
Kane I am quoting the Motorola M68000 Programmer's Reference Manual
"BTST Test a Bit
A bit in the destination operand is tested, and the state of the specified bit is reflected
in the Z condition code. If a data register is the destination, then the bit number is modulo
32, allowing bit manipulation on all bits in a data register..."
The PPC constants are defined as:
/* 3 */
gestaltPPCToolboxPresent = 0x0000
/* PPC Toolbox is present. Requires PPCInit to be called */
gestaltPPCSupportsRealTime = 0x1000
/* PPC Supports real-time delivery */
gestaltPPCSupportsIncoming = 0x0001
/* PPC will deny incoming network requests */
gestaltPPCSupportsOutGoing = 0x0002
/* PPC will deny outgoing network requests */
[taken from GestaltEqu.h Copyright Apple Computer, Inc. 1988-1990]
In the code originally supplied, we would be testing BIT 4096 (and since 4096 MOD 32 = 0, the code would test BIT 0). This happens to be the bit indicating that the PPC Toolbox is present.
The cases for gestaltPPCSupportsIncoming and gestaltPPCSupportsOutGoing read much the same as the above case for gestaltPPCSupportsRealTime. If used with the BitTest() operation gestaltPPCSupportsIncoming will test BIT 1 instead of BIT 0 (0x0001 in binary has BIT 0 set not BIT 1) and gestaltPPCSupportsOutGoing is also off by 1, testing BIT 2 instead of BIT 1.
When testing for these PPC toolbox attributes, Apple requires that you use these as bit masks and NOT bit numbers. Although your code may check out fine in the testing phase, these lurking bugs will come back to haunt you.
I hope that some other Developers can find this information useful. As a side note, users who wish to notify the user of the AE101 application that they need to turn on Appletalk in the Chooser should notice that the initialization of the Dialog Manager as well as a few other key managers should take place before they try to place any dialogs on the screen.
John Theisen
Macintosh Developer
NOTE Published in Editorial, August 1993:
|
Oops!
Jeff Kane wrote one of our most successful articles - AppleEvents 101 in the May 93 issue. We printed a rebuttal to his article that turned out not to be his bug. Evidently, Apple changed the header files and as a result, the definition of the gestaltPPC constants. Sorry Jeff.