示例#1
0
        private async Task <ServerResponse> FinishSession(Stream networkStream, Guid sessionId)
        {
            var cmdDataBytes = Serializer.Serialize(sessionId);

            await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.FinishSessionCmd, cmdDataBytes.Length);

            await NetworkHelperSequential.WriteBytes(networkStream, cmdDataBytes);

            var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream);

            if (cmdHeader.Command != Commands.FinishSessionCmd)
            {
                return new ServerResponseWithData <SyncInfo> {
                           ErrorMsg = "Wrong command received"
                }
            }
            ;

            if (cmdHeader.PayloadLength == 0)
            {
                return new ServerResponseWithData <SyncInfo> {
                           ErrorMsg = "No data received"
                }
            }
            ;

            var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength);

            var response = Serializer.Deserialize <ServerResponse>(responseBytes);

            return(response);
        }
示例#2
0
        private async Task <ServerResponseWithData <Guid> > GetSession(Stream networkStream)
        {
            await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetSessionCmd);

            var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream);

            if (cmdHeader.Command != Commands.GetSessionCmd)
            {
                return(new ServerResponseWithData <Guid> {
                    ErrorMsg = "Wrong command received"
                });
            }

            if (cmdHeader.PayloadLength == 0)
            {
                return(new ServerResponseWithData <Guid> {
                    ErrorMsg = "No data received"
                });
            }

            var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength);

            var response = Serializer.Deserialize <ServerResponseWithData <Guid> >(responseBytes);

            return(response);
        }
示例#3
0
        private async Task ProcessCommands()
        {
            try
            {
                var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(_networkStream);

                switch (cmdHeader.Command)
                {
                case Commands.GetSessionCmd:
                    await ProcessGetSessionCmd();

                    break;

                case Commands.GetSyncListCmd:
                    await ProcessGetSyncListCmd(cmdHeader);

                    break;

                case Commands.GetFileCmd:
                    await ProcessGetFileCmd(cmdHeader);

                    break;

                case Commands.SendFileCmd:
                    await ProcessSendFileCmd(cmdHeader);

                    break;

                case Commands.FinishSessionCmd:
                    await ProcessFinishSessionCmd(cmdHeader);

                    break;

                case Commands.DisconnectCmd:
                    _connected = false;
                    break;

                default:
                    _connected = false;
                    break;
                }
            }
            catch (Exception e)
            {
                if (_connected)
                {
                    Debugger.Break();

                    _connected = false;

                    Console.WriteLine($"Unexpected error:\r\n{e}");
                }
                else
                {
                    // client disconnected
                    Console.WriteLine("Unexpected error but client already disconnected, ignoring...");
                }
            }
        }
示例#4
0
        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);
        }
示例#5
0
        private async Task <ServerResponseWithData <SyncInfo> > GetSyncList(Stream networkStream, Guid sessionId, List <SyncFileInfo> syncDbFiles)
        {
            var cmdData = new GetSyncListCommandData
            {
                SessionId = sessionId,
                Files     = syncDbFiles,
            };

            var cmdDataBytes = Serializer.Serialize(cmdData);

            await NetworkHelperSequential.WriteCommandHeader(networkStream, Commands.GetSyncListCmd, cmdDataBytes.Length);

            await NetworkHelperSequential.WriteBytes(networkStream, cmdDataBytes);

            var cmdHeader = await NetworkHelperSequential.ReadCommandHeader(networkStream);

            if (cmdHeader.Command != Commands.GetSyncListCmd)
            {
                return new ServerResponseWithData <SyncInfo> {
                           ErrorMsg = "Wrong command received"
                }
            }
            ;

            if (cmdHeader.PayloadLength == 0)
            {
                return new ServerResponseWithData <SyncInfo> {
                           ErrorMsg = "No data received"
                }
            }
            ;

            var responseBytes = await NetworkHelperSequential.ReadBytes(networkStream, cmdHeader.PayloadLength);

            var response = Serializer.Deserialize <ServerResponseWithData <SyncInfo> >(responseBytes);

            return(response);
        }