public async Task SendFileAsync(string path) { if (!File.Exists(path)) { throw new Exception("File not found"); // TODO: CHANGE FOR CUSTOM IMPLEMENTATION } // Send file length var fileInfo = new FileInfo(path); await _networkCommunication.SendLongAsync(fileInfo.Length); // Send file chunks await using var fileStream = File.OpenRead(path); var sent = 0; var buffer = new byte[ProtocolSpecification.FileChunkSize]; while (fileInfo.Length - sent > ProtocolSpecification.FileChunkSize) { await fileStream.ReadAsync(buffer, 0, ProtocolSpecification.FileChunkSize); await _networkCommunication.SendBytesAsync(buffer); sent += ProtocolSpecification.FileChunkSize; } buffer = new byte[fileInfo.Length - sent]; await fileStream.ReadAsync(buffer, 0, (int)fileInfo.Length - sent); await _networkCommunication.SendBytesAsync(buffer); }
public async Task SendMessageAsync(Message msg) { await _networkCommunication.SendBytesAsync(new[] { (byte)msg.Type }); await _networkCommunication.SendShortAsync((short)msg.Id); switch (msg) { // Error case ErrorResponse errorResponse: var errorResponseHandler = new ErrorResponseHandler(_networkCommunication); await errorResponseHandler.SendMessageAsync(errorResponse); break; // Login case LoginRequest loginRequest: var loginRequestHandler = new LoginRequestHandler(_networkCommunication); await loginRequestHandler.SendMessageAsync(loginRequest); break; case LoginResponse loginResponse: var loginResponseHandler = new LoginResponseHandler(_networkCommunication); await loginResponseHandler.SendMessageAsync(loginResponse); break; // Create User case CreateUserRequest createUserRequest: var createUserRequestHandler = new CreateUserRequestHandler(_networkCommunication); await createUserRequestHandler.SendMessageAsync(createUserRequest); break; case CreateUserResponse createUserResponse: var createUserResponseHandler = new CreateUserResponseHandler(_networkCommunication); await createUserResponseHandler.SendMessageAsync(createUserResponse); break; // Create photo case CreatePhotoRequest createPhotoRequest: var createPhotoRequestHandler = new CreatePhotoRequestHandler( _networkCommunication, _fileCommunication ); await createPhotoRequestHandler.SendMessageAsync(createPhotoRequest); break; case CreatePhotoResponse createPhotoResponse: var createPhotoResponseHandler = new CreatePhotoResponseHandler(); await createPhotoResponseHandler.SendMessageAsync(createPhotoResponse); break; // Photo list case PhotoListRequest photoListRequest: var photoListRequestHandler = new PhotoListRequestHandler(_networkCommunication); await photoListRequestHandler.SendMessageAsync(photoListRequest); break; case PhotoListResponse photoListResponse: var photoListResponseHandler = new PhotoListResponseHandler( _networkCommunication, _fileCommunication ); await photoListResponseHandler.SendMessageAsync(photoListResponse); break; // User list case UserListRequest userListRequest: var userListRequestHandler = new UserListRequestHandler(); await userListRequestHandler.SendMessageAsync(userListRequest); break; case UserListResponse userListResponse: var userListResponseHandler = new UserListResponseHandler( _networkCommunication ); await userListResponseHandler.SendMessageAsync(userListResponse); break; // Comment photo case CommentPhotoRequest commentPhotoRequest: var commentPhotoRequestHandler = new CommentPhotoRequestHandler(_networkCommunication); await commentPhotoRequestHandler.SendMessageAsync(commentPhotoRequest); break; case CommentPhotoResponse commentPhotoResponse: var commentPhotoResponseHandler = new CommentPhotoResponseHandler( _networkCommunication ); await commentPhotoResponseHandler.SendMessageAsync(commentPhotoResponse); break; // Comment List case CommentListRequest commentListRequest: var commentListRequestHandler = new CommentListRequestHandler(_networkCommunication); await commentListRequestHandler.SendMessageAsync(commentListRequest); break; case CommentListResponse commentListResponse: var commentListResponseHandler = new CommentListResponseHandler( _networkCommunication ); await commentListResponseHandler.SendMessageAsync(commentListResponse); break; // Logout case LogoutRequest logoutRequest: var logoutRequestHandler = new LogoutRequestHandler(); await logoutRequestHandler.SendMessageAsync(logoutRequest); break; case LogoutResponse logoutResponse: var logoutResponseHandler = new LogoutResponseHandler(); await logoutResponseHandler.SendMessageAsync(logoutResponse); break; default: // TODO Create a custom exception throw new Exception($"Message not recognized ID={msg.Id}, type={msg.Type}"); } }