class Archive::Writer
Public Class Methods
new(params = {})
click to toggle source
Calls superclass method
Archive::BaseArchive::new
# File lib/ffi-libarchive/writer.rb, line 34 def initialize(params = {}) super C.method(:archive_write_new), C.method(:archive_write_finish) compression = params[:compression] case compression when Symbol compression = Archive.const_get("COMPRESSION_#{compression.to_s.upcase}".to_sym) end format = params[:format] case format when Symbol format = Archive.const_get("FORMAT_#{format.to_s.upcase}".to_sym) end raise Error, @archive if C.archive_write_set_compression(archive, compression) != C::OK raise Error, @archive if C.archive_write_set_format(archive, format) != C::OK if params[:file_name] raise Error, @archive if C.archive_write_open_filename(archive, params[:file_name]) != C::OK elsif params[:memory] if C.archive_write_get_bytes_in_last_block(@archive) == -1 C.archive_write_set_bytes_in_last_block(archive, 1) end @data = write_callback params[:memory] raise Error, @archive if C.archive_write_open(archive, nil, nil, @data, nil) != C::OK end rescue close raise end
open_filename(file_name, compression, format) { |writer| ... }
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 5 def self.open_filename(file_name, compression, format) if block_given? writer = open_filename file_name, compression, format begin yield writer ensure writer.close end else new file_name: file_name, compression: compression, format: format end end
open_memory(string, compression, format) { |writer| ... }
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 18 def self.open_memory(string, compression, format) if block_given? writer = open_memory string, compression, format begin yield writer ensure writer.close end else if compression.is_a? String compression = -1 end new memory: string, compression: compression, format: format end end
Private Class Methods
new(alloc, free)
click to toggle source
# File lib/ffi-libarchive/archive.rb, line 322 def initialize(alloc, free) @archive = nil @archive_free = nil @archive = alloc.call @archive_free = [nil] raise Error, @archive unless @archive @archive_free[0] = free ObjectSpace.define_finalizer(self, BaseArchive.finalizer(@archive, @archive_free)) end
Public Instance Methods
add_entry() { |entry| ... }
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 92 def add_entry raise ArgumentError, "No block given" unless block_given? entry = Entry.new data = yield entry if data entry.size = data.bytesize write_header entry write_data data else write_header entry end nil ensure entry.close end
new_entry() { |entry| ... }
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 78 def new_entry entry = Entry.new if block_given? begin result = yield entry ensure entry.close end result else entry end end
write_data(*args) { || ... }
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 109 def write_data(*args) if block_given? raise ArgumentError, "wrong number of argument (#{args.size} for 0)" if args.size > 0 ar = archive len = 0 loop do str = yield if (n = C.archive_write_data(ar, str, str.bytesize)) < 1 return len end len += n end else raise ArgumentError, "wrong number of argument (#{args.size}) for 1)" if args.size != 1 str = args[0] C.archive_write_data(archive, str, str.bytesize) end end
write_header(entry)
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 131 def write_header(entry) raise Error, @archive if C.archive_write_header(archive, entry.entry) != C::OK end
Private Instance Methods
write_callback(data)
click to toggle source
# File lib/ffi-libarchive/writer.rb, line 70 def write_callback(data) proc do |_ar, _client, buffer, length| data.concat buffer.get_bytes(0, length) length end end