Thanks for the comments.
Indeed, I see your point about multiple files with the same name.
I'll go back to my first implementation, where I concatenate the file
name and the file path:
$ svn diff SpotlightFS.*
Index: SpotlightFS.m
===================================================================
--- SpotlightFS.m (revision 691)
+++ SpotlightFS.m (working copy)
@@ -251,7 +251,8 @@
MDItemRef item = (MDItemRef)MDQueryGetResultAtIndex(query, i);
NSString *name = (NSString *)MDItemCopyAttribute(item,
kMDItemPath);
[name autorelease];
- [symlinkNames addObject:EncodePath(name)];
+ NSString *fullName = [[[name lastPathComponent]
stringByAppendingString:@" @ "] stringByAppendingString:[name
stringByDeletingLastPathComponent]];
+ [symlinkNames addObject:EncodePath(fullName)];
}
CFRelease(query);
@@ -396,7 +397,12 @@
} else {
- NSString *decodedPath = DecodePath([path lastPathComponent]);
+ NSString *lastComponent = [path lastPathComponent];
+ NSArray *parts = [lastComponent componentsSeparatedByString:@" @
"];
+ NSEnumerator *partsEnum = [parts objectEnumerator];
+ NSString *namePart = [partsEnum nextObject];
+ NSString *pathPart = [partsEnum nextObject];
+ NSString *decodedPath = DecodePath([pathPart
stringByAppendingPathComponent:namePart]);
NSFileManager *fm = [NSFileManager defaultManager];
attr = [[[fm fileAttributesAtPath:decodedPath traverseLink:NO]
mutableCopy] autorelease];
if (!attr)
@@ -418,8 +424,13 @@
NSString *lastComponent = [path lastPathComponent];
- if ([lastComponent hasPrefix:@":"])
- return DecodePath(lastComponent);
+ NSArray *parts = [lastComponent componentsSeparatedByString:@" @
"];
+ if ([parts count] == 2) {
+ NSEnumerator *partsEnum = [parts objectEnumerator];
+ NSString *namePart = [partsEnum nextObject];
+ NSString *pathPart = [partsEnum nextObject];
+ return DecodePath([pathPart
stringByAppendingPathComponent:namePart]);
+ }
*error = [FUSEFileSystem errorWithCode:ENOENT];
return nil;
On Jan 7, 2:21 pm, "Greg Miller" <[EMAIL PROTECTED]> wrote:
> On Jan 7, 2008 11:19 AM, Greg Miller <[EMAIL PROTECTED]> wrote:
>
> > Hi.
>
> > Comments inline.
>
> > On Jan 4, 2008 7:59 PM, Guillaume Boudreau <[EMAIL PROTECTED]> wrote:
>
> > > Hi,
>
> > > I'd like to get some comments from ObjC developers about the following
> > > changes I made to the SpotlightFS source code to only see the name of
> > > the files in the Spotlight search results, instead of the full path to
> > > the original file.
>
> > There are potential problems here because you could end up with one
> > directory containing many files that are named the same. For example,
> > you could have a smart folder with 50 files named "README". The
> > problem here is that it's now ambiguous how you refer to a file; Which
> > link should be used when someone clicks on
> > /Volumes/SpotlightFS/Foo/README? That's why the full paths were
> > included.
>
> > Of course, if it seems to work most of the time in your cases, then by
> > all means, do it :-)
>
> > > I'm a programmer, but know only ObjC in theory, so
> > > I might have made mistakes in there that 'real' ObjC programmers will
> > > easily spot. (In particular, I'm pretty unsure when I need/should
> > > autorelease, retain or copy variables I initialize, use or return.)
>
> > > Thanks.
>
> > > $ svn diff SpotlightFS.h SpotlightFS.m
> > > Index: SpotlightFS.h
> > > ===================================================================
> > > --- SpotlightFS.h (revision 691)
> > > +++ SpotlightFS.h (working copy)
> > > @@ -27,7 +27,7 @@
> > > // See the documentation for FUSEFileSystem for more details.
> > > //
> > > [EMAIL PROTECTED] SpotlightFS : FUSEFileSystem {
> > > - // Empty
> > > + NSMutableDictionary* symlinks_;
> > > }
>
> > > // Returns an array of all *.savedSearch files in "~/Library/Saved
> > > Searches".
> > > @@ -72,6 +72,7 @@
> > > // all forward slashes have been replaced by colons.
> > > //
> > > - (NSArray *)encodedPathResultsForSpotlightQuery:(NSString
> > > *)queryString
> > > - scope:(NSArray
> > > *)scopeDirectories;
> > > + scope:(NSArray
> > > *)scopeDirectories
> > > + path:(NSString *)path;
>
> > > [EMAIL PROTECTED]
> > > Index: SpotlightFS.m
> > > ===================================================================
> > > --- SpotlightFS.m (revision 691)
> > > +++ SpotlightFS.m (working copy)
> > > @@ -210,7 +210,8 @@
> > > // an NSArray of all the matching file paths (encoded).
> > > //
> > > - (NSArray *)encodedPathResultsForSpotlightQuery:(NSString
> > > *)queryString
> > > - scope:(NSArray
> > > *)scopeDirectories {
> > > + scope:(NSArray
> > > *)scopeDirectories
> > > + path:(NSString *)path {
> > > // Try to create an MDQueryRef from the given queryString.
> > > MDQueryRef query = MDQueryCreate(kCFAllocatorDefault,
> > > (CFStringRef)queryString,
> > > @@ -247,11 +248,20 @@
> > > int count = MDQueryGetResultCount(query);
> > > NSMutableArray *symlinkNames = [NSMutableArray array];
>
> > > + if (symlinks_ == nil) {
> > > + symlinks_ = [[NSMutableDictionary alloc] initWithCapacity:count];
> > > + [symlinks_ retain];
>
> > Don't retain here. +alloc is giving you an object that is implicitly
> > retained by you.
>
> > > + }
> > > +
> > > for (int i = 0; i < count; i++) {
> > > MDItemRef item = (MDItemRef)MDQueryGetResultAtIndex(query, i);
> > > - NSString *name = (NSString *)MDItemCopyAttribute(item,
> > > kMDItemPath);
> > > + NSString *name = (NSString *)MDItemCopyAttribute(item,
> > > kMDItemFSName);
> > > [name autorelease];
> > > [symlinkNames addObject:EncodePath(name)];
> > > + NSString *symlink = (NSString *)MDItemCopyAttribute(item,
> > > kMDItemPath);
> > > + [symlink autorelease];
> > > + NSString *symlinkKey = [path
> > > stringByAppendingPathComponent:name];
> > > + [symlinks_ setObject:symlink forKey:symlinkKey];
> > > }
>
> > > CFRelease(query);
> > > @@ -292,7 +302,7 @@
>
> > > objectForKey:@"FXScopeArrayOfPaths"];
> > > }
>
> > > - return [self encodedPathResultsForSpotlightQuery:query
> > > scope:scopeDirectories];
> > > + return [self encodedPathResultsForSpotlightQuery:query
> > > scope:scopeDirectories path:path];
> > > }
>
> > > - (BOOL)createDirectoryAtPath:(NSString *)path
> > > @@ -396,9 +406,11 @@
>
> > > } else {
>
> > > - NSString *decodedPath = DecodePath([path lastPathComponent]);
> > > - NSFileManager *fm = [NSFileManager defaultManager];
> > > - attr = [[[fm fileAttributesAtPath:decodedPath traverseLink:NO]
> > > mutableCopy] autorelease];
> > > + NSString *decodedPath = [symlinks_ objectForKey:path];
> > > + if (decodedPath) {
> > > + NSFileManager *fm = [NSFileManager defaultManager];
> > > + attr = [[[fm fileAttributesAtPath:decodedPath traverseLink:NO]
> > > mutableCopy] autorelease];
> > > + }
> > > if (!attr)
> > > attr = [NSMutableDictionary dictionary];
> > > [attr setObject:NSFileTypeSymbolicLink forKey:NSFileType];
> > > @@ -416,10 +428,10 @@
> > > return nil;
> > > }
>
> > > - NSString *lastComponent = [path lastPathComponent];
> > > + NSString *decodedPath = [symlinks_ objectForKey:path];
>
> > > - if ([lastComponent hasPrefix:@":"])
> > > - return DecodePath(lastComponent);
> > > + if (decodedPath)
> > > + return [[decodedPath copy] autorelease];
>
> > > *error = [FUSEFileSystem errorWithCode:ENOENT];
> > > return nil;
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"macfuse-devel" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/macfuse-devel?hl=en
-~----------~----~----~----~------~----~------~--~---