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 my $tag=$self->{elements}->[$#{$self->{elements}}];
75 if(defined($tag) && (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: ARTISTS\n";
84 @dents=(qw(AND ALLTRACKS), # FIXME: NOT and OR
85 $self->{db}->artists(@{$self->{elements}}));
90 @dents=$self->{db}->tags(@{$self->{elements}});
94 @dents=("ALL", $self->{db}->tags(@{$self->{elements}}));
98 @dents=("TRACKS", $self->{db}->albums(@{$self->{elements}}));
100 when($STATE_TRACKLIST)
102 @dents=$self->{db}->tracks(@{$self->{elements}});
106 print "DIRENTS: UNHANDLED STATE: $_\n";
115 @{$self->{components}}=split(/\//, $self->{path});
116 shift @{$self->{components}}; # drop empty field before leading /
117 print "PATH: $self->{path}\n";
118 # print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
119 $self->state($STATE_ROOT);
120 return if($self->{path} eq "/");
121 my @parts=@{$self->{components}};
123 $self->{elements}=[];
124 while(my $name=shift @parts)
126 print "NAME: $name\n";
127 given($self->state())
131 print "SM: INVALID: $name\n";
136 print "SM: ROOT: $name\n";
139 $self->state($STATE_TAG);
143 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
146 push(@{$self->{elements}}, $tag);
147 $self->state($STATE_TAG);
151 $self->state($STATE_INVALID);
157 print "SM: TAG: $name\n";
158 my $tag=$self->{elements}->[$#{$self->{elements}}];
160 ref($tag) eq "ID3FS::PathElement::Tag" &&
161 $self->{db}->tag_has_values($tag->{id}))
163 my $tagval=ID3FS::PathElement::Tagval->new($name);
166 $self->state($STATE_BOOLEAN);
167 push(@{$self->{elements}}, $tagval);
171 $self->state($STATE_INVALID);
180 $self->state($STATE_BOOLEAN);
181 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
185 $self->state($STATE_TRACKLIST);
189 $self->state($STATE_BOOLEAN);
190 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
194 $self->state($STATE_TAG);
195 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
197 my $artist=ID3FS::PathElement::Artist->new($self->{db}, $name);
200 push(@{$self->{elements}}, $artist);
201 $self->state($STATE_ALBUMS);
205 $self->state($STATE_INVALID);
211 # when(255) #FIXME - dead code
213 # my @valid_tagvals=$self->{db}->tag_values($tag);
214 # print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n";
217 # if(grep { $name eq $_; } @valid_tagvals)
219 # print "TAGVAL VALID\n";
220 # $self->state($STATE_TAGVAL);
221 # push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name));
225 # print "ERROR: unknown tagval: $tagval\n";
226 # $self->state($STATE_INVALID);
231 print "SM: TAGVAL: $name\n";
235 print "SM: BOOLEAN: $name\n";
236 my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
239 push(@{$self->{elements}}, $tag);
240 $self->state($STATE_TAG);
244 $self->state($STATE_INVALID);
249 print "SM: ALBUM: $name\n";
250 if($name eq "TRACKS")
252 $self->state($STATE_TRACKLIST);
256 my $album=ID3FS::PathElement::Album->new($self->{db}, $name);
259 push(@{$self->{elements}}, $album);
260 $self->state($STATE_TRACKLIST);
264 $self->state($STATE_INVALID);
268 when($STATE_TRACKLIST)
270 print "SM: TRACKLIST: $name\n";
271 my $track=ID3FS::PathElement::File->new($self->{db}, $name);
272 push(@{$self->{elements}}, $track);
275 push(@{$self->{elements}}, $track);
276 $self->state($STATE_FILE);
280 $self->state($STATE_INVALID);
285 print "SM: FILE: $name\n";
286 # Can't have anything after a filename
287 $self->state($STATE_INVALID);
291 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
292 $self->state($STATE_INVALID);
300 my($self, $newstate)=@_;
301 $self->{state}=$newstate if(defined($newstate));
302 return $self->{state};