Class: SimpleTransfer::Sender

Inherits:
TCPSocket
  • Object
show all
Defined in:
lib/transfer.rb

Constant Summary collapse

@@chunk_size =
5000

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host, port, logging = false) ⇒ Sender

Returns a new instance of Sender.



129
130
131
132
# File 'lib/transfer.rb', line 129

def initialize(host, port, logging = false)
  super(host, port)
  @logging = logging
end

Class Method Details

.buffer(data) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
# File 'lib/transfer.rb', line 134

def self.buffer(data)
  buffers = Array.new
  data = String(data)
  buffer_amount = @@chunk_size > data.length ? 1 : data.length / @@chunk_size + 1

  for i in 0..buffer_amount - 1
    buffers.push data.slice(i * @@chunk_size, @@chunk_size)
  end

  return buffers
end

.pack(filename, data) ⇒ Object



146
147
148
149
150
151
152
# File 'lib/transfer.rb', line 146

def self.pack(filename, data)
  buffers = self.buffer(data)

  buffers.unshift filename
  buffers.unshift String(data.length)
  return buffers
end

Instance Method Details

#initiate_exchange(package) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
# File 'lib/transfer.rb', line 158

def initiate_exchange(package)
  send_chunk("SYNC NOW")
  log_transfer("sent start sign: SYNC NOW", level = "DEBUGGING") if @logging
  recv(1024)
  send_chunk(package.shift)
  log_transfer("sent data length", level = "DEBUGGING") if @logging
  recv(1024)
  send_chunk(package.shift)
  log_transfer("sent filename", level = "DEBUGGING") if @logging
  recv(1024)
end

#scan_directory(directory_name) ⇒ Object



182
183
184
# File 'lib/transfer.rb', line 182

def scan_directory(directory_name)
  return Dir["%s/**/*" % directory_name]
end

#send_chunk(chunk) ⇒ Object



154
155
156
# File 'lib/transfer.rb', line 154

def send_chunk(chunk)
  send(chunk, @@chunk_size)
end

#send_directory(directory) ⇒ Object



186
187
188
189
190
191
192
193
194
# File 'lib/transfer.rb', line 186

def send_directory(directory)
  scan_directory(directory).each do |f|
    #sleep because there is no sync for end of transfer
    sleep 0.5 
    if File.directory?(f)
      send_directory(f)
    else send_file(f)         end
  end
end

#send_file(filename) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
# File 'lib/transfer.rb', line 170

def send_file(filename)
  package = nil
  File.open(filename, "rb") do |f|
    log_transfer("sending #{f.path}") if @logging
    package = Sender.pack(filename, f.read())
  end
  initiate_exchange(package)
  package.each do |chunk|
    send_chunk(chunk)
  end
end