private async void FileSendRequestReceivedHandler(object sender, ToxEventArgs.FileSendRequestEventArgs e) { if (e.FileKind != ToxFileKind.Avatar) { return; } if (e.FileSize == 0) // It means the avatar of the friend is removed. { SendCancelControl(e.FriendNumber, e.FileNumber); _avatarManager.RemoveFriendAvatar(e.FriendNumber); return; } if (await AlreadyHaveAvatar(e.FriendNumber, e.FileNumber)) { SendCancelControl(e.FriendNumber, e.FileNumber); return; } RemoveAllTranfersOfFriendPerDirection(e.FriendNumber, TransferDirection.Down); var resumeSent = SendResumeControl(e.FriendNumber, e.FileNumber); if (resumeSent) { var stream = new MemoryStream((int)e.FileSize); AddTransfer(e.FriendNumber, e.FileNumber, stream, e.FileSize, TransferDirection.Down); } }
private void Tox_OnFileSendRequestReceived(object sender, ToxEventArgs.FileSendRequestEventArgs e) { if (e.FileKind == ToxFileKind.Avatar) { HandleAvatarTransfer(e); } }
public IncomingFileTransfer(ToxEventArgs.FileSendRequestEventArgs e, Tox tox, string savepath) { Tox = tox; ViewModel.SavePath = savepath; ViewModel.ID = e.FileNumber; ViewModel.Sender = e.FriendNumber; ViewModel.TotalBytes = e.FileSize; try { FileStream = new FileStream(ViewModel.SavePath, FileMode.Create); } catch { Dispose(); } Tox.FileControl(ViewModel.Sender, ViewModel.ID, ToxFileControl.Resume); Tox.OnFileChunkReceived += Tox_OnFileChunkReceived; Tox.OnFileControlReceived += Tox_OnFileControlReceived; OnComplete += (v) => { Dispose(); }; }
private async void FileSendRequestReceivedHandler(object sender, ToxEventArgs.FileSendRequestEventArgs e) { if (e.FileKind != ToxFileKind.Data || e.FriendNumber != _friendNumber) { return; } var fileId = _toxModel.FileGetId(e.FriendNumber, e.FileNumber); var resumeData = await _fileTransferResumer.GetDownloadData(fileId); OneFileTransferModel oneFileTransferModel; // If we could find the resume data for this download, we resume it instead of handling it as a new transfer. if (resumeData != null) { oneFileTransferModel = await OneBrokenFileTransferModel.CreateInstance(_dataService, e.FriendNumber, e.FileNumber, resumeData.File.Name, e.FileSize, TransferDirection.Down, resumeData.File, resumeData.TransferredBytes); } else { // We add a transfer with a null value instead of an actual stream here. We will replace it with an actual file stream // in OneFileTransferModel.AcceptTransfer() when the user accepts the request and chooses a location to save the file to. oneFileTransferModel = await OneFileTransferModel.CreateInstance(_dataService, e.FriendNumber, e.FileNumber, e.FileName, e.FileSize, TransferDirection.Down, null); } FileTransferAdded?.Invoke(this, oneFileTransferModel); }
private void HandleAvatarTransfer(ToxEventArgs.FileSendRequestEventArgs e) { var ID = Tox.GetFriendPublicKey(e.FriendNumber).ToString(); string path = Utilities.GetAvatarPath(e.FriendNumber, Tox); IncomingFileTransfer ft = new IncomingFileTransfer(e, Tox, path); ft.OnComplete += (vm) => { GetContactViewModelByFriendNumber(e.FriendNumber).Image = path; }; }
private void FileSendRequestReceivedHandler(object sender, ToxEventArgs.FileSendRequestEventArgs e) { FileSendRequestReceived?.Invoke(this, e); }
private void Tox_OnFileSendRequestReceived(object sender, ToxEventArgs.FileSendRequestEventArgs e) { var transfer = new FileTransfer(e.FileNumber, e.FriendNumber, e.FileKind, FileTransferDirection.Incoming); transfer.Name = e.FileName; transfer.Size = e.FileSize; switch (e.FileKind) { case ToxFileKind.Avatar: { if (e.FileSize == 0) { //friend removed avatar, remove it from our store too ProfileManager.Instance.AvatarManager.RemoveAvatar(e.FriendNumber); _tox.FileControl(e.FriendNumber, e.FileNumber, ToxFileControl.Cancel); Debugging.Write("Friend removed avatar"); break; } if (e.FileSize > 1 << 16) { //we don't like this avatar, it's too big _tox.FileControl(e.FriendNumber, e.FileNumber, ToxFileControl.Cancel); Debugging.Write("Avatar too big, ignoring"); break; } if (ProfileManager.Instance.AvatarManager.Contains(e.FriendNumber)) { //compare hashes to see if we already have this avatar byte[] hash = _tox.FileGetId(e.FriendNumber, e.FileNumber); if (hash != null && ProfileManager.Instance.AvatarManager.HashMatches(e.FriendNumber, hash)) { //we already have this avatar, cancel the transfer _tox.FileControl(e.FriendNumber, e.FileNumber, ToxFileControl.Cancel); break; } } var error = ToxErrorFileControl.Ok; if (!_tox.FileControl(e.FriendNumber, e.FileNumber, ToxFileControl.Resume, out error)) { Debugging.Write("Failed to accept avatar transfer request: " + error); break; } var avatarPath = ProfileManager.Instance.AvatarManager.GetAvatarFilename(e.FriendNumber); if (avatarPath == null) { Debugging.Write("Could not find public key for friend"); break; } if (!_transfers.ContainsKey(transfer)) { //catch any scary exceptions (no access, file already in use and whatnot) try { _transfers.Add(transfer, new FileStream(avatarPath, FileMode.Create)); } catch (Exception ex) { Debugging.Write("Can't open filestream: " + ex.ToString()); } } else { Debugging.Write("We already have a transfer with that number!"); } break; } case ToxFileKind.Data: { if (!_transfers.ContainsKey(transfer)) { _transfers.Add(transfer, null); } else { Debugging.Write("We already have a transfer with that number!"); return; } MainWindow.Instance.UInvoke(() => { var friend = MainWindow.Instance.ViewModel.CurrentFriendListView.FindFriend(e.FriendNumber); if (friend == null) { return; } (friend.ConversationView as ConversationViewModel).AddTransfer(transfer); }); break; } } Debugging.Write("New file send request: " + e.FileKind.ToString()); }
private void OnToxFileSendRequestReceived(object sender, ToxEventArgs.FileSendRequestEventArgs e) { this.Tox.FileControl(e.FriendNumber, e.FileNumber, ToxFileControl.Cancel); Logger.Log(LogLevel.Warning, "ToxFileSendRequestReceived not supported, request canceled"); }
private void tox_OnFileSendRequest(object sender, ToxEventArgs.FileSendRequestEventArgs e) { _tox.FileSendControl(e.FriendNumber, 1, e.FileNumber, ToxFileControl.Accept, new byte[0]); }