class ADSP::Stream::Abstract

ADSP::Stream::Abstract class.

Attributes

external_encoding[R]

Encoding name for destination data.

internal_encoding[R]

Encoding name for source data.

io[R]

Native stream.

pos[R]

Current offset for source data.

stat[R]

Native stream status info.

tell[R]

Current offset for source data.

transcode_options[R]

Transcode options for native stream.

Public Class Methods

new(io, options = {}) click to toggle source

Initializes stream using io native stream and options. Option: :external_encoding encoding name for destination data. Option: :internal_encoding encoding name for source data. Option: :transcode_options transcode options for data.

# File lib/adsp/stream/abstract.rb, line 46
def initialize(io, options = {})
  @raw_stream = create_raw_stream
  @io         = io

  @stat = Stat.new @io.stat if @io.respond_to? :stat

  set_encoding options[:external_encoding], options[:internal_encoding], options[:transcode_options]
  reset_buffer
  reset_io_advise

  @pos = 0
end

Public Instance Methods

advise() click to toggle source

Sets access mode for native stream, noop.

# File lib/adsp/stream/abstract.rb, line 86
def advise
  # Noop
  nil
end
close() click to toggle source

Closes stream.

# File lib/adsp/stream/abstract.rb, line 183
def close
  @io.close if @io.respond_to? :close

  nil
end
closed?() click to toggle source

Returns whether stream is closed.

# File lib/adsp/stream/abstract.rb, line 190
def closed?
  return false unless @raw_stream.closed?

  if @io.respond_to? :closed
    @io.closed?
  else
    true
  end
end
rewind() click to toggle source

Resets stream and source position. Returns zero (offset for source data).

# File lib/adsp/stream/abstract.rb, line 169
def rewind
  @raw_stream = create_raw_stream

  @io.rewind if @io.respond_to? :rewind

  reset_buffer
  reset_io_advise

  @pos = 0

  0
end
set_encoding(*args) click to toggle source

Sets encoding for source and destination data. First argument: :external_encoding encoding name for destination data. Second argument: :internal_encoding encoding name for source data. Third argument: :transcode_options transcode options for data.

# File lib/adsp/stream/abstract.rb, line 97
def set_encoding(*args)
  external_encoding, internal_encoding, transcode_options = process_set_encoding_arguments(*args)

  set_target_encoding :@external_encoding, external_encoding
  set_target_encoding :@internal_encoding, internal_encoding
  @transcode_options = transcode_options

  self
end
to_io() click to toggle source

Returns self object.

# File lib/adsp/stream/abstract.rb, line 201
def to_io
  self
end

Protected Instance Methods

create_raw_stream() click to toggle source

Creates raw stream.

# File lib/adsp/stream/abstract.rb, line 62
          def create_raw_stream
  raise NotImplementedError
end
process_set_encoding_arguments(*args) click to toggle source

Processes encoding for source and destination data. First argument: :external_encoding encoding name for destination data. Second argument: :internal_encoding encoding name for source data. Third argument: :transcode_options transcode options for data.

# File lib/adsp/stream/abstract.rb, line 111
          def process_set_encoding_arguments(*args)
  external_encoding = args[0]

  unless external_encoding.nil? || external_encoding.is_a?(::Encoding)
    Validation.validate_string external_encoding

    # First argument can be "external_encoding:internal_encoding".
    match = %r{(.+?):(.+)}.match external_encoding

    unless match.nil?
      external_encoding = match[0]
      internal_encoding = match[1]

      transcode_options = args[1]
      Validation.validate_hash transcode_options unless transcode_options.nil?

      return [external_encoding, internal_encoding, transcode_options]
    end
  end

  internal_encoding = args[1]
  unless internal_encoding.nil? || internal_encoding.is_a?(::Encoding)
    Validation.validate_string internal_encoding
  end

  transcode_options = args[2]
  Validation.validate_hash transcode_options unless transcode_options.nil?

  [external_encoding, internal_encoding, transcode_options]
end
reset_buffer() click to toggle source

Resets internal source buffer.

# File lib/adsp/stream/abstract.rb, line 71
          def reset_buffer
  @buffer = ::String.new :encoding => ::Encoding::BINARY
end
reset_io_advise() click to toggle source

Resets native stream advise.

# File lib/adsp/stream/abstract.rb, line 78
          def reset_io_advise
  # Both compressor and decompressor need sequential io access.
  @io.advise :sequential if @io.respond_to? :advise
rescue ::Errno::ESPIPE
  # ok
end
set_target_encoding(name, value) click to toggle source

Sets value for encoding name.

# File lib/adsp/stream/abstract.rb, line 143
          def set_target_encoding(name, value)
  unless value.nil? || value.is_a?(::Encoding)
    begin
      value = ::Encoding.find value
    rescue ::ArgumentError
      raise ValidateError, "invalid #{name} encoding"
    end
  end

  instance_variable_set name, value
end
target_encoding() click to toggle source

Returns encoding for source data if defined. Returns encoding for destination data if encoding for source data is not defined. Returns binary encoding if encodings for source and destination dara are not defined.

# File lib/adsp/stream/abstract.rb, line 158
          def target_encoding
  return @internal_encoding unless @internal_encoding.nil?
  return @external_encoding unless @external_encoding.nil?

  ::Encoding::BINARY
end