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_WANTMORE, $STATE_TAG, $STATE_TAGVAL,
13 $STATE_BOOL, $STATE_ARTIST, $STATE_ALBUM, $STATE_FILE)=(0..8);
18 my $class=ref($proto) || $proto;
25 print "STATE: ", $self->state(), "\n";
32 if(($self->state() eq $STATE_FILE) ||
33 ($self->state() eq $STATE_INVALID))
43 return($self->state() != $STATE_INVALID);
55 return $self->{db}->tags(@{$self->{elements}});
56 # elsif($self->state() == $STATE_WANTMORE)
58 # return(qw(AND OR ALL));
65 @{$self->{components}}=split(/\//, $self->{path});
66 shift @{$self->{components}}; # drop empty field before leading /
67 print "PATH: $self->{path}\n";
68 print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n";
69 $self->state($STATE_ROOT);
70 return if($self->{path} eq "/");
71 my @parts=@{$self->{components}};
74 while(my $name=shift @parts)
76 print "NAME: $name\n";
77 if ($self->state() == $STATE_INVALID)
79 print "SM: INVALID: $name\n";
82 elsif($self->state() == $STATE_ROOT)
84 print "SM: ROOT: $name\n";
85 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
88 push(@{$self->{elements}}, $tag);
89 $self->state($STATE_WANTMORE);
93 $self->state($STATE_INVALID);
96 elsif($self->state() == $STATE_WANTMORE)
98 print "SM: WANTMORE: $name\n";
99 $tag=ID3FS::PathElement::Tag->new($self->{db}, $name);
102 push(@{$self->{elements}}, $tag);
103 # $self->state($STATE_TAG);
107 $self->state($STATE_INVALID);
109 # if(($name eq "AND") || ($name eq "OR"))
111 # $self->state($STATE_BOOL);
112 # push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
114 # elsif($name eq "ALL")
116 # $self->state($STATE_ARTIST);
120 # $self->state($STATE_INVALID);
123 elsif($self->state() == $STATE_TAG)
125 print "SM: TAG: $name\n";
126 $self->state($STATE_WANTMORE);
128 my @valid_tagvals=$self->{db}->tag_values($tag);
129 print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n";
132 if(grep { $name eq $_; } @valid_tagvals)
134 print "TAGVAL VALID\n";
135 $self->state($STATE_TAGVAL);
136 push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name));
140 print "ERROR: unknown tagval: $tagval\n";
141 $self->state($STATE_INVALID);
146 $self->state($STATE_INVALID);
149 elsif($self->state() == $STATE_TAGVAL)
151 print "SM: TAGVAL: $name\n";
153 elsif($self->state() == $STATE_BOOL)
155 print "SM: BOOL: $name\n";
157 elsif($self->state() == $STATE_ARTIST)
159 print "SM: ARTIST: $name\n";
161 elsif($self->state() == $STATE_ALBUM)
163 print "SM: ALBUM: $name\n";
165 elsif($self->state() == $STATE_FILE)
167 print "SM: FILE: $name\n";
171 print "SM: ERROR: UNKNOWN STATE: $self->{state}\n";
172 $self->state($STATE_INVALID);
179 my($self, $newstate)=@_;
180 $self->{state}=$newstate if(defined($newstate));
181 return $self->{state};