-sub lcat_redispatch {
- my ($lei, $out, $op_p) = @_;
- my $l = bless { %$lei }, ref($lei);
- delete $l->{sock};
- $l->{''} = $op_p; # daemon only
- eval {
- $l->qerr("# updating $out");
- up1($l, $out);
- $l->qerr("# $out done");
- };
- $l->err($@) if $@;
+sub lcat_folder ($$;$$) {
+ my ($lei, $folder, $beg, $end) = @_;
+ my $lms = $lei->{-lms_rw} //= $lei->lms // return;
+ my $folders = [ $folder ];
+ eval { $lms->arg2folder($lei, $folders) };
+ return $lei->child_error(0, "# unknown folder: $folder") if $@;
+ my %range;
+ if (defined($beg)) { # NNTP article range
+ $range{min} = $beg;
+ $range{max} = $end // $beg;
+ }
+ for my $f (@$folders) {
+ my $fid = $lms->fid_for($f);
+ push @{$lei->{lcat_todo}}, { fid => $fid, %range };
+ }
+}
+
+sub lcat_imap_uri ($$) {
+ my ($lei, $uri) = @_;
+ # cf. LeiXSearch->lcat_dump
+ my $lms = $lei->{-lms_rw} //= $lei->lms // return;
+ if (defined $uri->uid) {
+ push @{$lei->{lcat_todo}}, $lms->imap_oidhex($lei, $uri);
+ } elsif (defined(my $fid = $lms->fid_for($$uri))) {
+ push @{$lei->{lcat_todo}}, { fid => $fid };
+ } else {
+ lcat_folder($lei, $$uri);
+ }
+}
+
+sub lcat_nntp_uri ($$) {
+ my ($lei, $uri) = @_;
+ my $mid = $uri->message; # already unescaped by URI::news
+ return "mid:$mid" if defined($mid);
+ my $lms = $lei->{-lms_rw} //= $lei->lms // return;
+ my ($ng, $beg, $end) = $uri->group;
+ $uri->group($ng);
+ lcat_folder($lei, $$uri, $beg, $end);
+ '""';