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 @dents=("NOT", $self->{db}->tags(@{$self->{elements}}));
90 elsif($state==$STATE_ROOT)
92 @dents=(qw(ALL NOT), $self->{db}->tags(@{$self->{elements}}));
94 elsif($state==$STATE_ALBUMS)
96 @dents=(qw(TRACKS NOALBUM),$self->{db}->albums(@{$self->{elements}}));
98 elsif($state==$STATE_TRACKLIST)
100 @dents=$self->{db}->tracks(@{$self->{elements}});
104 print "DIRENTS: UNHANDLED STATE: $state\n";
112 @{$self->{components}}=split(/\//, $self->{path});
113 shift @{$self->{components}}; # drop empty field before leading /
114 # print "PATH: $self->{path}\n";
115 $self->state($STATE_ROOT);
116 return if($self->{path} eq "/");
117 my @parts=@{$self->{components}};
119 $self->{elements}=[];
120 while(my $name=shift @parts)
122 # print "NAME: $name\n";
123 my $state=$self->state();
124 if($state==$STATE_INVALID)
126 # print "SM: INVALID: $name\n";
129 elsif($state==$STATE_ROOT)
131 # print "SM: ROOT: $name\n";
134 $self->state($STATE_TAG);
136 elsif($name eq "NOT")
138 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
139 $self->state($STATE_BOOLEAN);
143 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
146 push(@{$self->{elements}}, $tag);
147 $self->state($STATE_TAG);
151 $self->state($STATE_INVALID);
155 elsif($state==$STATE_TAG || $state==$STATE_TAGVAL)
157 # print "SM: TAG/TAGVAL($state): $name\n";
158 my $tag=$self->{elements}->[$#{$self->{elements}}];
159 if($state==$STATE_TAG &&
161 ref($tag) eq "ID3FS::PathElement::Tag" &&
162 $self->{db}->tag_has_values($tag->{id}))
164 my $tagval=ID3FS::PathElement::Tagval->new($name);
167 $self->state($STATE_TAGVAL);
169 push(@{$self->{elements}}, $tagval);
173 $self->state($STATE_INVALID);
176 elsif($name eq "TRACKS")
178 $self->state($STATE_TRACKLIST);
180 elsif($name eq "NOARTIST")
182 $self->state($STATE_TRACKLIST);
184 elsif($name eq "AND")
186 $self->state($STATE_BOOLEAN);
187 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
191 $self->state($STATE_BOOLEAN);
192 push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
196 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
199 push(@{$self->{elements}}, $artist);
200 $self->state($STATE_ALBUMS);
204 $self->state($STATE_INVALID);
208 elsif($state==$STATE_BOOLEAN)
210 # print "SM: BOOLEAN: $name\n";
213 $self->state($STATE_BOOLEAN);
217 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
220 push(@{$self->{elements}}, $tag);
221 $self->state($STATE_TAG);
225 $self->state($STATE_INVALID);
229 elsif($state==$STATE_ALBUMS)
231 # print "SM: ALBUM: $name\n";
232 if($name eq "TRACKS")
234 $self->state($STATE_TRACKLIST);
236 elsif($name eq "NOALBUM")
238 $self->state($STATE_TRACKLIST);
242 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
245 push(@{$self->{elements}}, $album);
246 $self->state($STATE_TRACKLIST);
250 $self->state($STATE_INVALID);
254 elsif($state==$STATE_TRACKLIST)
256 # print "SM: TRACKLIST: $name\n";
257 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
258 push(@{$self->{elements}}, $track);
261 push(@{$self->{elements}}, $track);
262 $self->state($STATE_FILE);
266 $self->state($STATE_INVALID);
269 elsif($state==$STATE_FILE)
271 # print "SM: FILE: $name\n";
272 # Can't have anything after a filename
273 $self->state($STATE_INVALID);
277 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
278 $self->state($STATE_INVALID);
285 my($self, $newstate)=@_;
286 $self->{state}=$newstate if(defined($newstate));
287 return $self->{state};