In article <1159768382.394555.8300@[EMAIL PROTECTED]
>,
"Noufal" <muhammednoufal@[EMAIL PROTECTED]
> wrote:
> Hai all
> I newbie in cocoa.I am now with font manager devolopment. The proj
> want to read font from CD.I can read data from cd and use the data.but
> I cant to eject cd wen application loaded and readed once from CD.After
> reading i read font from system font. then also i cant eject cd .CD
> can eject only after closing application .
> Wen try to close then a dialog box appears with "one application is
> using cd close application and try".
> I tried by removing all datas from arrays used,but then also cant
> eject.
If you ATSFontActivateFromFileSpecification() from a file on a CD,
you'll need to ATSFontDeactivate() if you expect to ever remove the CD.
>
> The pgm. work with font is below .please check that i hav missed any
> code to be added with this to remove control over directory that is
> currently using.
>
> I have no idea about FSRef,FSpath,ATSFontRef.If anyone of the above
> want to release or deallocate.I think one of them are continuing
> control of cd wen once read data from cd.Wat i will do to eject cd wen
> app. is running.Ejecting cd is for changing the cd and try it with
> another cd.
>
> Excuse my english .Please help
>
>
> - (NSMutableArray *)checkFont:(NSString *)path
> {
> NSMutableArray *myfonts=nil;
> myfonts=[[NSMutableArray alloc]init];
> [myfonts removeAllObjects];
myfonts is born empty. No need to empty it again.
> NSFont *f=nil;
> CFStringRef fontName=NULL;
> ATSFontContainerRef container;
> FSRef fsRef;
> FSSpec fsSpec;
> FSCatalogInfo catinfo;
> int osstatus = FSPathMakeRef((const UInt8*)[path UTF8String], &fsRef,
> NULL);
> osstatus =
> FSGetCatalogInfo(&fsRef,kFSCatInfoNone,&catinfo,NULL,&fsSpec,NULL);
> osstatus = ATSFontActivateFromFileSpecification ( &fsSpec,
> kATSFontContextLocal, kATSFontFormatUnspecified,
> NULL, kATSOptionFlagsDefault, &container);
> if (osstatus != noErr)
> {
> //NSLog(@[EMAIL PROTECTED]
"Got error %d loading %@[EMAIL PROTECTED]
",osstatus,path);
> }
>
> else
> {
> int fntcount;
> ItemCount count;
> ByteCount bcount;
>
>
>
>
> osstatus = ATSFontFindFromContainer (container,
> kATSOptionFlagsDefault, 0, NULL,&count);
It is good, that you assign the return value to osstatus. But, you
should check, as you do above, that osstatus == noErr.
> ATSFontRef *ioArray=(ATSFontRef *)malloc(count * sizeof(ATSFontRef));
You'll need to free ioArray before returning
> osstatus = ATSFontFindFromContainer (container,
> kATSOptionFlagsDefault, count, ioArray,&count);
>
>
> for (fntcount=0; fntcount < count ; fntcount++ ) {
>
>
> osstatus = ATSFontGetName (ioArray[fntcount], kATSOptionFlagsDefault,
> &fontName);
>
> if (fontName) f = [NSFont fontWithName:(NSString*)fontName size:24];
>
> if ( f != nil )
> {
> [myfonts addObject:f];
>
> }[f release];
Remove the [f release] : since you don't init or copy f, you shouldn't
release it.
Here, you need an: f=nil;
Think about what would happen if, the third time through the loop,
fontName was nil.
>
>
>
> //
>
osstatus=ATSFontGetFontFamilyResource(ioArray[fntcount],bcount,&iobuffer,&bcou
> nt)
> }
>
>
> }
> [f release];
Remove the [f release] : since you don't init or copy f, you shouldn't
release it.
> //CFRelease(path);
Remove the CFRelease(path) : since you don't init or copy path, you
shouldn't release it.
> return myfonts;
> }
>
> - (NSMutableArray *) getFonts:(NSString *)path
> {
>
> //Declaring
>
> NSFont *getfont;
> NSArray *getArray;
> NSString *getfile;
> NSString *fileandfontname;
> NSMutableArray *fontarray,*getfontarr;
> NSFileManager *fm;
> NSString *locinfo,*userdir;
>
> //Intializing
> fontarray=[[NSMutableArray alloc] init];
> getfontarr=[[NSMutableArray alloc] init];
> [getfontarr removeAllObjects];
> [fontarray removeAllObjects];
> fm=[NSFileManager defaultManager];
> getArray=[fm directoryContentsAtPath:path];
> userdir=NSHomeDirectory();
> userdir=[userdir stringByAppendingPathComponent:@[EMAIL PROTECTED]
"/Library/Fonts/"];
>
> int rowcount=0;
> //getting path info
>
> if ( [path isEqualToString:userdir])
> {
> locinfo=@[EMAIL PROTECTED]
"User";
> }
> else if ([path isEqualToString:@[EMAIL PROTECTED]
"/Network/Library/Fonts/"]) {
> locinfo=@[EMAIL PROTECTED]
"Network";
> }
> else if ([path isEqualToString:@[EMAIL PROTECTED]
"/System/Library/Fonts/"]) {
> locinfo=@[EMAIL PROTECTED]
"System";
> }
> else if ([path isEqualToString:@[EMAIL PROTECTED]
"/Library/Fonts/"]) {
> locinfo=@[EMAIL PROTECTED]
"Library";
> }
> else if ([path isEqualToString:@[EMAIL PROTECTED]
"/Volumes/Summitsft"]) {
> locinfo=@[EMAIL PROTECTED]
"Summitsoft";
> }
> else if ([path rangeOfString:@[EMAIL PROTECTED]
"macXware Fonts"].length) {
> locinfo=@[EMAIL PROTECTED]
"Summitsoft";
> }
> else {
> locinfo=@[EMAIL PROTECTED]
"Vault";
> }
>
>
>
> int fontcount;
> MDItemRef mdataitem;
> NSString *ftype,*ffoundary;
> NSFontDescriptor *fontdisc;
> NSFontSymbolicTraits fst;
> NSFontFamilyClass ffc;
> int fcval;
>
> for (rowcount=0; rowcount < [getArray count]; rowcount++)
> {
> //Getting Full file path
> getfile=[getArray objectAtIndex:rowcount];
> getfile=[path stringByAppendingPathComponent:getfile];
>
> //Calling Function
> getfontarr=[self checkFont:getfile];
>
> //===================================================================
> //Getting info from file MetaData ,it works 10.4 and above
> mdataitem=MDItemCreate(NULL,(CFStringRef)getfile);
> // ftype=(id)MDItemCopyAttribute( mdataitem , kMDItemKind);
> ffoundary=(id)MDItemCopyAttribute( mdataitem , kMDItemCopyright);
>
> if (ffoundary == nil )
> ffoundary=@[EMAIL PROTECTED]
"--";
>
> if (ftype == nil)
> ftype=[self FindTypeByExt:getfile];
>
>
//====================================================================
>
>
>
> for (fontcount=0 ; fontcount < [ getfontarr count] ; fontcount++) {
>
> getfont=[getfontarr objectAtIndex:fontcount];
>
> //If the file is font then adding to Array
> if ( getfont != nil )
> {
> //Getting font Descriptor
> fontdisc=[getfont fontDescriptor];
> fst=[fontdisc symbolicTraits];
> // NSLog(@[EMAIL PROTECTED]
"%u",fst);
>
> fileandfontname=[getfont fontName];
> fileandfontname=[fileandfontname stringByAppendingString:@[EMAIL PROTECTED]
"/"];
> fileandfontname=[fileandfontname stringByAppendingString:[getArray
> objectAtIndex:rowcount]];
> fileandfontname=[fileandfontname
> stringByAppendingString:@[EMAIL PROTECTED]
"/"];
> fileandfontname=[fileandfontname stringByAppendingString:locinfo];
> fileandfontname=[fileandfontname stringByAppendingString:@[EMAIL PROTECTED]
"/"];
> fileandfontname=[fileandfontname stringByAppendingString:ftype];
> fileandfontname=[fileandfontname stringByAppendingString:@[EMAIL PROTECTED]
"/"];
> fileandfontname=[fileandfontname stringByAppendingString:ffoundary];
>
> [fontarray addObject:fileandfontname];
>
> }
> }
>
>
> }
>
>
> //Returning Objects
> return fontarray;
>
>
> }


|