public Tasker.Conclusion SyncRemoteGamesShell(Tasker tasker, Object syncObject = null) { // transfer games tasker.SetProgress(0, 100, Tasker.State.Running, Resources.UploadingGames); bool uploadSuccessful = false; if (!transferGameSet.Any()) { Trace.WriteLine("No file to upload"); uploadSuccessful = true; } else { Trace.WriteLine("Uploading through tar file"); using (var gamesTar = new TarStream(transferGameSet, ".")) { Trace.WriteLine($"Upload size: " + Shared.SizeSuffix(gamesTar.Length)); if (gamesTar.Length > 0) { DateTime startTime = DateTime.Now, lastTime = DateTime.Now; bool done = false; gamesTar.OnAdvancedReadProgress += delegate(long pos, long len, string filename) { if (done) { return; } if (DateTime.Now.Subtract(lastTime).TotalMilliseconds >= UpdateFreq) { transferForm.SetAdvancedProgress(pos, len, filename); lastTime = DateTime.Now; } }; hakchi.Shell.Execute($"tar -xvC \"{uploadPath}\"", gamesTar, null, null, 0, true); Trace.WriteLine("Uploaded " + (int)(gamesTar.Length / 1024) + "kb in " + DateTime.Now.Subtract(startTime).TotalSeconds + " seconds"); uploadSuccessful = true; done = true; #if VERY_DEBUG File.Delete(Program.BaseDirectoryExternal + "\\DebugSyncOutput.tar"); gamesTar.Position = 0; gamesTar.CopyTo(File.OpenWrite(Program.BaseDirectoryExternal + "\\DebugSyncOutput.tar")); #endif } transferForm.SetAdvancedProgress(gamesTar.Length, gamesTar.Length, ""); } } // don't continue if upload wasn't successful if (!uploadSuccessful) { Trace.WriteLine("Something happened during transfer, cancelling"); return(Tasker.Conclusion.Error); } return(Tasker.Conclusion.Success); }