TweetFollow Us on Twitter

Updating Navigation

Volume Number: 16 (2000)
Issue Number: 6
Column Tag: Navigation Services

Updating Navigation Services Sample Code

by Thurman Gillespy III, M.D.

On the Road to Carbon Compliance

Introduction

A recent project gave me an excuse to delve seriously into the Navigation Services (NavServices) SDK for the first time. The SDK includes three example projects (Sampler, StExample, and SimpleText) that illustrate the NavServices API. During routine debugging of my code, however, I discovered multiple "write-to-nil" bugs that had originated in the example projects. This article describes the steps you need to fix those errors and to update the projects to work with CodeWarrior Pro 5 and Universal Headers 3.3. For a pointer to the NavServices SDK, see the References section at the end of this article.

Sampler

Sampler is a small C program that demonstrates to use the NavServices API in a document-based application. It uses NavServices functions to elicit files from the user, save files, and prompt the user to save or discard changes to a document. It also shows how to use NavServices functions to let the user choose a folder, volume, or file-system object. Sampler is a very good place to start learning how to use NavServices. So let's make Sampler usable!

Update Access Paths

In the Access Paths panel of the Sampler.PPC Settings dialog box, remove the 'Shared Libraries' and 'Cincludes' paths from the User Paths list. They are not needed. Then change the System Paths to:

{Compiler}:MacOS Support:
{Compiler}:MSL:

Save the changes to this panel by clicking the Save button.

Implied Int No Longer Allowed

In Templates.c, there is an implied return value of type int to the main function that is no longer legal in C++. Change:

main()

to:

int main(void)

Runtime Library Changes

Change the MWCRuntime.lib library (which is no longer present) to MSL RuntimePPC.Lib.

Add a Header File

Universal Headers 3.3 include the new header file ControlDefinitions.h, which contains some constants previously defined in the file Controls.h. So add the following lines to the file Common.h:

#ifndef __CONTROLDEFINITIONS__
#include <ControlDefinitions.h>
#endif

NavCBRec Field Change

Somewhere between "then and now", the fields in the NavCBRec structure changed. In file.c and menu.c, there are a total of 10 NavCBRecPtr variables to update. Change:

callBackParms->eventData.event

to:

callBackParms->eventData.eventDataParms.event

Duplicate cfrg Resource

A 'cfrg' resource is defined in TemplatePPC.r. This definition is no longer needed because the CodeWarrior IDE now generates the correct resource. I simply commented out the definition in TemplatePPC.r.

/*
resource 'cfrg' (0) {
	{
	kPowerPC,
	kFullLib,
	kNoVersionNum,kNoVersionNum,
	0,0,
	kIsApp,kOnDiskFlat,kZeroOffset,kWholeFork,
	"Template"
	}
};
*/

AEGetDescData Write-to-nil Errors

AEGetDescData (defined in Common.c) is a utility function that extracts a DescType of type typeCode from the AEDesc. In Sampler, it is used to extract an FSSpec from the AEDesc. Listing 1 shows the original function.

Listing 1: Getting data from an AEDesc structure (before)

AEGetDescData

OSErr AEGetDescData(const AEDesc *desc, DescType *typeCode,
				void *dataBuffer, ByteCount maximumSize,
				ByteCount *actualSize)
{
	*typeCode = desc->descriptorType;
	Handle h = (Handle)desc->dataHandle;
	ByteCount dataSize = GetHandleSize(h);
	if (dataSize > maximumSize)
		*actualSize = maximumSize;
	else
		*actualSize = dataSize;
	BlockMoveData(*h, dataBuffer, *actualSize);
	return noErr;
}

The function is acceptable, except for a complete lack of any error checking (a common practice in developer example code). However, AEGetDescData is called 10 times with two NULL pointers (menus.c).

if ((theErr = AEGetDescData ( &resultDesc, NULL,
		&finalFSSpec, sizeof ( FSSpec ), NULL )) == noErr)...

This code fragment results in two writes to nil (typeCode and actualSize) and one read from nil (BlockMoveData). Bad form, indeed. For a fix, I simply check for the NULL parameters; I also added a few other error checks for good measure, as shown in Listing 2.

Listing 1: Getting data from an AEDesc structure (after)

AEGetDescData
OSErr AEGetDescData(const AEDesc *desc, DescType *typeCode,
				void *dataBuffer, ByteCount maximumSize,
				ByteCount *actualSize)
{
	Handle		h = NULL;
	ByteCount	dataSize = 0,
						bytesToCopy = 0;
	OSErr			err = -1;
	
	// check for invalid NULL handles or pointers
	if (desc == NULL || desc->dataHandle == NULL ||
			dataBuffer == NULL)
		return nilHandleErr;
	
	// get the size of the object, check for errors
	h = (Handle)desc->dataHandle;
	dataSize = GetHandleSize(h);
	err = MemError();
	if (err != noErr)
		return err;
	
	// determine how many bytes to copy
	if (dataSize > maximumSize)
		bytesToCopy = maximumSize;
	else
		bytesToCopy = dataSize;

	// copy object from the handle to the buffer
	BlockMoveData(*h, dataBuffer, bytesToCopy);

	// return type code and number of bytes copied,
	// if pointers are not NULL
	if (typeCode != NULL)
		*typeCode = desc->descriptorType;
	if (actualSize != NULL)
		*actualSize = bytesToCopy;
	
	return noErr;
}

AEGetNthDesc Write-to-nil Errors

In Sampler, AEGetNthDesc writes to nil 11 times (files.c, menus.c) because the fourth parameter, a pointer to an AEKeyword structure, is set to NULL.

AEGetNthDesc(&(theReply.selection), index, typeFSS, NULL,
						&resultDesc)

To correct this error, simply add an appropriate AEKeyword parameter.

AEKeyword  aekw; // not used
AEGetNthDesc(&(theReply.selection), index, typeFSS, &aekw,
						&resultDesc)

Sampler CFM68k

For the Sampler.68kCFM project, make the same changes to the access paths, then update the obsolete libraries to the correct versions.

MathLibCFM68k(4i/8d).Lib			==>		MathLibCFM68k (4i_8d).Lib
MSL C.CFM68kFar(4i/8d).Lib		==>		MSL C.CFM68kFa(4i_8d).Lib
MWCFM68kRuntime.Lib					==>		MSL MWCFM68kRuntime.Lib

StExample

The StExample project is a C++ example of using NavServices that is less complete than Sampler. The StExample project is also easier to update.

  • Update the User Paths as you did for Sampler.
  • Update the Navigation library to NavigationLib.
  • In HelloWorld.cp, the last parameter to StNavGetFile must be changed from long to (void *). Change:
StNavGetFile gf1( &err, &specs, &numspecs, &rdopen,
							&navreply, false, true, &rdevt, nil,
							nil, tlh, 0xaabbccdd);

to

UInt32	usrDat = 0xaabbccdd;
StNavGetFile  gf1( &err, &specs, &numspecs, &rdopen,
								&navreply, false, true, &rdevt, nil,
								nil, tlh, (void *)&usrDat );
  • There are two write-to-nil errors, both in StNavServices.cp. Change the NULL fourth parameter in the call to AEGetNthDesc to a valid AEKeyword pointer.

SimpleText

The SimpleText project uses the obsolete QuickDrawGX, and a dated MacIncludes.h header. I decided it wasn't worth the effort to update the project.

Checking the Result

To see the write-to-nil errors, drop into Macsbug and invoke the EBBE (Even Better Bus Error) dcmd.

EBBE on
EBBE is ON (using the value $68F168F1 with a task rate of
	#17 milliseconds)

Then run the unaltered Sampler application as delivered in the SDK. You should see one or more write-to-nil errors in every call to NavServices. Both QC and Spotlight (Onyx Technology) will also catch the errors.

The EBBE dcmd has detected that location $0000
	has been overwritten

After making the corrections described here, run this test again on the compiled example applications and on any of your code based on the SDK sample code. The write-to-nil errors should be eliminated.

References

Navigation Services SDK
<http://developer.apple.com/sdk/index.html>
Onyx Technology
<http://www.onyx-tech.com/>


Thurman Gillespy III is a radiologist at the Veterans Administration Puget Sound Health Care System in Seattle, Washington. He can be reached at tg3@u.washington.edu

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Macs Fan Control 1.5.14 - Monitor and co...
Macs Fan Control allows you to monitor and control almost any aspect of your computer's fans, with support for controlling fan speed, temperature sensors pane, menu-bar icon, and autostart with... Read more
VueScan 9.7.96 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
FileMaker Pro 19.6.1 - Quickly build cus...
FileMaker Pro is the tool you use to create a custom app. You also use FileMaker Pro to access your app on a computer. Start by importing data from a spreadsheet or using a built-in Starter app to... Read more
Duet 3.1.0.0 - Use your iPad as an exter...
Duet is the first app that allows you to use your iDevice as an extra display for your Mac using the Lightning or 30-pin cable. Note: This app requires a iOS companion app. Release notes were... Read more
Firefox 107.0.1 - Fast, safe Web browser...
Firefox offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals and casual... Read more
War Thunder 2.21.1.91 - Multiplayer war...
In War Thunder, aircraft, attack helicopters, ground forces and naval ships collaborate in realistic competitive battles. You can choose from over 1,500 vehicles and an extensive variety of combat... Read more
Numbers 12.2.1 - Apple's spreadshee...
With Apple Numbers, sophisticated spreadsheets are just the start. The whole sheet is your canvas. Just add dramatic interactive charts, tables, and images that paint a revealing picture of your data... Read more
DEVONthink Pro 3.8.7 - Knowledge base, i...
DEVONthink is DEVONtechnologies' document and information management solution. It supports a large variety of file formats and stores them in a database enhanced by artificial intelligence (AI). Many... Read more
Drive Genius 6.2.3 - $79.00
Drive Genius features a comprehensive Malware Scan. Automate your malware protection. Protect your investment from any threat. The Malware Scan is part of the automated DrivePulse utility. DrivePulse... Read more
VLC Media Player 3.0.18 - Popular multim...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more

Latest Forum Discussions

See All

‘Genshin Impact’ Version 3.3 Pre-Install...
Following the reveal of the release date and more for Genshin Impact (Free) version 3.3 ‘All Senses Clear, All Existence Void’, HoYoverse showcased the Genius Invokation TCG that arrives this week in the update. | Read more »
TouchArcade Game of the Week: ‘Sling Min...
The world of PC games has always blown my mind because there’s just SO MUCH stuff out there that it’s not uncommon at all for there to be a game that’s well-liked and well-reviewed, and seemingly quite popular with a solid fanbase, and have it be... | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for December 2nd, 2022. So, today turned out a little quieter than the usual Friday. It was so quiet, in fact, that I decided to pen a few reviews. The Knight Witch, Railbound, and Donut... | Read more »
Blue Archive reveals its latest event st...
Nexon has announced the new update for Blue Archive, under the name of An Unconcealed Heart. Featuring a battle between two academies, the story will follow a group struggling to gain recognition, and will bring three new students to recruit. [... | Read more »
Dead Cells+ Is Out Now on Apple Arcade a...
Following the major update for Dead Cells on iOS and Android a few days ago, Playdigious has brought Dead Cells+ () to Apple Arcade. As an App Store Great, Dead Cells+ includes all prior paid DLC and content updates. It also has exclusive mobile... | Read more »
SwitchArcade Round-Up: ‘Romancing SaGa’,...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for December 1st, 2022. Wow, December. We’re already at the last month of the year? Phew. I have a lot of work to finish in the next few weeks. As for today, we’ve got a little news, a... | Read more »
‘Railbound’ Update Now Available Adding...
One of our favorite puzzlers released this year is Railbound from Afterburn Games, which hit in early September and earned our Game of the Week recognition for being an absolutely ace logic puzzler. The goal is to place rail pieces down in order to... | Read more »
The Seven Deadly Sins: Grand Cross celeb...
Netmarble Corporation has pulled out all the stops to celebrate the 3 and a half year anniversary of The Seven Deadly Sins: Grand Cross. The Grand Cross 3.5th Year Anniversary the Ultimate One, a rather wordy title, brings with it a brand new... | Read more »
‘Skullgirls Mobile’ Major Update 5.2 Out...
Developer Hidden Variable pushed out a major update for Skullgirls Mobile (Free) a few hours ago. The version 5.2 update brings in Black Dahlia (before the console and PC game), Retakes, XP Treats, free gifts, and more. Since launch, Skullgirls... | Read more »
Out Now: ‘Disgaea 4’, ‘Romancing SaGa: M...
Each and every day new mobile games are hitting the App Store, and so each week we put together a big old list of all the best new releases of the past seven days. Back in the day the App Store would showcase the same games for a week, and then... | Read more »

Price Scanner via MacPrices.net

Holiday Sale: Apple AirPods Pro for only $199...
Amazon has new 2022 AirPods Pro in stock and on sale for $199.99 shipped as part of their Holiday sale. Their price is $50 off Apple’s MSRP, equaling their Black Friday price, and it’s the lowest... Read more
New Holiday Sale: Apple retailers are offerin...
Several Apple retailers lowered prices on 10.9″ iPad Airs overnight to lows of $100 off MSRP starting at $499. Their prices are the lowest available for iPad Airs anywhere this Holiday season right... Read more
New Holiday sale at Amazon: Take $50 off Appl...
Amazon has Apple’s new 10th-generation iPads in stock and on sale, for the first time, for $50 off MSRP starting at only $399. Their discount applies to all models and all colors. With the discount,... Read more
Holiday Sale: Get an 8.3″ Apple iPad mini for...
Sams Club has 10.9″ 64GB iPad minis on Holiday sale for $80-$100 off MSRP through December 7, 2022. With their discount, prices start at $399 — the cheapest price for a new iPad mini from any of the... Read more
Sams Club Holiday December Event sale: Apple...
Apple AirPods Max headphones are on sale at Sams Club for $110 off MSRP ($439) as part of their December Event sale, ending on December 7, 2022, valid for all colors. Sale price for online orders... Read more
Apple’s 10.2″ 64GB 9th-generation iPads are o...
Sams Club has 9th-generation 64GB iPads on Holiday sale for $60 off MSRP through December 7, 2022. With their discount, prices start at $259 — the cheapest price for a new iPad from any of the Apple... Read more
11″ 128GB WiFi M2 iPad Pro on sale for $749,...
B&H Photo has the new 11″ 128GB WiFi M2-powered iPad Pro (in Space Gray or Silver) on Holiday sale for $749 including free 1-2 day shipping to most US addresses. Their price is $50 off MSRP and... Read more
Find the best Holiday sale price on an iPad u...
We’ve updated our iPad Price Trackers with the latest information on the new 10th-generation iPads, M2-powered iPad Pros, M1 iPad Airs, iPad minis, and 9th generation iPads from Apple’s authorized... Read more
Apple retailers are offering $100-$150 Holida...
Apple retailers have posted their most-recent Holiday sale prices on 13″ MacBook Airs. Take up to $150 off MSRP on M2-powered Airs with these sales with prices starting at only $1099. Free shipping... Read more
Holiday Sale: Apple’s 14″ MacBook Pros with M...
B&H Photo is offering $200-$300 discounts on Apple’s 14″ MacBook Pros with M1 Pro CPUs as part of their Holiday 2022 sale, with prices starting at $1799. Free 1-2 day shipping is available to... Read more

Jobs Board

Support Technician II - *Apple* Support - O...
…problems and acting as a liaison between customers and resolving groups. As an Apple Technical Specialist, you will be supporting many of our popular Apple Read more
*Apple* Electronic Repair Technician - PlanI...
…a highly motivated individual to join our Production Department as an Apple Electronic Repair Technician. The computer repair technician will diagnose, assemble, Read more
Lead Developer - *Apple* tvOS - Rumble (Uni...
…earnings, and positive sentiment About the role: We are looking for a Lead Apple tvOS Developer to join our application engineering team to expand our video centric Read more
Tier 1 Endpoint Engineer - *Apple* - Red Ri...
…Desk on site, at our Client's location, with a focus on support to Apple products. This position will handle technical support requests directly from customers and Read more
Product Manager II - *Apple* - DISH (United...
…you will be doing We seek an ambitious, data-driven thinker to assist the Apple Product Development team as our new Retail Wireless division continues to grow and Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.