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);
57 if($self->state() == $STATE_FILE)
59 return $self->{db}->filename(@{$self->{elements}});
61 return "ERROR"; #should never happen?
68 my $state=$self->state();
69 # print "DIRENTS: STATE: $state\n";
70 if($state==$STATE_TAG || $state==$STATE_TAGVAL)
72 my $tag=$self->{elements}->[$#{$self->{elements}}];
73 if($state==$STATE_TAG &&
75 ref($tag) eq "ID3FS::PathElement::Tag" &&
76 $self->{db}->tag_has_values($tag->{id}))
78 @dents=$self->{db}->tag_values($tag->{id});
82 @dents=(qw(AND OR TRACKS NOARTIST),
83 $self->{db}->artists(@{$self->{elements}}));
86 elsif($state==$STATE_BOOLEAN)
88 my $parent=$self->{elements}->[$#{$self->{elements}}];
89 unless(defined($parent) &&
90 ref($parent) eq "ID3FS::PathElement::Boolean" &&
91 $parent->{name} eq "NOT")
95 push(@dents, $self->{db}->tags(@{$self->{elements}}));
97 elsif($state==$STATE_ROOT)
99 @dents=(qw(ALL NOT), $self->{db}->tags(@{$self->{elements}}));
101 elsif($state==$STATE_ALBUMS)
103 @dents=(qw(TRACKS NOALBUM),$self->{db}->albums(@{$self->{elements}}));
105 elsif($state==$STATE_TRACKLIST)
107 @dents=$self->{db}->tracks(@{$self->{elements}});
111 print "DIRENTS: UNHANDLED STATE: $state\n";
119 @{$self->{components}}=split(/\//, $self->{path});
120 shift @{$self->{components}}; # drop empty field before leading /
121 # print "PATH: $self->{path}\n";
122 $self->state($STATE_ROOT);
123 return if($self->{path} eq "/");
124 my @parts=@{$self->{components}};
126 $self->{elements}=[];
127 while(my $name=shift @parts)
129 # print "NAME: $name\n";
130 my $state=$self->state();
131 if($state==$STATE_INVALID)
133 # print "SM: INVALID: $name\n";
136 elsif($state==$STATE_ROOT)
138 # print "SM: ROOT: $name\n";
141 $self->state($STATE_TAG);
143 elsif($name eq "NOT")
145 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
146 $self->state($STATE_BOOLEAN);
150 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
153 push(@{$self->{elements}}, $tag);
154 $self->state($STATE_TAG);
158 $self->state($STATE_INVALID);
162 elsif($state==$STATE_TAG || $state==$STATE_TAGVAL)
164 # print "SM: TAG/TAGVAL($state): $name\n";
165 my $tag=$self->{elements}->[$#{$self->{elements}}];
166 if($state==$STATE_TAG &&
168 ref($tag) eq "ID3FS::PathElement::Tag" &&
169 $self->{db}->tag_has_values($tag->{id}))
171 my $tagval=ID3FS::PathElement::Tagval->new($name);
174 $self->state($STATE_TAGVAL);
176 push(@{$self->{elements}}, $tagval);
180 $self->state($STATE_INVALID);
183 elsif($name eq "TRACKS")
185 $self->state($STATE_TRACKLIST);
187 elsif($name eq "NOARTIST")
189 $self->state($STATE_TRACKLIST);
191 elsif($name eq "AND")
193 $self->state($STATE_BOOLEAN);
194 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
198 $self->state($STATE_BOOLEAN);
199 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
203 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
206 push(@{$self->{elements}}, $artist);
207 $self->state($STATE_ALBUMS);
211 $self->state($STATE_INVALID);
215 elsif($state==$STATE_BOOLEAN)
217 # print "SM: BOOLEAN: $name\n";
218 my $parent=$self->{elements}->[$#{$self->{elements}}];
220 if(defined($parent) &&
221 ref($parent) eq "ID3FS::PathElement::Boolean" &&
222 $parent->{name} eq "NOT")
226 if($allownot && $name eq "NOT")
228 $self->state($STATE_BOOLEAN);
229 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
233 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
236 push(@{$self->{elements}}, $tag);
237 $self->state($STATE_TAG);
241 $self->state($STATE_INVALID);
245 elsif($state==$STATE_ALBUMS)
247 # print "SM: ALBUM: $name\n";
248 if($name eq "TRACKS")
250 $self->state($STATE_TRACKLIST);
252 elsif($name eq "NOALBUM")
254 $self->state($STATE_TRACKLIST);
258 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
261 push(@{$self->{elements}}, $album);
262 $self->state($STATE_TRACKLIST);
266 $self->state($STATE_INVALID);
270 elsif($state==$STATE_TRACKLIST)
272 # print "SM: TRACKLIST: $name\n";
273 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
274 push(@{$self->{elements}}, $track);
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};