X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FNetWriter.pm;h=4a1f34f63c458a5733d58569c8b0c6a945678adf;hb=23af251dd607c4e75ab1e68063f2c885c48cc035;hp=89f8662efa647009ce68778e94c95c2d94a1e7ff;hpb=fb8b16ff2b40ecd22ebbdea0d27069749e800077;p=public-inbox.git diff --git a/lib/PublicInbox/NetWriter.pm b/lib/PublicInbox/NetWriter.pm index 89f8662e..4a1f34f6 100644 --- a/lib/PublicInbox/NetWriter.pm +++ b/lib/PublicInbox/NetWriter.pm @@ -13,26 +13,56 @@ my %IMAPkw2flags; @IMAPkw2flags{values %PublicInbox::NetReader::IMAPflags2kw} = keys %PublicInbox::NetReader::IMAPflags2kw; +sub kw2flags ($) { join(' ', map { $IMAPkw2flags{$_} } @{$_[0]}) } + sub imap_append { my ($mic, $folder, $bref, $smsg, $eml) = @_; $bref //= \($eml->as_string); - $smsg //= bless { }, 'PublicInbox::Smsg'; + $smsg //= bless {}, 'PublicInbox::Smsg'; + bless($smsg, 'PublicInbox::Smsg') if ref($smsg) eq 'HASH'; $smsg->{ts} //= msg_timestamp($eml // PublicInbox::Eml->new($$bref)); - my @f = map { $IMAPkw2flags{$_} } @{$smsg->{kw}}; - $mic->append_string($folder, $$bref, "@f", $smsg->internaldate) or + my $f = kw2flags($smsg->{kw}); + $mic->append_string($folder, $$bref, $f, $smsg->internaldate) or die "APPEND $folder: $@"; } +sub folder_select { 'select' } # for PublicInbox::NetReader + sub imap_delete_all { - my ($self, $url) = @_; - my $uri = PublicInbox::URIimap->new($url); + my ($self, $uri) = @_; + my $mic = $self->mic_for_folder($uri) or return; my $sec = $self->can('uri_section')->($uri); local $0 = $uri->mailbox." $sec"; - my $mic = $self->mic_get($sec) or die "E: not connected: $@"; - $mic->select($uri->mailbox) or return; # non-existent if ($mic->delete_message('1:*')) { $mic->expunge; } } +sub imap_delete_1 { + my ($self, $uri, $uid, $delete_mic) = @_; + $$delete_mic //= $self->mic_for_folder($uri) or return; + $$delete_mic->delete_message($uid); +} + +sub imap_add_kw { + my ($self, $mic, $uid, $kw) = @_; + $mic->store($uid, '+FLAGS.SILENT', '('.kw2flags($kw).')'); + $mic; # caller must ->expunge +} + +sub imap_set_kw { + my ($self, $mic, $uid, $kw) = @_; + $mic->store($uid, 'FLAGS.SILENT', '('.kw2flags($kw).')'); + $mic; # caller must ->expunge +} + +sub can_store_flags { + my ($self, $mic) = @_; + for ($mic->Results) { + /^\* OK \[PERMANENTFLAGS \(([^\)]*)\)\].*/ and + return $self->can('perm_fl_ok')->($1); + } + undef; +} + 1;