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 print "DIRENTS: TAG: TAGVALUES\n";
79 @dents=$self->{db}->tag_values($tag->{id});
83 print "DIRENTS: TAG/TAGVAL($state): ARTISTS\n";
84 @dents=(qw(AND ALLTRACKS), # FIXME: NOT and OR
85 $self->{db}->artists(@{$self->{elements}}));
88 elsif($state==$STATE_BOOLEAN)
90 @dents=$self->{db}->tags(@{$self->{elements}});
92 elsif($state==$STATE_ROOT)
94 @dents=("ALL", $self->{db}->tags(@{$self->{elements}}));
96 elsif($state==$STATE_ALBUMS)
98 @dents=("TRACKS", $self->{db}->albums(@{$self->{elements}}));
100 elsif($state==$STATE_TRACKLIST)
102 @dents=$self->{db}->tracks(@{$self->{elements}});
106 print "DIRENTS: UNHANDLED STATE: $state\n";
114 @{$self->{components}}=split(/\//, $self->{path});
115 shift @{$self->{components}}; # drop empty field before leading /
116 print "PATH: $self->{path}\n";
117 # print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
118 $self->state($STATE_ROOT);
119 return if($self->{path} eq "/");
120 my @parts=@{$self->{components}};
122 $self->{elements}=[];
123 while(my $name=shift @parts)
125 print "NAME: $name\n";
126 my $state=$self->state();
127 if($state==$STATE_INVALID)
129 print "SM: INVALID: $name\n";
132 elsif($state==$STATE_ROOT)
134 print "SM: ROOT: $name\n";
137 $self->state($STATE_TAG);
141 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
144 push(@{$self->{elements}}, $tag);
145 $self->state($STATE_TAG);
149 $self->state($STATE_INVALID);
153 elsif($state==$STATE_TAG || $state==$STATE_TAGVAL)
155 print "SM: TAG/TAGVAL($state): $name\n";
156 my $tag=$self->{elements}->[$#{$self->{elements}}];
157 if($state==$STATE_TAG &&
159 ref($tag) eq "ID3FS::PathElement::Tag" &&
160 $self->{db}->tag_has_values($tag->{id}))
162 my $tagval=ID3FS::PathElement::Tagval->new($name);
165 $self->state($STATE_TAGVAL);
167 push(@{$self->{elements}}, $tagval);
171 $self->state($STATE_INVALID);
174 elsif($name eq "ALLTRACKS")
176 $self->state($STATE_TRACKLIST);
178 elsif($name eq "AND")
180 $self->state($STATE_BOOLEAN);
181 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
185 $self->state($STATE_BOOLEAN);
186 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
188 elsif($name eq "NOT")
190 $self->state($STATE_TAG);
191 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
195 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
198 push(@{$self->{elements}}, $artist);
199 $self->state($STATE_ALBUMS);
203 $self->state($STATE_INVALID);
207 elsif($state==$STATE_BOOLEAN)
209 print "SM: BOOLEAN: $name\n";
210 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
213 push(@{$self->{elements}}, $tag);
214 $self->state($STATE_TAG);
218 $self->state($STATE_INVALID);
221 elsif($state==$STATE_ALBUMS)
223 print "SM: ALBUM: $name\n";
224 if($name eq "TRACKS")
226 $self->state($STATE_TRACKLIST);
230 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
233 push(@{$self->{elements}}, $album);
234 $self->state($STATE_TRACKLIST);
238 $self->state($STATE_INVALID);
242 elsif($state==$STATE_TRACKLIST)
244 print "SM: TRACKLIST: $name\n";
245 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
246 push(@{$self->{elements}}, $track);
249 push(@{$self->{elements}}, $track);
250 $self->state($STATE_FILE);
254 $self->state($STATE_INVALID);
257 elsif($state==$STATE_FILE)
259 print "SM: FILE: $name\n";
260 # Can't have anything after a filename
261 $self->state($STATE_INVALID);
265 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
266 $self->state($STATE_INVALID);
273 my($self, $newstate)=@_;
274 $self->{state}=$newstate if(defined($newstate));
275 return $self->{state};