enable filter
[id3fs.git] / lib / ID3FS / Fuse.pm
index bbf6f34..62dd3a8 100644 (file)
@@ -35,6 +35,7 @@ sub run
        getattr     => sub { $self->getattr(@_); },
        readlink    => sub { $self->readlink(@_); },
        getdir      => sub { $self->getdir(@_); },
+
        # Not used
 #      mknod       => sub { $self->mknod(@_);       },
 #      mkdir       => sub { $self->mkdir(@_);       },
@@ -93,11 +94,54 @@ sub getdir
 #    print "**GETDIR: $filename\n";
     my $path=ID3FS::Path->new($self->{db}, $filename);
     return(-ENOENT()) unless($path->isvalid());
-    if($path->isdir())
+    return(-ENOTDIR()) unless($path->isdir());
+    my @dents=();
+    my($dirs, $files)=$path->dirents();
+    push(@dents, $self->filter($filename, @$dirs));
+    push(@dents, @$files);
+    if(@dents)
+    {
+       return( (".", "..", @dents, 0) );
+    }
+    return(0);
+}
+
+sub filter
+{
+    my($self, $base, @dirs)=@_;
+    my @outdirs=();
+    for my $dir (@dirs)
     {
-       return(".", "..", $path->dirents(), 0);
+       print "hascontents: $base / $dir\n";
+       my $path=ID3FS::Path->new($self->{db}, "$base/$dir");
+       next unless($path->isvalid());
+       my($subdirs,$subfiles)=$path->dirents();
+       print "SUBDENTS: ", join(", ", @$subdirs, @$subfiles), "\n";
+       next unless(@$subdirs || @$subfiles);
+       if(!@$subfiles || scalar(@$subdirs) < 3)
+       {
+           my $subdirents=0;
+           for my $subdir (@$subdirs)
+           {
+               if(grep { $_ eq $subdir; } qw(AND OR NOT))
+               {
+                   my $subsubpath=ID3FS::Path->new($self->{db}, "$base/$dir/$subdir");
+                   if($path->isvalid())
+                   {
+                       my($subsubdirs,$subsubfiles)=$subsubpath->dirents();
+                       $subdirents++ if(@$subsubdirs || @$subsubfiles);
+                   }
+               }
+               else
+               {
+                   $subdirents++;
+               }
+           }
+           next unless($subdirents);
+       }
+       push(@outdirs, $dir);
     }
-    return -ENOTDIR();
+    return(@outdirs)
 }
 
 # unused stubs