/* フォルダアイコンをチェック */ OSErr FolderIconCheck(const FSSpec *theFolderSpec,short *alertMode) { OSErr err; long dirID; FSSpec theIconFile; Str15 iconFileName; Boolean isDirectory; #ifdef __MOREFILESX__ FSRef fsRef; FinderInfo info; err = FSpMakeFSRef(theFolderSpec,&fsRef); if (err != noErr) return err; #else DInfo dirInfo; #endif /* まず、カスタムアイコンフラグが立っているかどうかを調べる */ /* ここでエラーが発生する場合はおそらくフォルダアイコン編集も不可能なのでそのまま返る */ #ifdef __MOREFILESX__ err = FSGetFinderInfo(&fsRef,&info,NULL,NULL); #else err=FSpGetDInfo(theFolderSpec,&dirInfo); #endif if (err!=noErr) return err; /* カスタムアイコンフラグが立っていなければ問題なし */ #ifdef __MOREFILESX__ if ((info.folder.finderFlags & kHasCustomIcon) == 0) return noErr; #else if ((dirInfo.frFlags & kHasCustomIcon) == 0) return noErr; #endif /* 立っている場合は、カスタムアイコンをチェック */ #ifdef __MOREFILESX__ err = FSGetNodeID(&fsRef,&dirID,&isDirectory); #else err=FSpGetDirectoryID(theFolderSpec,&dirID,&isDirectory); #endif if (err!=noErr) return err; GetIndString(iconFileName,140,3); err=FSMakeFSSpec(theFolderSpec->vRefNum,dirID,iconFileName,&theIconFile); if (err==fnfErr) /* アイコンファイルが見つからない場合は、フラグが間違っているわけだから修正 */ { #ifdef __MOREFILESX__ err = FSClearHasCustomIcon(&fsRef); #else err=FSpClearHasCustomIcon(theFolderSpec); #endif return noErr; } else if (err!=noErr) /* それ以外のエラーなら編集できないだろうから戻る */ return err; return FileIconCheck(&theIconFile,alertMode); }
static OSErr PrintLabelName (FSRef *fileRef) { static char labelNames[8][8] = { "None", "Red", "Orange", "Yellow", "Green", "Blue", "Purple", "Gray" }; FSSpec fileSpec; FInfo finderInfo; DInfo dInfo; OSErr err = noErr; int labelNum = 0; /* retrieve filespec from file ref */ err = FSGetCatalogInfo (fileRef, NULL, NULL, NULL, &fileSpec, NULL); if (err != noErr) { fprintf(stderr, "FSGetCatalogInfo(): Error %d getting file spec from file reference\n", err); return err; } if (IsFolder(fileRef)) { err = FSpGetDInfo (&fileSpec, &dInfo); if (err != noErr) { fprintf(stderr, "FSpGetFInfo(): Error %d getting file Finder Directory Info from file spec\n", err); return err; } labelNum = GetLabelNumber(dInfo.frFlags); } else { err = FSpGetFInfo (&fileSpec, &finderInfo); if (err != noErr) { fprintf(stderr, "FSpGetFInfo(): Error %d getting file Finder File Info from file spec\n", err); return err; } labelNum = GetLabelNumber(finderInfo.fdFlags); } printf("%s\n", (char *)&labelNames[labelNum]); return noErr; }
static OSErr PrintLabelNumber (FSRef *fileRef) { FSSpec fileSpec; FInfo finderInfo; DInfo dInfo; OSErr err = noErr; int labelNum = 0; /* retrieve filespec from file ref */ err = FSGetCatalogInfo (fileRef, NULL, NULL, NULL, &fileSpec, NULL); if (err != noErr) { fprintf(stderr, "FSGetCatalogInfo(): Error %d getting file spec from file reference\n", err); return err; } if (IsFolder(fileRef)) { err = FSpGetDInfo (&fileSpec, &dInfo); if (err != noErr) { fprintf(stderr, "FSpGetFInfo(): Error %d getting file Finder Directory Info from file spec\n", err); return err; } labelNum = GetLabelNumber(dInfo.frFlags); } else { err = FSpGetFInfo (&fileSpec, &finderInfo); if (err != noErr) { fprintf(stderr, "FSpGetFInfo(): Error %d getting file Finder File Info from file spec\n", err); return err; } labelNum = GetLabelNumber(finderInfo.fdFlags); } printf("%d\n", labelNum); return noErr; }
/* 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; }