6 use ID3FS::PathElement::Artist;
7 use ID3FS::PathElement::Album;
8 use ID3FS::PathElement::Boolean;
9 use ID3FS::PathElement::File;
10 use ID3FS::PathElement::Tag;
11 use ID3FS::PathElement::Tagval;
13 our ($STATE_INVALID, $STATE_ROOT, $STATE_TAG, $STATE_TAGVAL,
14 $STATE_BOOLEAN, $STATE_ARTISTS, $STATE_ALBUMS, $STATE_TRACKLIST,
20 my $class=ref($proto) || $proto;
27 print "STATE: ", $self->state(), "\n";
34 if(($self->state() eq $STATE_FILE) ||
35 ($self->state() eq $STATE_INVALID))
45 return($self->state() != $STATE_INVALID);
51 if($self->state() == $STATE_FILE)
53 return $self->{db}->filename(@{$self->{elements}});
55 return "ERROR"; #should never happen?
66 @dents=qw(AND ARTISTS ALBUMS TRACKS);
70 @dents=$self->{db}->tags(@{$self->{elements}});
74 @dents=("ALL", $self->{db}->tags(@{$self->{elements}}));
78 @dents=$self->{db}->artists(@{$self->{elements}});
82 @dents=$self->{db}->albums(@{$self->{elements}});
84 when($STATE_TRACKLIST)
86 @dents=$self->{db}->tracks(@{$self->{elements}});
90 print "DIRENTS: UNHANDLED STATE: $_\n";
99 @{$self->{components}}=split(/\//, $self->{path});
100 shift @{$self->{components}}; # drop empty field before leading /
101 print "PATH: $self->{path}\n";
102 # print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
103 $self->state($STATE_ROOT);
104 return if($self->{path} eq "/");
105 my @parts=@{$self->{components}};
107 $self->{elements}=[];
108 while(my $name=shift @parts)
110 print "NAME: $name\n";
111 given($self->state())
115 print "SM: INVALID: $name\n";
120 print "SM: ROOT: $name\n";
123 $self->state($STATE_ARTISTS);
127 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
130 push(@{$self->{elements}}, $tag);
131 $self->state($STATE_TAG);
135 $self->state($STATE_INVALID);
141 print "SM: TAG: $name\n";
146 $self->state($STATE_BOOLEAN);
147 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
151 $self->state($STATE_ARTISTS);
155 $self->state($STATE_ALBUMS);
159 $self->state($STATE_TRACKLIST);
166 $self->state($STATE_INVALID);
171 when(255) #FIXME - dead code
173 print "SM: WANTMORE: $name\n";
174 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
177 push(@{$self->{elements}}, $tag);
178 # $self->state($STATE_TAG);
182 $self->state($STATE_INVALID);
184 my @valid_tagvals=$self->{db}->tag_values($tag);
185 print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n";
188 if(grep { $name eq $_; } @valid_tagvals)
190 print "TAGVAL VALID\n";
191 $self->state($STATE_TAGVAL);
192 push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name));
196 print "ERROR: unknown tagval: $tagval\n";
197 $self->state($STATE_INVALID);
202 $self->state($STATE_INVALID);
207 print "SM: TAGVAL: $name\n";
211 print "SM: BOOLEAN: $name\n";
212 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
215 push(@{$self->{elements}}, $tag);
216 $self->state($STATE_TAG);
220 $self->state($STATE_INVALID);
225 print "SM: ARTIST: $name\n";
226 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
227 push(@{$self->{elements}}, $tag);
230 push(@{$self->{elements}}, $artist);
231 $self->state($STATE_ALBUMS);
235 $self->state($STATE_INVALID);
240 print "SM: ALBUM: $name\n";
241 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
242 push(@{$self->{elements}}, $album);
245 push(@{$self->{elements}}, $album);
246 $self->state($STATE_TRACKLIST);
250 $self->state($STATE_INVALID);
253 when($STATE_TRACKLIST)
255 print "SM: TRACKS: $name\n";
256 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
257 push(@{$self->{elements}}, $track);
260 push(@{$self->{elements}}, $track);
261 $self->state($STATE_FILE);
265 $self->state($STATE_INVALID);
270 print "SM: FILE: $name\n";
271 # Can't have anything after a filename
272 $self->state($STATE_INVALID);
276 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
277 $self->state($STATE_INVALID);
285 my($self, $newstate)=@_;
286 $self->{state}=$newstate if(defined($newstate));
287 return $self->{state};