/* IPIcon -> clipboard */ OSErr IPIconToClip(const IPIconRec *ipIcon) { OSErr err; IconFamilyHandle iconFamily; IconActionUPP copyIconDataUPP=NewIconActionUPP(CopyIconData); #if TARGET_API_MAC_CARBON { ScrapRef scrap; err=ClearCurrentScrap(); err=GetCurrentScrap(&scrap); err=ForEachIconDo(ipIcon->iconSuite,kSelectorMyData,copyIconDataUPP,scrap); err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { err=PutScrapFlavor(scrap,kIconFamilyType,0,GetHandleSize((Handle)iconFamily),*iconFamily); DisposeHandle((Handle)iconFamily); } } #else { long result; result=ZeroScrap(); err=ForEachIconDo(ipIcon->iconSuite,kSelectorMyData,copyIconDataUPP,nil); if (gSystemVersion >= 0x0850) { err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { result=PutScrap(GetHandleSize((Handle)iconFamily),kIconFamilyType,*iconFamily); DisposeHandle((Handle)iconFamily); } } } #endif DisposeIconActionUPP(copyIconDataUPP); return err; }
pascal OSErr SafeGetIconSuite(IconSuiteRef *theIconSuite, short theResID, IconSelectorValue selector) { ASBool foundAnIcon = false; *theIconSuite = NULL; OSErr err = noErr; err = NewIconSuite(theIconSuite); if (err == noErr) { if (selector & kSelectorLarge1Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'ICN#')) foundAnIcon = true; if (selector & kSelectorLarge4Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'icl4')) foundAnIcon = true; if (selector & kSelectorLarge8Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'icl8')) foundAnIcon = true; if (selector & kSelectorSmall1Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'ics#')) foundAnIcon = true; if (selector & kSelectorSmall4Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'ics4')) foundAnIcon = true; if (selector & kSelectorSmall8Bit) if (SafeGetIconSuitePart(*theIconSuite, theResID, 'ics8')) foundAnIcon = true; if (IconFamilyToIconSuite != NULL) { Handle iconFamily = SafeGet1Resource('icns', theResID); if (iconFamily) { IconSuiteRef icnsIconSuite = NULL; IconFamilyToIconSuite((IconFamilyHandle)iconFamily, selector, &icnsIconSuite); if (icnsIconSuite) { IconActionUPP AddIconsToSuiteUPP = NewIconActionUPP(AddIconsToSuite); ForEachIconDo(icnsIconSuite, selector, AddIconsToSuiteUPP, *theIconSuite); DisposeIconActionUPP(AddIconsToSuiteUPP); foundAnIcon = true; } ReleaseResource(iconFamily); } } if (!foundAnIcon) { DisposeIconSuite(*theIconSuite, true); *theIconSuite = NULL; err = noSuchIconErr; } } return err; }
/* create file with IPIcon */ OSErr MakeFileWithIPIcon(const FSSpec *theFile,const IPIconRec *ipIcon) { OSErr err; FInfo fndrInfo; short refNum; IconActionUPP addIconUPP; MyIconResRec newIcon; /* create a file */ err=FSpGetFInfo(theFile,&fndrInfo); if (err==fnfErr) FSpCreateResFile(theFile,kResEditCreator,kResourceFileType,smSystemScript); if (err!=fnfErr && err!=noErr) return err; /* open the file */ refNum=FSpOpenResFile(theFile,fsWrPerm); if (refNum < 0) /* could not open -> the file has no resource fork */ { FSpCreateResFile(theFile,fndrInfo.fdCreator,fndrInfo.fdType,smSystemScript); refNum=FSpOpenResFile(theFile,fsWrPerm); } if (refNum < 0) /* could not open -> error */ return refNum; UseResFile(refNum); /* information for icon */ newIcon.resID=kCustomIconResource; GetIndString(newIcon.resName,141,2); newIcon.attrs=0; /* save icon family(separated icons) */ if (ipIcon->iconSuite != NULL) { addIconUPP=NewIconActionUPP(AddIconToFile); err=ForEachIconDo(ipIcon->iconSuite,GetMySelector(),addIconUPP,&newIcon); DisposeIconActionUPP(addIconUPP); } /* save icns(single icon) */ if (isIconServicesAvailable) { IconFamilyHandle iconFamily; err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { SaveDataToResource(*iconFamily,GetHandleSize((Handle)iconFamily), kIconFamilyType,newIcon.resID,newIcon.resName,newIcon.attrs); DisposeHandle((Handle)iconFamily); } } else /* delete icns resource */ DeleteIconFamilyResource(); CloseResFile(refNum); UseResFile(gApplRefNum); /* set flag for custom icons */ err=FSpGetFInfo(theFile,&fndrInfo); fndrInfo.fdFlags |= kHasCustomIcon; fndrInfo.fdFlags &= ~kHasBeenInited; err=FSpSetFInfo(theFile,&fndrInfo); FlushVol(0L,theFile->vRefNum); /* update file icon */ UpdateFinderIcon(theFile); return err; }
/* create folder with IPIcon */ OSErr MakeFolderWithIPIcon(const FSSpec *theFolder,const IPIconRec *ipIcon) { OSErr err; long dirID; FSSpec theIconFile; Str15 iconFileName; #ifdef __MOREFILESX__ FSRef fsRef; #endif /* create a folder */ err=FSpDirCreate(theFolder,smSystemScript,&dirID); if (err==dupFNErr || err==dirNFErr) { Boolean isDirectory; #ifdef __MOREFILESX__ err = FSpMakeFSRef(theFolder,&fsRef); err = FSGetNodeID(&fsRef,&dirID,&isDirectory); #else err=FSpGetDirectoryID(theFolder,&dirID,&isDirectory); #endif if (!isDirectory) return -1; } if (err!=noErr) return err; #ifdef __MOREFILESX__ err = FSpMakeFSRef(theFolder,&fsRef); #endif /* create icon file */ GetIndString(iconFileName,140,3); err=FSMakeFSSpec(theFolder->vRefNum,dirID,iconFileName,&theIconFile); if (err==fnfErr) { FInfo fndrInfo; FSpCreateResFile(&theIconFile,kFinderCreator,'icon',smSystemScript); err=FSpGetFInfo(&theIconFile,&fndrInfo); fndrInfo.fdFlags |= kIsInvisible; err=FSpSetFInfo(&theIconFile,&fndrInfo); } /* save icon data */ if (err==noErr) { short refNum; IconActionUPP addIconUPP; MyIconResRec newIcon; #ifndef __MOREFILESX__ DInfo dInfo; #endif newIcon.resID=kCustomIconResource; GetIndString(newIcon.resName,141,2); newIcon.attrs=0; refNum=FSpOpenResFile(&theIconFile,fsWrPerm); UseResFile(refNum); /* save icon family(separated icons) */ if (ipIcon->iconSuite != NULL) { addIconUPP = NewIconActionUPP(AddIconToFile); err=ForEachIconDo(ipIcon->iconSuite,kSelectorMyData,addIconUPP,&newIcon); DisposeIconActionUPP(addIconUPP); } /* save icns(single icon) */ if (isIconServicesAvailable) { IconFamilyHandle iconFamily; err=IPIconToIconFamily(ipIcon,&iconFamily); if (err==noErr) { SaveDataToResource(*iconFamily,GetHandleSize((Handle)iconFamily), kIconFamilyType,newIcon.resID,newIcon.resName,newIcon.attrs); DisposeHandle((Handle)iconFamily); } } else /* delete icns resource */ DeleteIconFamilyResource(); CloseResFile(refNum); UseResFile(gApplRefNum); /* set flag for custom icons */ #ifdef __MOREFILESX__ err = FSSetHasCustomIcon(&fsRef); err = FSClearHasBeenInited(&fsRef); #else err=FSpGetDInfo(theFolder,&dInfo); dInfo.frFlags |= kHasCustomIcon; dInfo.frFlags &= ~kHasBeenInited; err=FSpSetDInfo(theFolder,&dInfo); #endif gUsedCount.exportNum++; } FlushVol(0L,theFolder->vRefNum); /* update folder icon */ UpdateFinderIcon(theFolder); return err; }