diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Net/IMAP/Sync.pm | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/lib/Net/IMAP/Sync.pm b/lib/Net/IMAP/Sync.pm index 2aff76c..21e2fa8 100644 --- a/lib/Net/IMAP/Sync.pm +++ b/lib/Net/IMAP/Sync.pm @@ -682,6 +682,15 @@ sub append($$$@) { } +# $self->fetch($set, $flags, [$callback]) +# Issue an UID FETCH command with the given UID $set, $flags, and +# optional $callback. +sub fetch($$$$) { + my ($self, $set, $flags, $callback) = @_; + $self->_send("UID FETCH $set $flags", $callback); +} + + # $self->notify(@specifications) # Issue a NOTIFY command with the given mailbox @specifications (cf RFC # 5465 section 6) to be monitored. Croak if the server did not @@ -832,13 +841,16 @@ sub next_dirty_mailbox($@) { } -# $self->pull_updates() +# $self->pull_updates([$full]) +# If $full is set, FETCH FLAGS and MODSEQ for each UID up to +# UIDNEXT-1. # Get pending updates (unprocessed VANISHED responses and FLAG # updates), and empty these lists from the cache. # Finally, update the HIGHESTMODSEQ from the persistent cache to the # value found in the internal cache. -sub pull_updates($) { +sub pull_updates($;$) { my $self = shift; + my $full = shift // 0; my $mailbox = $self->{_SELECTED} // $self->panic(); my $pcache = $self->{_PCACHE}->{$mailbox}; @@ -848,6 +860,9 @@ sub pull_updates($) { $self->{_VANISHED} = []; } else { + $self->_send("UID FETCH 1:".($pcache->{UIDNEXT}-1)." (MODSEQ FLAGS)") + if $full and $pcache->{UIDNEXT} > 1; + my @missing; while (%{$self->{_MODIFIED}}) { while (my ($uid,$v) = each %{$self->{_MODIFIED}}) { @@ -855,9 +870,9 @@ sub pull_updates($) { # FLAG updates can arrive while processing pull_new_messages # for instance if (defined $v->[1] and $v->[0] > 0) { # setting the MODSEQ to 0 forces a FETCH - next unless $uid < $pcache->{UIDNEXT} # out of bounds - and $v->[0] > $pcache->{HIGHESTMODSEQ}; # already seen - $modified{$uid} = $v->[1]; + next unless $uid < $pcache->{UIDNEXT} # out of bounds + and ($full or $v->[0] > $pcache->{HIGHESTMODSEQ}); # already seen + $modified{$uid} = $full ? $v : $v->[1]; } else { push @missing, $uid; } @@ -996,7 +1011,7 @@ sub push_flag_updates($$@) { } unless ($self->{quiet}) { - $self->log("Updated flags ($flags) for UID ".compact_set(@ok)); + $self->log("Updated flags ($flags) for UID ".compact_set(@ok)) if @ok; $self->log("Couldn't update flags ($flags) for UID ".compact_set(keys %failed).', '. "trying again later") if %failed; } |