5 use ID3FS::PathElement::Artist;
6 use ID3FS::PathElement::Album;
7 use ID3FS::PathElement::Boolean;
8 use ID3FS::PathElement::File;
9 use ID3FS::PathElement::Tag;
10 use ID3FS::PathElement::Tagval;
12 our ($STATE_INVALID, $STATE_ROOT, $STATE_TAG, $STATE_TAGVAL,
13 $STATE_BOOLEAN, $STATE_ALBUMS, $STATE_TRACKLIST,
19 my $class=ref($proto) || $proto;
26 # print "STATE: ", $self->state(), "\n";
33 if(($self->state() == $STATE_FILE) ||
34 ($self->state() == $STATE_INVALID))
44 return 1 if($self->state() == $STATE_FILE);
51 return($self->state() != $STATE_INVALID);
56 my($self, $mountpoint)=@_;
57 if($self->state() == $STATE_FILE)
59 return $self->{db}->filename($mountpoint, @{$self->{elements}});
61 return "ERROR"; #should never happen?
68 my $state=$self->state();
69 # print "DIRENTS: STATE: $state\n";
70 # print "DIRENTS: FILE: $self->{path}\n";
71 if($state==$STATE_TAG || $state==$STATE_TAGVAL)
73 my $tag=$self->{elements}->[$#{$self->{elements}}];
74 if($state==$STATE_TAG &&
76 ref($tag) eq "ID3FS::PathElement::Tag" &&
77 $self->{db}->tag_has_values($tag->{id}))
79 @dents=$self->{db}->tags(@{$self->{elements}});
83 @dents=(qw(AND OR TRACKS NOARTIST),
84 $self->{db}->artists(@{$self->{elements}}));
87 elsif($state==$STATE_BOOLEAN)
89 my $parent=$self->{elements}->[$#{$self->{elements}}];
90 unless(defined($parent) &&
91 ref($parent) eq "ID3FS::PathElement::Boolean" &&
92 $parent->{name} eq "NOT")
96 push(@dents, $self->{db}->tags(@{$self->{elements}}));
98 elsif($state==$STATE_ROOT)
100 @dents=(qw(ALL NOT), $self->{db}->tags(@{$self->{elements}}));
102 elsif($state==$STATE_ALBUMS)
104 @dents=(qw(TRACKS NOALBUM),$self->{db}->albums(@{$self->{elements}}));
106 elsif($state==$STATE_TRACKLIST)
108 @dents=$self->{db}->tracks(@{$self->{elements}});
112 print "DIRENTS: UNHANDLED STATE: $state\n";
120 @{$self->{components}}=split(/\//, $self->{path});
121 shift @{$self->{components}}; # drop empty field before leading /
122 # print "PATH: $self->{path}\n";
123 $self->state($STATE_ROOT);
124 return if($self->{path} eq "/");
125 my @parts=@{$self->{components}};
127 $self->{elements}=[];
128 while(my $name=shift @parts)
130 # print "NAME: $name\n";
131 my $state=$self->state();
132 if($state==$STATE_INVALID)
134 # print "SM: INVALID: $name\n";
137 elsif($state==$STATE_ROOT)
139 # print "SM: ROOT: $name\n";
142 $self->state($STATE_TAG);
144 elsif($name eq "NOT")
146 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
147 $self->state($STATE_BOOLEAN);
151 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
154 push(@{$self->{elements}}, $tag);
155 $self->state($STATE_TAG);
159 $self->state($STATE_INVALID);
163 elsif($state==$STATE_TAG || $state==$STATE_TAGVAL)
165 # print "SM: TAG/TAGVAL($state): $name\n";
166 my $tag=$self->{elements}->[$#{$self->{elements}}];
167 if($state==$STATE_TAG &&
169 ref($tag) eq "ID3FS::PathElement::Tag" &&
170 $self->{db}->tag_has_values($tag->{id}))
172 my $tagval=ID3FS::PathElement::Tag->new($self->{db}, $name, $tag->{id});
175 $self->state($STATE_TAGVAL);
177 push(@{$self->{elements}}, $tagval);
181 $self->state($STATE_INVALID);
184 elsif($name eq "TRACKS")
186 $self->state($STATE_TRACKLIST);
188 elsif($name eq "NOARTIST")
190 $self->state($STATE_TRACKLIST);
192 elsif($name eq "AND")
194 $self->state($STATE_BOOLEAN);
195 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
199 $self->state($STATE_BOOLEAN);
200 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
204 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
207 push(@{$self->{elements}}, $artist);
208 $self->state($STATE_ALBUMS);
212 $self->state($STATE_INVALID);
216 elsif($state==$STATE_BOOLEAN)
218 # print "SM: BOOLEAN: $name\n";
219 my $parent=$self->{elements}->[$#{$self->{elements}}];
221 if(defined($parent) &&
222 ref($parent) eq "ID3FS::PathElement::Boolean" &&
223 $parent->{name} eq "NOT")
227 if($allownot && $name eq "NOT")
229 $self->state($STATE_BOOLEAN);
230 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($self->{db}, $name));
234 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
237 push(@{$self->{elements}}, $tag);
238 $self->state($STATE_TAG);
242 $self->state($STATE_INVALID);
246 elsif($state==$STATE_ALBUMS)
248 # print "SM: ALBUM: $name\n";
249 if($name eq "TRACKS")
251 $self->state($STATE_TRACKLIST);
253 elsif($name eq "NOALBUM")
255 $self->state($STATE_TRACKLIST);
259 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
262 push(@{$self->{elements}}, $album);
263 $self->state($STATE_TRACKLIST);
267 $self->state($STATE_INVALID);
271 elsif($state==$STATE_TRACKLIST)
273 # print "SM: TRACKLIST: $name\n";
274 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
277 push(@{$self->{elements}}, $track);
278 $self->state($STATE_FILE);
282 $self->state($STATE_INVALID);
285 elsif($state==$STATE_FILE)
287 # print "SM: FILE: $name\n";
288 # Can't have anything after a filename
289 $self->state($STATE_INVALID);
293 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
294 $self->state($STATE_INVALID);
301 my($self, $newstate)=@_;
302 $self->{state}=$newstate if(defined($newstate));
303 return $self->{state};