# Copyrights 2001-2012 by [Mark Overmeer]. # For other contributors see ChangeLog. # See the manual pages for details on the licensing terms. # Pod stripped from pm file by OODoc 2.00. use strict; use warnings; package Mail::Box::IMAP4::Message; use vars '$VERSION'; $VERSION = '2.104'; use base 'Mail::Box::Net::Message'; use Date::Parse 'str2time'; sub init($) { my ($self, $args) = @_; $self->SUPER::init($args); $self->{MBIM_write_labels} = exists $args->{write_labels} ? $args->{write_labels} : 1; $self->{MBIM_cache_labels} = $args->{cache_labels}; $self->{MBIM_cache_head} = $args->{cache_head}; $self->{MBIM_cache_body} = $args->{cache_body}; $self; } sub size($) { my $self = shift; return $self->SUPER::size unless $self->isDelayed; $self->fetch('RFC822.SIZE'); } sub recvstamp() { my $date = shift->fetch('INTERNALDATE'); defined $date ? str2time($date) : undef; } sub label(@) { my $self = shift; my $imap = $self->folder->transporter or return; my $id = $self->unique or return; if(@_ == 1) { # get one value only my $label = shift; my $labels = $self->{MM_labels}; return $labels->{$label} if exists $labels->{$label} || exists $labels->{seen}; my $flags = $imap->getFlags($id); if($self->{MBIM_cache_labels}) { # the program may have added own labels @{$labels}{keys %$flags} = values %$flags; delete $self->{MBIM_labels_changed}; } return $flags->{$label}; } my @private; if($self->{MBIM_write_labels}) { @private = $imap->setFlags($id, @_); delete $self->{MBIM_labels_changed}; } else { @private = @_; } my $labels = $self->{MM_labels}; my @keep = $self->{MBIM_cache_labels} ? @_ : @private; while(@keep) { my ($k, $v) = (shift @keep, shift @keep); next if defined $labels->{$k} && $labels->{$k} eq $v; $self->{MBIM_labels_changed}++; $labels->{$k} = $v; } $self->modified(1) if @private && $self->{MBIM_labels_changed}; $self; } sub labels() { my $self = shift; my $id = $self->unique; my $labels = $self->SUPER::labels; $labels = { %$labels } unless $self->{MBIM_cache_labels}; if($id && !exists $labels->{seen}) { my $imap = $self->folder->transporter or return; my $flags = $imap->getFlags($id); @{$labels}{keys %$flags} = values %$flags; } $labels; } #------------------------------------------- sub loadHead() { my $self = shift; my $head = $self->head; return $head unless $head->isDelayed; $head = $self->folder->getHead($self); $self->head($head) if $self->{MBIM_cache_head}; $head; } sub loadBody() { my $self = shift; my $body = $self->body; return $body unless $body->isDelayed; (my $head, $body) = $self->folder->getHeadAndBody($self); return undef unless defined $head; $self->head($head) if $self->{MBIM_cache_head} && $head->isDelayed; $self->storeBody($body) if $self->{MBIM_cache_body}; $body; } sub fetch(@) { my ($self, @info) = @_; my $folder = $self->folder; my $answer = ($folder->fetch( [$self], @info))[0]; @info==1 ? $answer->{$info[0]} : @{$answer}{@info}; } sub writeDelayed($$) { my ($self, $foldername, $imap) = @_; my $id = $self->unique; my $labels = $self->labels; if($self->head->modified || $self->body->modified || !$id) { $imap->appendMessage($self, $foldername); if($id) { $self->delete; $self->unique(undef); } } elsif($self->{MBIM_labels_changed}) { $imap->setFlags($id, %$labels); # non-IMAP4 labels disappear delete $self->{MBIM_labels_changed}; } $self; } #------------------------------------------- 1;