@@ -90,6 +90,9 @@ type TrzszFilter struct {
90
90
tunnelConnector atomic.Pointer [func (int ) net.Conn ]
91
91
osc52Sequence * bytes.Buffer
92
92
progressColorPair atomic.Pointer [string ]
93
+ oneTimeUploadFiles []string
94
+ oneTimeUploadResult chan error
95
+ hidingCursor bool
93
96
}
94
97
95
98
// NewTrzszFilter create a TrzszFilter to support trzsz ( trz / tsz ).
@@ -166,6 +169,40 @@ func (filter *TrzszFilter) UploadFiles(filePaths []string) error {
166
169
return nil
167
170
}
168
171
172
+ // OneTimeUpload upload one time while the server is already running trz / rz.
173
+ func (filter * TrzszFilter ) OneTimeUpload (filePaths []string ) (<- chan error , error ) {
174
+ if len (filePaths ) == 0 {
175
+ return nil , fmt .Errorf ("nothing to upload" )
176
+ }
177
+ for _ , path := range filePaths {
178
+ info , err := os .Stat (path )
179
+ if err != nil {
180
+ return nil , err
181
+ }
182
+ if _ , err := checkPathsReadable ([]string {path }, info .IsDir ()); err != nil {
183
+ return nil , err
184
+ }
185
+ }
186
+ filter .oneTimeUploadFiles = filePaths
187
+ filter .oneTimeUploadResult = make (chan error , 1 )
188
+ go func () {
189
+ time .Sleep (10 * time .Second )
190
+ if filter .oneTimeUploadFiles != nil {
191
+ filter .oneTimeUploadResult <- fmt .Errorf (
192
+ "The upload did not start, possibly because trzsz is not installed or trz is not found on the server" )
193
+ }
194
+ }()
195
+ return filter .oneTimeUploadResult , nil
196
+ }
197
+
198
+ // ResetTerminal reset the terminal settings.
199
+ func (filter * TrzszFilter ) ResetTerminal () {
200
+ if filter .hidingCursor {
201
+ showCursor (filter .clientOut )
202
+ filter .hidingCursor = false
203
+ }
204
+ }
205
+
169
206
// SetDefaultUploadPath set the default open path while choosing upload files.
170
207
func (filter * TrzszFilter ) SetDefaultUploadPath (path string ) {
171
208
if path == "" {
@@ -315,6 +352,11 @@ func (filter *TrzszFilter) chooseDownloadPath() (string, error) {
315
352
}
316
353
317
354
func (filter * TrzszFilter ) chooseUploadPaths (directory bool ) ([]string , error ) {
355
+ if len (filter .oneTimeUploadFiles ) > 0 {
356
+ files := filter .oneTimeUploadFiles
357
+ filter .oneTimeUploadFiles = nil
358
+ return files , nil
359
+ }
318
360
if filter .dragging .Load () {
319
361
files := filter .resetDragFiles ()
320
362
return files , nil
@@ -465,8 +507,10 @@ func (filter *TrzszFilter) handleTrzsz() {
465
507
err = filter .downloadFiles (transfer )
466
508
case 'R' :
467
509
err = filter .uploadFiles (transfer , false )
510
+ filter .setOneTimeUploadResult (err )
468
511
case 'D' :
469
512
err = filter .uploadFiles (transfer , true )
513
+ filter .setOneTimeUploadResult (err )
470
514
}
471
515
if err != nil {
472
516
transfer .clientError (err )
@@ -481,6 +525,15 @@ func (filter *TrzszFilter) handleTrzsz() {
481
525
}
482
526
}
483
527
528
+ func (filter * TrzszFilter ) setOneTimeUploadResult (err error ) {
529
+ if filter .oneTimeUploadResult == nil {
530
+ return
531
+ }
532
+ filter .oneTimeUploadResult <- err
533
+ close (filter .oneTimeUploadResult )
534
+ filter .oneTimeUploadResult = nil
535
+ }
536
+
484
537
func (filter * TrzszFilter ) resetDragFiles () []string {
485
538
if ! filter .dragging .Load () {
486
539
return nil
@@ -742,6 +795,7 @@ func (filter *TrzszFilter) wrapOutput() {
742
795
continue
743
796
} else {
744
797
showCursor (filter .clientOut )
798
+ filter .hidingCursor = false
745
799
filter .zmodem .CompareAndSwap (zmodem , nil )
746
800
}
747
801
}
@@ -775,11 +829,20 @@ func (filter *TrzszFilter) wrapOutput() {
775
829
_ = writeAll (filter .clientOut , buf )
776
830
if filter .zmodem .CompareAndSwap (nil , zmodem ) {
777
831
hideCursor (filter .clientOut )
832
+ filter .hidingCursor = true
778
833
go zmodem .handleZmodemEvent (filter .logger , filter .serverIn , filter .clientOut ,
779
834
func () ([]string , error ) {
780
835
return filter .chooseUploadPaths (false )
781
836
},
782
837
filter .chooseDownloadPath )
838
+ if filter .oneTimeUploadResult != nil {
839
+ go func () {
840
+ for zmodem .isTransferringFiles () {
841
+ time .Sleep (100 * time .Millisecond )
842
+ }
843
+ filter .setOneTimeUploadResult (nil )
844
+ }()
845
+ }
783
846
continue
784
847
}
785
848
}
@@ -788,6 +851,7 @@ func (filter *TrzszFilter) wrapOutput() {
788
851
_ = writeAll (filter .clientOut , buf )
789
852
}
790
853
if err == io .EOF {
854
+ time .Sleep (100 * time .Millisecond )
791
855
continue // ignore output EOF
792
856
}
793
857
}
0 commit comments