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.



138
139
140
141
# File 'lib/transfer.rb', line 138

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

Class Method Details

.buffer(data) ⇒ Object



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

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



155
156
157
158
159
160
161
# File 'lib/transfer.rb', line 155

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



167
168
169
170
171
172
173
174
175
176
177
# File 'lib/transfer.rb', line 167

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



191
192
193
# File 'lib/transfer.rb', line 191

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

#send_chunk(chunk) ⇒ Object



163
164
165
# File 'lib/transfer.rb', line 163

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

#send_directory(directory) ⇒ Object



195
196
197
198
199
200
201
# File 'lib/transfer.rb', line 195

def send_directory(directory)
  scan_directory(directory).each do |f|
    if File.directory?(f)
      send_directory(f)
    else send_file(f)         end
  end
end

#send_file(filename) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
# File 'lib/transfer.rb', line 179

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