xtmjoin: Moved core code into library.
* Moved "joining" code to xtmfile/joiner.rb. * Restructured bin/xtmjoin code. * Added "-m" option for future md5sum verification. * Added an empty xtmfile/splitter.rb file.
This commit is contained in:
parent
53bb3fe39a
commit
d0cbc1a376
2 changed files with 89 additions and 0 deletions
89
xtmfile/joiner.rb
Normal file
89
xtmfile/joiner.rb
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
|
||||||
|
require 'xtmfile/header'
|
||||||
|
|
||||||
|
module XtmFile
|
||||||
|
|
||||||
|
class Joiner
|
||||||
|
|
||||||
|
attr_reader :header, :input_filename, :output_filename
|
||||||
|
|
||||||
|
# yield this event + filename when opening a new file
|
||||||
|
EVENT_OPENFILE = :file
|
||||||
|
# yield this event + percent on joining progress
|
||||||
|
EVENT_PROGRESS = :progress
|
||||||
|
|
||||||
|
BUFFER_MAX_SIZE = 4096 * 4096
|
||||||
|
|
||||||
|
def initialize input, output=nil
|
||||||
|
@input_filename = input
|
||||||
|
@output_filename = output
|
||||||
|
|
||||||
|
File.open @input_filename, "rb" do |in_xtm|
|
||||||
|
@header = Header::read in_xtm
|
||||||
|
end
|
||||||
|
if @output_filename.nil? then
|
||||||
|
@output_filename = @header.filename_str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def start &blk
|
||||||
|
in_xtm = File.open @input_filename, "rb"
|
||||||
|
in_xtm.seek @header.num_bytes, IO::SEEK_SET
|
||||||
|
|
||||||
|
yield EVENT_OPENFILE, @input_filename if block_given?
|
||||||
|
|
||||||
|
|
||||||
|
out_xtm = File.open @output_filename, "wb"
|
||||||
|
|
||||||
|
cur_xtm = @input_filename
|
||||||
|
is_first = true
|
||||||
|
cur_size = @header.filesize
|
||||||
|
print "\x1b[s"
|
||||||
|
while cur_size > 0 do
|
||||||
|
unless is_first then
|
||||||
|
cur_xtm = _nextfile cur_xtm
|
||||||
|
yield EVENT_OPENFILE, cur_xtm if block_given?
|
||||||
|
in_xtm = File.open cur_xtm, "rb"
|
||||||
|
end
|
||||||
|
while cur_size > 0 and (not in_xtm.eof?) do
|
||||||
|
pcent = (( @header.filesize - cur_size) * 100 / @header.filesize)
|
||||||
|
yield EVENT_PROGRESS, pcent if block_given?
|
||||||
|
|
||||||
|
read_size = if cur_size > BUFFER_MAX_SIZE then BUFFER_MAX_SIZE
|
||||||
|
else cur_size
|
||||||
|
end
|
||||||
|
buffer = in_xtm.read read_size
|
||||||
|
cur_size = cur_size - buffer.length
|
||||||
|
out_xtm.write buffer.slice(0, buffer.length)
|
||||||
|
end
|
||||||
|
is_first = false
|
||||||
|
in_xtm.close
|
||||||
|
end
|
||||||
|
out_xtm.close
|
||||||
|
|
||||||
|
# remaining files
|
||||||
|
end
|
||||||
|
|
||||||
|
def _nextfile curfile
|
||||||
|
result = nil
|
||||||
|
cur_idx = 0
|
||||||
|
cur_len = 0
|
||||||
|
case curfile
|
||||||
|
when /\.([0-9]+)\.xtm$/ then
|
||||||
|
cur_idx = $1.to_i
|
||||||
|
cur_len = $1.length
|
||||||
|
next_idx = cur_idx + 1
|
||||||
|
result = curfile.gsub(/\.([0-9]+)\.xtm$/, ".%0#{cur_len}d.xtm" % next_idx)
|
||||||
|
when /\.xtm\.([0-9]+)$/ then
|
||||||
|
cur_idx = $1.to_i
|
||||||
|
cur_len = $1.length
|
||||||
|
next_idx = cur_idx + 1
|
||||||
|
result = curfile.gsub(/\.xtm\.([0-9]+)$/, ".xtm.%0#{cur_len}d" % next_idx)
|
||||||
|
else
|
||||||
|
raise "Unable to detect a naming patterng for file sequence!"
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
0
xtmfile/splitter.rb
Normal file
0
xtmfile/splitter.rb
Normal file
Loading…
Reference in a new issue