1# Copyrights 2001-2021 by [Mark Overmeer <markov@cpan.org>].
2#  For other contributors see ChangeLog.
3# See the manual pages for details on the licensing terms.
4# Pod stripped from pm file by OODoc 2.02.
5# This code is part of distribution Mail-Message.  Meta-POD processed with
6# OODoc into POD and HTML manual-pages.  See README.md
7# Copyright Mark Overmeer.  Licensed under the same terms as Perl itself.
8
9package Mail::Message::Body::String;
10use vars '$VERSION';
11$VERSION = '3.011';
12
13use base 'Mail::Message::Body';
14
15use strict;
16use warnings;
17
18use Carp;
19use Mail::Box::FastScalar;
20
21
22#------------------------------------------
23# The scalar is stored as reference to avoid a copy during creation of
24# a string object.
25
26sub _data_from_filename(@)
27{   my ($self, $filename) = @_;
28
29    delete $self->{MMBS_nrlines};
30
31    local *IN;
32    unless(open IN, '<', $filename)
33    {   $self->log(ERROR =>
34            "Unable to read file $filename for message body scalar: $!");
35        return;
36    }
37
38    my @lines = <IN>;
39    close IN;
40
41    $self->{MMBS_nrlines} = @lines;
42    $self->{MMBS_scalar}  = join '', @lines;
43    $self;
44}
45
46sub _data_from_filehandle(@)
47{   my ($self, $fh) = @_;
48    if(ref $fh eq 'Mail::Box::FastScalar')
49    {   my $lines = $fh->getlines;
50        $self->{MMBS_nrlines} = @$lines;
51        $self->{MMBS_scalar}  = join '', @$lines;
52    }
53    else
54    {    my @lines = $fh->getlines;
55         $self->{MMBS_nrlines} = @lines;
56         $self->{MMBS_scalar}  = join '', @lines;
57    }
58    $self;
59}
60
61sub _data_from_glob(@)
62{   my ($self, $fh) = @_;
63    my @lines = <$fh>;
64    $self->{MMBS_nrlines} = @lines;
65    $self->{MMBS_scalar}  = join '', @lines;
66    $self;
67}
68
69sub _data_from_lines(@)
70{   my ($self, $lines) = @_;
71    $self->{MMBS_nrlines} = @$lines unless @$lines==1;
72    $self->{MMBS_scalar}  = @$lines==1 ? shift @$lines : join('', @$lines);
73    $self;
74}
75
76sub clone()
77{   my $self = shift;
78    ref($self)->new(data => $self->string, based_on => $self);
79}
80
81sub nrLines()
82{   my $self = shift;
83    return $self->{MMBS_nrlines} if defined $self->{MMBS_nrlines};
84
85    my $lines = $self->{MMBS_scalar} =~ tr/\n/\n/;
86    $lines++ if $self->{MMBS_scalar} !~ m/\n\z/;
87    $self->{MMBS_nrlines} = $lines;
88}
89
90sub size() { length shift->{MMBS_scalar} }
91
92sub string() { shift->{MMBS_scalar} }
93
94sub lines()
95{   my @lines = split /^/, shift->{MMBS_scalar};
96    wantarray ? @lines : \@lines;
97}
98
99sub file() { Mail::Box::FastScalar->new(\shift->{MMBS_scalar}) }
100
101sub print(;$)
102{   my $self = shift;
103    my $fh   = shift || select;
104    if(ref $fh eq 'GLOB') { print $fh $self->{MMBS_scalar} }
105    else                  { $fh->print($self->{MMBS_scalar}) }
106    $self;
107}
108
109sub read($$;$@)
110{   my ($self, $parser, $head, $bodytype) = splice @_, 0, 4;
111    delete $self->{MMBS_nrlines};
112
113    (my $begin, my $end, $self->{MMBS_scalar}) = $parser->bodyAsString(@_);
114    $self->fileLocation($begin, $end);
115
116    $self;
117}
118
119sub endsOnNewline() { shift->{MMBS_scalar} =~ m/\A\z|\n\z/ }
120
1211;
122