123456789_123456789_123456789_123456789_123456789_

Class: Net::IMAP::RawData

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, CommandData
Instance Chain:
self, CommandData
Inherits: Net::IMAP::CommandData
Defined in: lib/net/imap/command_data.rb

Class Method Summary

CommandData - Inherited

.[]

Alias for CommandData.new.

.new,
.validate

following class definition goes beyond the basic Data.define(:data).

Instance Attribute Summary

CommandData - Inherited

Instance Method Summary

Constructor Details

.new(data:) ⇒ RawData

[ GitHub ]

  
# File 'lib/net/imap/command_data.rb', line 240

def initialize(data:)
  case data
  when String
    data = self.class.split(data)
  when Array
    unless data.all? { |part| RawText === part || Literal === part }
      raise TypeError, "expected String or Array[#{RawText} | #{Literal}]"
    end
  else
    raise TypeError, "expected String or Array[#{RawText} | #{Literal}]"
  end
  super
  validate
end

Class Method Details

.extract_literal(data, binary:, bytesize:, non_sync:) (private)

[ GitHub ]

  
# File 'lib/net/imap/command_data.rb', line 286

def self.extract_literal(data, binary:, bytesize:, non_sync:)
  if data.bytesize < bytesize
    raise DataFormatError, "Too few bytes in string for literal, " \
      "expected: %s, remaining: %s" % [bytesize, data.bytesize]
  end
  literal = data.byteslice(0, bytesize)
  (binary ? Literal8 : Literal).new(data: literal, non_sync: non_sync)
end

.split(data)

Splits an input string into an array of RawText and Literal/Literal8.

NOTE: unlike #validate, this does not prevent the final RawText from ending with a literal prefix.

[ GitHub ]

  
# File 'lib/net/imap/command_data.rb', line 269

def self.split(data)
  data = data.b # dups and ensures BINARY encoding
  parts = []
  while data.match(/(~)?\{(0|[1-9]\d*)(\+)?\}\r\n/n)
    text, binary, bytesize, non_sync, data = $`, !!$1, $2, !!$3, $'
    bytesize = Integer bytesize, 10
    parts << RawText[text] unless text.empty?
    parts << extract_literal(data,
                             binary: binary,
                             bytesize: bytesize,
                             non_sync: non_sync)
    data[0, bytesize] = ""
  end
  parts << RawText[data] unless data.empty?
  parts
end

Instance Method Details

#send_data(imap, tag)

[ GitHub ]

  
# File 'lib/net/imap/command_data.rb', line 255

def send_data(imap, tag) data.each do _1.send_data(imap, tag) end end

#validate

[ GitHub ]

  
# File 'lib/net/imap/command_data.rb', line 257

def validate
  return unless RawText === data.last
  text = data.last.data
  if text.rindex(/\{\d\?\}\z/n)
    raise DataFormatError, "RawData cannot end with literal continuation"
  end
end