def request_download(self, file_name, file_dest, blocking=False, callback=None, timeout=0, file_global=False): """ Request a C2D file transfer """ current_time = datetime.utcnow() end_time = current_time + timedelta(seconds=timeout) self.logger.info("Request download of %s", file_name) # is file_dest the full path or the parent directory? if os.path.isdir(file_dest): file_dest = os.path.join(file_dest, file_name) # File Transfer object for tracking progress transfer = defs.FileTransfer(file_name, file_dest, self.client, callback=callback) # Generate and send message to request file transfer command = tr50.create_file_get(self.config.key, file_name, file_global) message = defs.OutMessage(command, "Download {}".format(file_name), data=transfer) status = self.send(message) # If blocking is set, wait for result of file transfer if status == constants.STATUS_SUCCESS and blocking: while ((timeout == 0 or current_time < end_time) and transfer.status is None): sleep(0.1) current_time = datetime.utcnow() if transfer.status is None: status = constants.STATUS_TIMED_OUT else: status = transfer.status return status
def request_upload(self, file_path, upload_name=None, blocking=False, callback=None, timeout=0, file_global=False): """ Request a D2C file transfer """ status = constants.STATUS_SUCCESS current_time = datetime.utcnow() end_time = current_time + timedelta(seconds=timeout) transfer = None self.logger.info("Request upload of %s", file_path) # Path must be absolute if not os.path.isabs(file_path): self.logger.error("Path must be absolute \"%s\"", file_path) status = constants.STATUS_NOT_FOUND if status == constants.STATUS_SUCCESS: # Check if file exists if not os.path.isfile(file_path): # No file to upload self.logger.error("Cannot find file %s. " "Upload cancelled.", file_path) status = constants.STATUS_NOT_FOUND else: transfer = None file_name = os.path.basename(file_path) if not upload_name: upload_name = file_name # Get file crc32 checksum checksum = 0 with open(file_path, "rb") as up_file: for chunk in up_file: checksum = crc32(chunk, checksum) checksum = checksum & 0xffffffff # File Transfer object for tracking progress transfer = defs.FileTransfer(upload_name, file_path, self.client, callback=callback) # Generate and send message to request file transfer command = tr50.create_file_put(self.config.key, upload_name, crc32=checksum, file_global=file_global) message_desc = "Upload {} as {}".format(file_name, upload_name) message = defs.OutMessage(command, message_desc, data=transfer) status = self.send(message) # If blocking is set, wait for result of file transfer if status == constants.STATUS_SUCCESS and blocking: while ((timeout == 0 or current_time < end_time) and not self.to_quit and transfer.status is None): sleep(0.1) current_time = datetime.utcnow() if transfer.status is None: status = constants.STATUS_TIMED_OUT else: status = transfer.status return status