def add_rl_save_state_data(uuid): rl_starts_b64 = request.form.get('rl_starts') rl_lengths_b64 = request.form.get('rl_lengths') rl_total_length = int(request.form.get('rl_total_length')) rl_lengths_length = int(request.form.get('rl_lengths_length')) rl_starts_length = int(request.form.get('rl_starts_length')) rl_starts_b_array = bytearray(base64.b64decode(rl_starts_b64)) rl_lengths_b_array = bytearray(base64.b64decode(rl_lengths_b64)) if len(rl_starts_b_array) != rl_starts_length: rl_starts_b_array.extend([0 for _ in range(len(rl_starts_b_array), rl_starts_length)]) if len(rl_lengths_b_array) != rl_lengths_length: rl_lengths_b_array.extend([0 for _ in range(len(rl_lengths_b_array), rl_lengths_length)]) rl_start_hash, file_name = save_byte_array_to_store(rl_starts_b_array, file_name=uuid) rl_lengths_hash, file_name = save_byte_array_to_store(rl_lengths_b_array, file_name=uuid) dbm.update_table(dbm.GAME_SAVE_TABLE, ['rl_starts_data','rl_lengths_data','rl_total_length','compressed'], [rl_start_hash, rl_lengths_hash, rl_total_length, True], ['uuid'], [uuid]) return jsonify({'record': dbm.retrieve_save_state(uuid=uuid)[0]})
def add_save_state_data(uuid): save_state_data = request.form.get('buffer') compressed = True if request.form.get('compressed') == u'true' else False data_length = int(request.form.get('data_length')) save_state_b_array = bytearray(base64.b64decode(save_state_data)) # The base64 library will interpret trailing zeros as padding and remove them, this adds them back in if len(save_state_b_array) != data_length: save_state_b_array.extend([0 for _ in range(len(save_state_b_array), data_length)]) source_data_hash, file_name = save_byte_array_to_store(save_state_b_array, file_name=uuid) dbm.update_table(dbm.GAME_SAVE_TABLE, ['save_state_source_data', 'compressed'], [source_data_hash, compressed], ['uuid'], [uuid]) return jsonify({'record': dbm.retrieve_save_state(uuid=uuid)[0]})
def add_extra_file(uuid): extra_file_b64 = request.form.get('extra_file_data') sha1_hash = request.form.get('sha1_hash') data_length = int(request.form.get('data_length')) file_name = request.form.get('file_name') rel_file_path = request.form.get('rel_file_path') is_executable = request.form.get('is_executable') main_executable = request.form.get('main_executable') decoded_b64 = base64.b64decode(extra_file_b64) extra_b_array = bytearray(decoded_b64) main_executable = True if main_executable == 'true' else False is_executable = True if is_executable == 'true' else False if len(extra_b_array) != data_length: extra_b_array.extend([0 for _ in range(len(extra_b_array), data_length)]) hash_check = get_byte_array_hash(extra_b_array) if hash_check != sha1_hash: print "{} hash: {} not equal to client hash: {}".format(file_name, hash_check, sha1_hash) # If file with current hash and path already exists, add a new record for save state but # do not create a duplicate file file_id = dbm.check_for_existing_file(rel_file_path, hash_check) if file_id: dbm.link_existing_file_to_save_state(uuid, file_id) print "File {}:{} found.".format(file_name, rel_file_path) else: print "File {}:{} created.".format(file_name, rel_file_path) source_data_hash, file_name = save_byte_array_to_store(extra_b_array, file_name=file_name, store_path=LOCAL_GAME_DATA_STORE) fields = OrderedDict( game_uuid=None, save_state_uuid=uuid, is_executable=is_executable, main_executable=main_executable, file_path=rel_file_path, source_data=source_data_hash ) state_ref = dbm.retrieve_save_state(uuid=uuid)[0] fields['game_uuid'] = state_ref['game_uuid'] dbm.add_to_file_path_table(**fields) file_path = dbm.retrieve_file_path(save_state_uuid=uuid, file_path=rel_file_path)[0] return jsonify(file_path)