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_ALBUMS, $STATE_TRACKLIST,
20 my $class=ref($proto) || $proto;
27 print "STATE: ", $self->state(), "\n";
34 if(($self->state() == $STATE_FILE) ||
35 ($self->state() == $STATE_INVALID))
45 return 1 if($self->state() == $STATE_FILE);
52 return($self->state() != $STATE_INVALID);
58 if($self->state() == $STATE_FILE)
60 return $self->{db}->filename(@{$self->{elements}});
62 return "ERROR"; #should never happen?
73 @dents=(qw(AND ALLTRACKS), # FIXME: NOT and OR
74 $self->{db}->artists(@{$self->{elements}}));
78 @dents=$self->{db}->tags(@{$self->{elements}});
82 @dents=("ALL", $self->{db}->tags(@{$self->{elements}}));
86 @dents=("TRACKS", $self->{db}->albums(@{$self->{elements}}));
88 when($STATE_TRACKLIST)
90 @dents=$self->{db}->tracks(@{$self->{elements}});
94 print "DIRENTS: UNHANDLED STATE: $_\n";
103 @{$self->{components}}=split(/\//, $self->{path});
104 shift @{$self->{components}}; # drop empty field before leading /
105 print "PATH: $self->{path}\n";
106 # print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
107 $self->state($STATE_ROOT);
108 return if($self->{path} eq "/");
109 my @parts=@{$self->{components}};
111 $self->{elements}=[];
112 while(my $name=shift @parts)
114 print "NAME: $name\n";
115 given($self->state())
119 print "SM: INVALID: $name\n";
124 print "SM: ROOT: $name\n";
127 $self->state($STATE_TAG);
131 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
134 push(@{$self->{elements}}, $tag);
135 $self->state($STATE_TAG);
139 $self->state($STATE_INVALID);
145 print "SM: TAG: $name\n";
150 $self->state($STATE_BOOLEAN);
151 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
155 $self->state($STATE_TRACKLIST);
159 $self->state($STATE_BOOLEAN);
160 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
164 $self->state($STATE_TAG);
165 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
167 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
170 push(@{$self->{elements}}, $artist);
171 $self->state($STATE_ALBUMS);
175 $self->state($STATE_INVALID);
180 # when(255) #FIXME - dead code
182 # my @valid_tagvals=$self->{db}->tag_values($tag);
183 # print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n";
186 # if(grep { $name eq $_; } @valid_tagvals)
188 # print "TAGVAL VALID\n";
189 # $self->state($STATE_TAGVAL);
190 # push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name));
194 # print "ERROR: unknown tagval: $tagval\n";
195 # $self->state($STATE_INVALID);
200 print "SM: TAGVAL: $name\n";
204 print "SM: BOOLEAN: $name\n";
205 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
208 push(@{$self->{elements}}, $tag);
209 $self->state($STATE_TAG);
213 $self->state($STATE_INVALID);
218 print "SM: ALBUM: $name\n";
219 if($name eq "TRACKS")
221 $self->state($STATE_TRACKLIST);
225 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
226 push(@{$self->{elements}}, $album);
229 push(@{$self->{elements}}, $album);
230 $self->state($STATE_TRACKLIST);
234 $self->state($STATE_INVALID);
238 when($STATE_TRACKLIST)
240 print "SM: TRACKLIST: $name\n";
241 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
242 push(@{$self->{elements}}, $track);
245 push(@{$self->{elements}}, $track);
246 $self->state($STATE_FILE);
250 $self->state($STATE_INVALID);
255 print "SM: FILE: $name\n";
256 # Can't have anything after a filename
257 $self->state($STATE_INVALID);
261 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
262 $self->state($STATE_INVALID);
270 my($self, $newstate)=@_;
271 $self->{state}=$newstate if(defined($newstate));
272 return $self->{state};