internal static bool TryCreate(FileDescriptor file, out FileModificationDescriptor modification)
        {
            try
            {
                modification = new FileModificationDescriptor(file, FileModificationMode.New);

                return true;
            }
            catch (Exception e)
            {
                modification = null;

                return false;
            }
        }
        private void AddModification(BitTunnelServerProtocol protocol, FileModificationDescriptor modification)
        {
            if (InvokeRequired)
            {
                Invoke((MethodInvoker)delegate
                {
                    AddModification(protocol, modification);
                });
            }
            else
            {
                FileDescriptor descriptor = modification.ToFileDescriptor();

                ListViewItem item = GetListViewItem(descriptor.Hash);
                string client = "";

                if (item == null)
                {
                    item = new ListViewItem(new string[]{
                        descriptor.FileName,
                        "",
                        string.Format("{0} kb", Math.Round((double)descriptor.Size / 1024, 2)),
                        modification.Hash
                    });

                    item.Tag = new List<FileDescriptor>();

                    _availableFilesView.Items.Add(item);

                    client = protocol.ClientDetails.PublicName;

                    item.ImageIndex = 0;
                }

                (item.Tag as List<FileDescriptor>).Add(descriptor);
                SetClientText(item);
            }
        }
        public void WhenFileModificationDescriptorIsCreatedForNonExistingFile_NoHashGenerated_ExistsPropertyShouldBeFalse()
        {
            FileDescriptor descriptor = FileDescriptor.Create(@"C:\NothingToSeeHere.txt", false);

            FileModificationDescriptor modification = new FileModificationDescriptor(descriptor, FileModificationMode.New);

            Assert.IsNull(descriptor.Hash);
        }
        public void WhenFileModificationDescriptorIsCreatedForNonExistingFile_FileHashShouldBeNull()
        {
            FileDescriptor descriptor = FileDescriptor.Create(@"C:\NothingToSeeHere.txt", true);
            FileModificationDescriptor modification = new FileModificationDescriptor(descriptor, FileModificationMode.Remove);

            Assert.IsNull(modification.Hash);
        }
        public void WhenFileModificationDescriptorIsCreatedForExistingFile_FileDescriptorParameter_ExistsPropertyShouldNotBeFalse()
        {
            FileDescriptor descriptor = FileDescriptor.Create(_existingFile1.FullName, true);

            FileModificationDescriptor modification = new FileModificationDescriptor(descriptor, FileModificationMode.New);

            Assert.IsNotNull(descriptor.Hash);
        }
        public void WhenFileModificationDescriptorIsCreatedForExistingFile_FileDescriptorParameterWithoutHash_FileHashShouldBeNull()
        {
            FileDescriptor descriptor = FileDescriptor.Create(_existingFile3.FullName, false);

            FileModificationDescriptor modification = new FileModificationDescriptor(descriptor, FileModificationMode.New);

            Assert.IsNull(descriptor.Hash);
        }
 public FileModificationCancelEventArgs(FileModificationDescriptor file)
 {
     File = file;
 }
        private void SetupFileCancelArgs(FileModificationDescriptor file)
        {
            //Assume it has been newed up in ctor
            _fileCancelArgs.File = file;

            _fileCancelArgs.Cancel = false;
        }
 private void ReplaceFile(FileModificationDescriptor modification)
 {
     RemoveFile(modification);
     AddNewFile(modification);
 }
        private void RemoveFile(FileModificationDescriptor file)
        {
            if (IgnoreEmptyHashedFile(file)) return;

            if (FileRemoving != null)
            {
                SetupFileCancelArgs(file);

                FileRemoving(this, _fileCancelArgs);

                if (_fileCancelArgs.Cancel) return;
            }

            if (!_files.ContainsKey(file.Hash)) return;

            if (_uniqueHash)
            {
                _files.Remove(file.Hash);
            }
            else
            {
                _files[file.Hash].RemoveAll(f => f.Hash == file.Hash);

                if (_files[file.Hash].Count == 0)
                {
                    _files.Remove(file.Hash);
                }
            }
        }
        private bool IgnoreEmptyHashedFile(FileModificationDescriptor file)
        {
            if (string.IsNullOrEmpty(file.Hash))
            {
                if (FileIgnored != null)
                {
                    FileListModificationEventArgs args = new FileListModificationEventArgs(new FileModificationDescriptor[] { file });

                    FileIgnored(this, args);
                }

                return true;
            }

            return false;
        }
        private void AddNewFile(FileModificationDescriptor file)
        {
            if (IgnoreEmptyHashedFile(file)) return;

            if (_uniqueHash)
            {
                if (CountOf(file.Hash) > 0) return;
            }
            else
            {
                //if it is identical location, don't store same file twice
                if (_files.ContainsKey(file.Hash) &&
                    _files[file.Hash].Count(f => f.FileFullName == file.FileFullName) > 0)
                {
                    return;
                }
            }

            if (FileAdding != null)
            {
                SetupFileCancelArgs(file);

                FileAdding(this, _fileCancelArgs);

                if (_fileCancelArgs.Cancel) return;
            }

            if (!_files.ContainsKey(file.Hash))
            {
                _files[file.Hash] = new List<FileDescriptor>();
            }

            _files[file.Hash].Add(file.ToFileDescriptor());
        }
        private void RemoveModification(BitTunnelServerProtocol protocol, FileModificationDescriptor modification)
        {
            if (InvokeRequired)
            {
                Invoke((MethodInvoker)delegate
                {
                    RemoveModification(protocol, modification);
                });
            }
            else
            {
                FileDescriptor file = modification.ToFileDescriptor();

                ListViewItem item = GetListViewItem(file.Hash);

                List<FileDescriptor> files = item.Tag as List<FileDescriptor>;

                if (files == null) throw new InvalidOperationException("Tag on available server file not List of File Descriptors");

                files.Remove(file);

                if (files.Count == 0)
                {
                    _availableFilesView.Items.Remove(item);
                }
                else
                {
                    item.Tag = files;

                    SetClientText(item);
                }
            }
        }