Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
 private void Tox_OnFileSendRequestReceived(object sender, ToxEventArgs.FileSendRequestEventArgs e)
 {
     if (e.FileKind == ToxFileKind.Avatar)
     {
         HandleAvatarTransfer(e);
     }
 }
Exemplo n.º 3
0
        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(); };
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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;
            };
        }
Exemplo n.º 6
0
 private void FileSendRequestReceivedHandler(object sender, ToxEventArgs.FileSendRequestEventArgs e)
 {
     FileSendRequestReceived?.Invoke(this, e);
 }
Exemplo n.º 7
0
        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());
        }
Exemplo n.º 8
0
 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");
 }
Exemplo n.º 9
0
 private void tox_OnFileSendRequest(object sender, ToxEventArgs.FileSendRequestEventArgs e)
 {
     _tox.FileSendControl(e.FriendNumber, 1, e.FileNumber, ToxFileControl.Accept, new byte[0]);
 }