Class: Chef::Knife::Core::CookbookSiteStreamingUploader::MultipartStream

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/knife/core/cookbook_site_streaming_uploader.rb

Instance Method Summary collapse

Constructor Details

#initialize(parts) ⇒ MultipartStream

Returns a new instance of MultipartStream.



203
204
205
206
207
# File 'lib/chef/knife/core/cookbook_site_streaming_uploader.rb', line 203

def initialize(parts)
  @parts = parts
  @part_no = 0
  @part_offset = 0
end

Instance Method Details

#read(how_much, dst_buf = nil) ⇒ Object



213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/chef/knife/core/cookbook_site_streaming_uploader.rb', line 213

def read(how_much, dst_buf = nil)
  if @part_no >= @parts.size
    dst_buf.replace("") if dst_buf
    return dst_buf
  end

  how_much_current_part = @parts[@part_no].size - @part_offset

  how_much_current_part = [how_much_current_part, how_much].min

  how_much_next_part = how_much - how_much_current_part

  current_part = @parts[@part_no].read(@part_offset, how_much_current_part)

  # recurse into the next part if the current one was not large enough
  if how_much_next_part > 0
    @part_no += 1
    @part_offset = 0
    next_part = read(how_much_next_part)
    result = current_part + (next_part || "")
  else
    @part_offset += how_much_current_part
    result = current_part
  end
  dst_buf ? dst_buf.replace(result || "") : result
end

#sizeObject



209
210
211
# File 'lib/chef/knife/core/cookbook_site_streaming_uploader.rb', line 209

def size
  @parts.inject(0) { |size, part| size + part.size }
end