More work on porting transfer kitten

This commit is contained in:
Kovid Goyal
2023-07-02 07:21:20 +05:30
parent 2e8479a77c
commit 38666f978b
3 changed files with 83 additions and 2 deletions

View File

@@ -817,9 +817,65 @@ func (self *SendHandler) on_file_transfer_response(ftc *FileTransmissionCommand)
self.send_file_metadata()
}
}
self.lp.CallSoon(self.loop_tick)
return nil
}
func (self *SendHandler) loop_tick(timer_id loop.IdType) (err error) {
if self.manager.state == SEND_WAITING_FOR_PERMISSION {
return
}
if self.transmit_started {
if err = self.transmit_next_chunk(); err != nil {
return err
}
if err = self.refresh_progress(timer_id); err != nil {
return err
}
} else {
return self.check_for_transmit_ok()
}
return
}
func (self *SendHandler) check_for_transmit_ok() (err error) {
if self.transmit_ok_checked {
return self.start_transfer()
}
if self.manager.state != SEND_PERMISSION_GRANTED {
return
}
if self.opts.ConfirmPaths {
if self.manager.all_started {
self.print_check_paths()
}
return
}
self.transmit_ok_checked = true
self.start_transfer()
return
}
func (self *SendHandler) print_check_paths() {
if self.check_paths_printed {
return
}
self.check_paths_printed = true
self.lp.Println(`The following file transfers will be performed. A red destination means an existing file will be overwritten.`)
for _, df := range self.manager.files {
fn := df.remote_final_path
if df.remote_initial_size > -1 {
fn = self.ctx.Red(fn)
}
self.lp.Println(
self.ctx.Prettify(fmt.Sprintf(":%s:`%s`", df.file_type.Color(), df.file_type.ShortText())),
df.display_name, '→', fn)
}
self.lp.Println(fmt.Sprintf(`Transferring %d files of total size: %s`,
len(self.manager.files), humanize.Size(self.manager.progress_tracker.total_bytes_to_transfer)))
self.print_continue_msg()
}
func (self *SendManager) activate_next_ready_file() *File {
if self.active_idx > -1 && self.active_idx < len(self.files) {
self.files[self.active_idx].transmit_ended_at = time.Now()
@@ -1050,6 +1106,22 @@ func (self *SendHandler) on_key_event(ev *loop.KeyEvent) error {
return nil
}
func (self *SendHandler) on_writing_finished(msg_id loop.IdType) (err error) {
chunk_transmitted := self.manager.current_chunk_uncompressed_sz >= 0
if chunk_transmitted {
self.manager.progress_tracker.on_transmit(self.manager.current_chunk_uncompressed_sz)
self.manager.current_chunk_uncompressed_sz = -1
}
if self.quit_after_write_code > -1 {
self.lp.Quit(self.quit_after_write_code)
return
}
if self.manager.state == SEND_PERMISSION_GRANTED && (!self.transmit_started || chunk_transmitted) {
self.lp.CallSoon(self.loop_tick)
}
return
}
func (self *SendHandler) on_interrupt() {
if self.quit_after_write_code > -1 {
return
@@ -1105,6 +1177,7 @@ func send_loop(opts *Options, files []*File) (err error, rc int) {
lp.OnText = handler.on_text
lp.OnKeyEvent = handler.on_key_event
lp.OnResize = handler.on_resize
lp.OnWriteComplete = handler.on_writing_finished
err = lp.Run()
if err != nil {

View File

@@ -19,8 +19,8 @@ var _ = fmt.Print
type Context struct {
fmt_ctx style.Context
Cyan, Green, Blue, BrightRed, Yellow, Italic, Bold, Dim, Title, Exe, Opt, Emph, Err, Code func(args ...interface{}) string
Url func(string, string) string
Cyan, Green, Blue, Magenta, Red, BrightRed, Yellow, Italic, Bold, Dim, Title, Exe, Opt, Emph, Err, Code func(args ...interface{}) string
Url func(string, string) string
}
var (
@@ -33,6 +33,8 @@ func New(allow_escape_codes bool) *Context {
fmt_ctx := &ans.fmt_ctx
ans.Cyan = fmt_ctx.SprintFunc("fg=bright-cyan")
ans.Red = fmt_ctx.SprintFunc("fg=red")
ans.Magenta = fmt_ctx.SprintFunc("fg=magenta")
ans.Green = fmt_ctx.SprintFunc("fg=green")
ans.Blue = fmt_ctx.SprintFunc("fg=blue")
ans.BrightRed = fmt_ctx.SprintFunc("fg=bright-red")
@@ -183,6 +185,8 @@ func (self *Context) Prettify(text string) string {
return self.Green(val)
case "cyan":
return self.Cyan(val)
case "magenta":
return self.Magenta(val)
case "emph":
return self.Italic(val)
default:

View File

@@ -112,6 +112,10 @@ func (self *Loop) AddTimer(interval time.Duration, repeats bool, callback TimerC
return self.add_timer(interval, repeats, callback)
}
func (self *Loop) CallSoon(callback TimerCallback) (IdType, error) {
return self.add_timer(0, false, callback)
}
func (self *Loop) RemoveTimer(id IdType) bool {
return self.remove_timer(id)
}