private async Task <bool> ReceiveFiles(Stream networkStream, IEnumerable <SyncFileInfo> dataToDownload, SyncDatabase syncDb) { foreach (var fileInfo in dataToDownload) { var data = new GetFileCommandData { SessionId = _sessionId, RelativeFilePath = fileInfo.RelativePath, }; var dataBytes = Serializer.Serialize(data); await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetFileCmd, dataBytes.Length); await NetworkHelperSequential.WriteBytes(networkStream, dataBytes); var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream); if (cmdHeader.Command != Commands.GetFileCmd) { return(false); } if (cmdHeader.PayloadLength == 0) { return(false); } var fileLengthBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength); var fileLength = BitConverter.ToInt64(fileLengthBytes, 0); var tmpFilePath = Path.Combine(_newDir, fileInfo.RelativePath); var newHash = await NetworkHelperSequential.ReadToFileAndHashAsync(networkStream, tmpFilePath, (int)fileLength); if (!string.Equals(newHash.ToHashString(), fileInfo.HashStr, StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("File copy error: hash mismatch"); } _sessionFileHelper.AddNew(fileInfo.RelativePath); var fi = syncDb.Files.FirstOrDefault(x => x.RelativePath == fileInfo.RelativePath); if (fi == null) { fi = new SyncFileInfo { RelativePath = fileInfo.RelativePath, }; syncDb.Files.Add(fi); } fi.HashStr = newHash.ToHashString(); fi.State = SyncFileState.NotChanged; } return(true); }
private async Task ProcessSendFileCmd(CommandHeader cmdHeader) { var data = await NetworkHelperSequential.Read <SendFileCommandData>(_networkStream, cmdHeader.PayloadLength); var ret = new ServerResponse(); var session = SessionStorage.Instance.GetSession(data.SessionId); if (session == null) { ret.ErrorMsg = "Session does not exist"; } else if (session.Expired) { ret.ErrorMsg = "Session has expired"; Msg?.Invoke("Session has expired"); } else { data.RelativeFilePath = PathHelpers.NormalizeRelative(data.RelativeFilePath); var filePath = Path.Combine(session.NewDir, data.RelativeFilePath); var fileDir = Path.GetDirectoryName(filePath); PathHelpers.EnsureDirExists(fileDir); Msg?.Invoke($"Receiving file '{data.RelativeFilePath}'"); var newHash = await NetworkHelperSequential.ReadToFileAndHashAsync(_networkStream, filePath, data.FileLength); var fileInfo = session.SyncDb.Files.FirstOrDefault(i => i.RelativePath == data.RelativeFilePath); if (fileInfo != null) { fileInfo.HashStr = newHash.ToHashString(); fileInfo.State = SyncFileState.NotChanged; } else { session.SyncDb.AddFile(session.BaseDir, data.RelativeFilePath, newHash.ToHashString()); } } }