Skip to content

Instantly share code, notes, and snippets.

@scalone
Created March 31, 2016 00:25
Show Gist options
  • Save scalone/9e7ddee98432f89a042bc1ec62ea2a20 to your computer and use it in GitHub Desktop.
Save scalone/9e7ddee98432f89a042bc1ec62ea2a20 to your computer and use it in GitHub Desktop.
class Device
class Transaction
class Download
def perform(socket_proc, company_name, remote_path, filepath, current_app, logical_number, file_crc = nil, socket_call = true)
if socket_call
@socket, @buffer, @request, @first_packet = socket_proc.call, "", "", ""
else
@socket, @buffer, @request, @first_packet = socket_proc, "", "", ""
end
@crc = file_crc ? file_crc : generate_crc(filepath)
key = "#{company_name}_#{remote_path}"
ei_encode_version # version
ei_encode_list_header(3) # mapreduce with 3 tuples
ei_encode_tuple_header(2) # tuple 1 inputs
ei_encode_atom("inputs") # atom inputs
ei_encode_list_header(1) # list inputs
ei_encode_tuple_header(2) # tuple contendo 2 elementos binarios, bucket and key
ei_encode_binary("assets") # elemento binario bucket
ei_encode_binary(key) # elemento binario key
ei_encode_list_header(0) # fim da list do inputs
ei_encode_tuple_header(2) # tuple 2: query
ei_encode_atom("query") # atom query
ei_encode_list_header(1) # list da query
ei_encode_tuple_header(4) # tuple contendo 4 elementos, { map, {modfun,Module,Function}, args, true }
ei_encode_atom("map") # primeiro elemento, atom type
ei_encode_tuple_header(3) # segundo elemento, nova tuple contendo 3 atoms
ei_encode_atom("modfun") # primeiro atom do segundo elemento, modfun
ei_encode_atom("walk") # segundo atom do segundo elemento, Module
ei_encode_atom("get_asset") # terceiro atom do segundo elemento, Function
ei_encode_list_header(7) # terceiro elemento, uma list com parametros do walk
ei_encode_binary(@serial) # elemento binario serialterminal
ei_encode_binary(@version) # elemento binario versao walk
ei_encode_binary(remote_path) # elemento binario nomeaplicativo
ei_encode_binary(@crc) # elemento binario crc aplicativo
ei_encode_binary("") # elemento binario buffer do posxml
ei_encode_binary(logical_number) # elemento binario numero do terminal
ei_encode_binary(current_app) # elemento binario nome do aplicativo que esta sendo executado
ei_encode_list_header(0) # fim da list com parametros do walk
ei_encode_atom("true") # quarto elemento, atom true
ei_encode_list_header(0) # fim da list da query
ei_encode_tuple_header(2) # tuple 3: timeout
ei_encode_atom("timeout") # atom timeout
ei_encode_long(5000) # integer timeout
ei_encode_list_header(0) # fim da list do mapreduce contendo 3 tuples
mount_request # add request to protocol buffers message
return COMMUNICATION_ERROR unless @socket
# Send Request
socket.write(@request)
return COMMUNICATION_ERROR if (response_size = get_response_size(socket.read(4))) <= 0
return MAPREDUCE_RESPONSE_ERROR unless @first_packet = get_binary_term_beginning(response_size)
return_code = @first_packet[7].to_s.unpack("C*").first
file_size = @first_packet[9..12].to_s.unpack("N*").first
if return_code != FILE_NOT_CHANGE
return IO_ERROR if (partial_download_to_store(filepath, response_size, file_size) < 0)
end
# receive 6A
@socket.read(1) if response_size > 1024
if socket_call
@socket.close unless @socket.closed?
end
return_code
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment