+sub uid_fetch_uid { # long_response
+ my ($self, $tag, $uids, $range_info, $ops) = @_;
+ while (!@$uids) { # rare
+ my ($beg, $end, $range_csv) = @$range_info;
+ if (scalar(@$uids = @{$self->{ibx}->over->
+ uid_range($beg, $end)})) {
+ $range_info->[0] = $uids->[-1] + 1;
+ } elsif (!$range_csv) {
+ $self->write(\"$tag OK Fetch done\r\n");
+ return;
+ } else {
+ my $next_range = range_step($self, \$range_csv);
+ if (!ref($next_range)) { # error
+ $self->write(\"$tag $next_range\r\n");
+ return;
+ }
+ @$range_info = @$next_range;
+ }
+ # continue looping
+ }
+ for (@$uids) {
+ $self->msg_more("* $_ FETCH (UID $_");
+ for (my $i = 0; $i < @$ops;) {
+ my $k = $ops->[$i++];
+ $ops->[$i++]->($self, $k);
+ }
+ $self->msg_more(")\r\n");
+ }
+ @$uids = ();
+ 1; # more
+}
+