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?
69 print "DIRENTS: STATE: ", $self->state(), "\n";
74 @dents=(qw(AND ALLTRACKS), # FIXME: NOT and OR
75 $self->{db}->artists(@{$self->{elements}}));
79 @dents=$self->{db}->tags(@{$self->{elements}});
83 @dents=("ALL", $self->{db}->tags(@{$self->{elements}}));
84 print "\nDIRENTS: DENTS: ", join(", ", @dents),"\n\n";
88 @dents=("TRACKS", $self->{db}->albums(@{$self->{elements}}));
90 when($STATE_TRACKLIST)
92 @dents=$self->{db}->tracks(@{$self->{elements}});
96 print "DIRENTS: UNHANDLED STATE: $_\n";
105 @{$self->{components}}=split(/\//, $self->{path});
106 shift @{$self->{components}}; # drop empty field before leading /
107 print "PATH: $self->{path}\n";
108 # print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
109 $self->state($STATE_ROOT);
110 return if($self->{path} eq "/");
111 my @parts=@{$self->{components}};
113 $self->{elements}=[];
114 while(my $name=shift @parts)
116 print "NAME: $name\n";
117 given($self->state())
121 print "SM: INVALID: $name\n";
126 print "SM: ROOT: $name\n";
129 $self->state($STATE_TAG);
133 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
136 push(@{$self->{elements}}, $tag);
137 $self->state($STATE_TAG);
141 $self->state($STATE_INVALID);
147 print "SM: TAG: $name\n";
152 $self->state($STATE_BOOLEAN);
153 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
157 $self->state($STATE_TRACKLIST);
161 $self->state($STATE_BOOLEAN);
162 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
166 $self->state($STATE_TAG);
167 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
169 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
172 push(@{$self->{elements}}, $artist);
173 $self->state($STATE_ALBUMS);
177 $self->state($STATE_INVALID);
182 # when(255) #FIXME - dead code
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 print "SM: TAGVAL: $name\n";
206 print "SM: BOOLEAN: $name\n";
207 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
210 push(@{$self->{elements}}, $tag);
211 $self->state($STATE_TAG);
215 $self->state($STATE_INVALID);
220 print "SM: ALBUM: $name\n";
221 if($name eq "TRACKS")
223 $self->state($STATE_TRACKLIST);
227 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
228 push(@{$self->{elements}}, $album);
231 push(@{$self->{elements}}, $album);
232 $self->state($STATE_TRACKLIST);
236 $self->state($STATE_INVALID);
240 when($STATE_TRACKLIST)
242 print "SM: TRACKLIST: $name\n";
243 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
244 push(@{$self->{elements}}, $track);
247 push(@{$self->{elements}}, $track);
248 $self->state($STATE_FILE);
252 $self->state($STATE_INVALID);
257 print "SM: FILE: $name\n";
258 # Can't have anything after a filename
259 $self->state($STATE_INVALID);
263 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
264 $self->state($STATE_INVALID);
272 my($self, $newstate)=@_;
273 $self->{state}=$newstate if(defined($newstate));
274 return $self->{state};