
- Home
- Magazine
- Conference & Seminars
- News
- Archives
- Forums
- Store
- Directory
- Editorial
- Advertising
- User/Login
- Contact



The use of custom resources provides unique ways of handling information on the Macintosh. It also poses some interesting problems. One such problem is how to automate testing of custom resources for spelling errors, validity, and adherence to user interface guidelines.
Our product, SoftPolish, was originally developed to automate the testing of standard user interface resources. We included hundreds of tests on almost all the standard resources. However, we knew the importance of anticipating demands from our user community; especially from our target market, detail-oriented software professionals. They would discover both new resources to test and new tests to make on existing resources. To keep these users happy, we needed to enable SoftPolish to check any custom resource. Simultaneously we wanted to provide an easy way to update our product to test new resource types and to enhance existing tests. The following describes how we achieved those goals.
If a match occurs, a parameter block is constructed and passed to the external code module. The parameter block includes the address in memory of the target resource, the resource tests which were specified in the user's Scan dialog (See Figure 1. SoftPolish Scan Dialog), and fields that allow an external code module to request services from SoftPolish such as spell-checking or error-reporting.
Depending on what the desired action is, additional data about the resource is usually required before the callback can be made. For instance, msgDoString in Listing 1 requires several other assignments: a pointer to the text you want checked is put in the field textPtr, the length of the text is put into textLen, and then options (such as checks for capitalization and quote checking) are set with booleans in fields arg.aDoString.bePicky and arg.aDoString.initialCaps. The last assignment to arg.aDoString.spellit utilizes one of the user options already in the parameter block to establish whether a callback string should be checked.
Now that all the parameter block fields are set, the code module makes a callback to the SoftPolish application by calling the procedure DoCallBack. DoCallBack takes the callbackaddress field in the parameter block as its argument. Even if a module is doing its own testing of resources, it uses callbacks to report errors to the standard SoftPolish log file.
Listing 1
STR(ModuleParms *MP) {
Ptr sptr;
Str255 str;
/* Determine what to test */
if (MP->Req->doUserInterface || MP->Req->doSpelling
|| MP->Req->listStrings) {
/* Extract the string out of the resource. */
sptr = *(MP->thdl);
memcpy(str,sptr,256);
/* Set up the callback for SoftPolish to check the string */
MP->pleasedo = msgDoString;
MP->textPtr = &str+1;
MP->textLen = str[0];
MP->resItem = -4;
MP->arg.aDoString.bePicky = true;
MP->arg.aDoString.initialCaps = false;
MP->arg.aDoString.spellit = MP->Req->doStrings;
DoCallback(MP->callbackaddress);
/* Make changes to the string if necessary */
if (MP->correctString[0]>0) {
SetHandleSize(MP->thdl,MP->correctString[0]+1);
sptr = *(MP->thdl);
memcpy(sptr,MP->correctString,MP->correctString[0]+1);
MP->pleasedo = msgWriteChangedResource;
DoCallback(MP->callbackaddress);
}
}
/* If requested, check the size of the resource */
if (MP->Req->doValidity && MP->Req->doSizeCheck) {
sptr = *(MP->thdl);
memcpy(str,sptr,256);
MP->pleasedo = msgCheckResourceSize;
MP->arg.aCheckResourceSize.correctSize = str[0]+1;
DoCallback(MP->callbackaddress);
}
}




