# File lib/ole/ranges_io.rb, line 166
  def write data
    # short cut. needed because truncate 0 may return no ranges, instead of empty range,
    # thus offset_and_size fails.
    return 0 if data.empty?
    data_pos = 0
    # if we don't have room, we can use the truncate hook to make more space.
    if data.length > @size - @pos
      begin
        truncate @pos + data.length
      rescue NotImplementedError
        raise IOError, "unable to grow #{inspect} to write #{data.length} bytes" 
      end
    end
    partial_range, i = offset_and_size @pos
    ([partial_range] + ranges[i+1..-1]).each do |pos, len|
      @io.seek pos
      if data_pos + len > data.length
        chunk = data[data_pos..-1]
        @io.write chunk
        @pos += chunk.length
        data_pos = data.length
        break
      end
      @io.write data[data_pos, len]
      @pos += len
      data_pos += len
    end
    data_pos
  end