boolean getfilecomment (FSSpec *pfs, bigstring bscomment) { DTPBRec dt; clearbytes (&dt, longsizeof (dt)); setemptystring (bscomment); /*default return*/ if (!hasdesktopmanager ((*pfs).vRefNum)) return (false); dt.ioVRefNum = (*pfs).vRefNum; if (PBDTGetPath (&dt) != noErr) return (false); dt.ioNamePtr = (*pfs).name; dt.ioDirID = (*pfs).parID; dt.ioDTBuffer = (Ptr) bscomment + 1; dt.ioDTReqCount = lenbigstring; if (PBDTGetCommentSync (&dt) != noErr) return (false); setstringlength (bscomment, dt.ioDTActCount); return (true); } /*getfilecomment*/
pascal OSErr DTGetComment(short vRefNum, long dirID, ConstStr255Param name, Str255 comment) { DTPBRec pb; OSErr error; short dtRefNum; Boolean newDTDatabase; if (comment != NULL) { comment[0] = 0; /* return nothing by default */ /* attempt to open the desktop database */ error = DTOpen(name, vRefNum, &dtRefNum, &newDTDatabase); if ( error == noErr ) { /* There was a desktop database and it's now open */ if ( !newDTDatabase ) { pb.ioDTRefNum = dtRefNum; pb.ioNamePtr = (StringPtr)name; pb.ioDirID = dirID; pb.ioDTBuffer = (Ptr)&comment[1]; /* ** IMPORTANT NOTE #1: Inside Macintosh says that comments ** are up to 200 characters. While that may be correct for ** the HFS file system's Desktop Manager, other file ** systems (such as Apple Photo Access) return up to ** 255 characters. Make sure the comment buffer is a Str255 ** or you'll regret it. ** ** IMPORTANT NOTE #2: Although Inside Macintosh doesn't ** mention it, ioDTReqCount is a input field to ** PBDTGetCommentSync. Some file systems (like HFS) ignore ** ioDTReqCount and always return the full comment -- ** others (like AppleShare) respect ioDTReqCount and only ** return up to ioDTReqCount characters of the comment. */ pb.ioDTReqCount = sizeof(Str255) - 1; error = PBDTGetCommentSync(&pb); if (error == noErr) { comment[0] = (unsigned char)pb.ioDTActCount; } } } else { /* There is no desktop database - try the Desktop file */ error = GetCommentFromDesktopFile(vRefNum, dirID, name, comment); if ( error != noErr ) { error = afpItemNotFound; /* return an expected error */ } } } else { error = paramErr; } return (error); }
static void PrintFileComment (char *path) { #if !__LP64__ OSErr err = noErr; FSRef fileRef; FSSpec fileSpec; DTPBRec dt; char buf[255] = "\0"; char comment[255] = "\0"; //see if the file in question exists and we can write it if (access(path, R_OK|F_OK) == -1) { perror(path); return; } //get file reference from path err = FSPathMakeRef(path, &fileRef, NULL); if (err != noErr) { fprintf(stderr, "FSPathMakeRef: Error %d for file %s\n", err, path); return; } //retrieve filespec from file ref err = FSGetCatalogInfo (&fileRef, NULL, NULL, NULL, &fileSpec, NULL); if (err != noErr) { fprintf(stderr, "FSGetCatalogInfo(): Error %d getting file spec for %s\n", err, path); return; } ///////////// oK, now we can go about getting the comment ///////////// dt.ioVRefNum = fileSpec.vRefNum; err = PBDTGetPath(&dt); if (err != noErr) { fprintf(stderr, "Can't get OS 9 comments for %s\n", path); return; } //fill in the relevant fields (using parameters) dt.ioNamePtr = fileSpec.name; dt.ioDirID = fileSpec.parID; dt.ioDTBuffer = (char *)&buf; PBDTGetCommentSync(&dt); if (dt.ioDTActCount != 0) //if zero, that means no comment { strncpy((char *)&comment, (char *)&buf, dt.ioDTActCount); if (!printFileName) printf("%s\n", (char *)&comment); else printf("Comment for '%s':\n%s\n", path, (char *)&comment); } return; #endif }