]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Smsg.pm
www: remove smsg_mime API and adjust callers
[public-inbox.git] / lib / PublicInbox / Smsg.pm
index 7c90b92dabbcd7d764703e46b7bc31641aa1f526..9688c5592a20f62ed97d1ec8ada81a063f92750f 100644 (file)
@@ -12,21 +12,11 @@ use strict;
 use warnings;
 use base qw(Exporter);
 our @EXPORT_OK = qw(subject_normalized);
-use PublicInbox::MID qw/mid_mime/;
+use PublicInbox::MID qw(mid_mime mids);
 use PublicInbox::Address;
 use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp);
 use Time::Local qw(timegm);
 
-sub new {
-       my ($class, $mime) = @_;
-       bless { mime => $mime }, $class;
-}
-
-sub wrap {
-       my ($class, $mid) = @_;
-       bless { mid => $mid }, $class;
-}
-
 sub get_val ($$) {
        my ($doc, $col) = @_;
        # sortable_unserialise is defined by PublicInbox::Search::load_xapian()
@@ -36,11 +26,11 @@ sub get_val ($$) {
 sub to_doc_data {
        my ($self) = @_;
        join("\n",
-               $self->subject,
-               $self->from,
+               $self->{subject},
+               $self->{from},
                $self->references,
-               $self->to,
-               $self->cc,
+               $self->{to},
+               $self->{cc},
                $self->{blob},
                $self->{mid},
                $self->{bytes} // '',
@@ -106,20 +96,51 @@ sub lines ($) { $_[0]->{lines} }
 
 sub __hdr ($$) {
        my ($self, $field) = @_;
-       my $val = $self->{$field};
-       return $val if defined $val;
+       $self->{lc($field)} //= do {
+               my $mime = $self->{mime} or return;
+               my $val = join(', ', $mime->header($field));
+               $val =~ tr/\r//d;
+               $val =~ tr/\t\n/  /;
+               $val;
+       };
+}
+
+# for Import and v1 non-SQLite WWW code paths
+sub populate {
+       my ($self, $hdr, $v2w) = @_;
+       for my $f (qw(From To Cc Subject)) {
+               my @all = $hdr->header($f);
+               my $val = join(', ', @all);
+               $val =~ tr/\r//d;
+               # MIME decoding can create NULs, replace them with spaces
+               # to protect git and NNTP clients
+               $val =~ tr/\0\t\n/   /;
+
+               # lower-case fields for read-only stuff
+               $self->{lc($f)} = $val;
+
+               # Capitalized From/Subject for git-fast-import
+               next if $f eq 'To' || $f eq 'Cc';
+               if (scalar(@all) > 1) {
+                       $val = $all[0];
+                       $val =~ tr/\r//d;
+                       $val =~ tr/\0\t\n/   /;
+               }
+               $self->{$f} = $val if $val ne '';
+       }
+       $v2w //= {};
+       $self->{-ds} = [ my @ds = msg_datestamp($hdr, $v2w->{autime}) ];
+       $self->{-ts} = [ my @ts = msg_timestamp($hdr, $v2w->{cotime}) ];
+       $self->{ds} //= $ds[0]; # no zone
+       $self->{ts} //= $ts[0];
 
-       my $mime = $self->{mime} or return;
-       my @raw = $mime->header($field);
-       $val = join(', ', @raw);
-       $val =~ tr/\t\n/  /;
-       $val =~ tr/\r//d;
-       $self->{$field} = $val;
+       # for v1 users w/o SQLite
+       $self->{mid} //= eval { mids($hdr)->[0] } // '';
 }
 
-sub subject ($) { __hdr($_[0], 'subject') }
-sub to ($) { __hdr($_[0], 'to') }
-sub cc ($) { __hdr($_[0], 'cc') }
+sub subject ($) { __hdr($_[0], 'Subject') }
+sub to ($) { __hdr($_[0], 'To') }
+sub cc ($) { __hdr($_[0], 'Cc') }
 
 # no strftime, that is locale-dependent and not for RFC822
 my @DoW = qw(Sun Mon Tue Wed Thu Fri Sat);
@@ -137,7 +158,7 @@ sub date ($) {
 
 sub from ($) {
        my ($self) = @_;
-       my $from = __hdr($self, 'from');
+       my $from = __hdr($self, 'From');
        if (defined $from && !defined $self->{from_name}) {
                my @n = PublicInbox::Address::names($from);
                $self->{from_name} = join(', ', @n);