void AddFile(WorkspaceDirectoryInfo NewWorkspaceDir, StreamFileInfo StreamFile)
        {
            // Create a new file for this workspace
            WorkspaceFileInfo WorkspaceFile = new WorkspaceFileInfo(NewWorkspaceDir, StreamFile.Name, StreamFile.ContentId);

            NewWorkspaceDir.NameToFile.Add(StreamFile.Name, WorkspaceFile);

            // Try to add it to the cache
            TrackedFileInfo TrackedFile;

            if (ContentIdToTrackedFile.TryGetValue(StreamFile.ContentId, out TrackedFile))
            {
                if (FilesToMove.TryAdd(TrackedFile, new WorkspaceFileToMove(StreamFile, TrackedFile, WorkspaceFile)))
                {
                    WorkspaceFile.SetMetadata(TrackedFile.Length, TrackedFile.LastModifiedTicks, TrackedFile.bReadOnly);
                }
                else
                {
                    FilesToCopy.Add(new WorkspaceFileToCopy(StreamFile, FilesToMove[TrackedFile].WorkspaceFile, WorkspaceFile));
                }
            }
            else
            {
                WorkspaceFileInfo SourceWorkspaceFile;
                if (ContentIdToWorkspaceFile.TryGetValue(StreamFile.ContentId, out SourceWorkspaceFile))
                {
                    FilesToCopy.Add(new WorkspaceFileToCopy(StreamFile, SourceWorkspaceFile, WorkspaceFile));
                }
                else
                {
                    FilesToSync.Add(new WorkspaceFileToSync(StreamFile, WorkspaceFile));
                }
            }
        }
        /// <summary>
        /// Constructor for reading from disk
        /// </summary>
        /// <param name="Reader">Reader to read data from</param>
        /// <param name="ParentDirectory">The parent directory to initialize this directory with</param>
        public StreamDirectoryInfo(BinaryReader Reader, StreamDirectoryInfo ParentDirectory)
        {
            this.Name            = Reader.ReadString();
            this.ParentDirectory = ParentDirectory;

            int NumFiles = Reader.ReadInt32();

            for (int Idx = 0; Idx < NumFiles; Idx++)
            {
                StreamFileInfo File = new StreamFileInfo(Reader, this);
                NameToFile.Add(File.Name, File);
            }

            int NumDirectories = Reader.ReadInt32();

            for (int Idx = 0; Idx < NumDirectories; Idx++)
            {
                StreamDirectoryInfo SubDirectory = new StreamDirectoryInfo(Reader, this);
                NameToSubDirectory.Add(SubDirectory.Name, SubDirectory);
            }
        }
 public WorkspaceFileToSync(StreamFileInfo StreamFile, WorkspaceFileInfo WorkspaceFile)
 {
     this.StreamFile    = StreamFile;
     this.WorkspaceFile = WorkspaceFile;
 }
 public WorkspaceFileToCopy(StreamFileInfo StreamFile, WorkspaceFileInfo SourceWorkspaceFile, WorkspaceFileInfo TargetWorkspaceFile)
 {
     this.StreamFile          = StreamFile;
     this.SourceWorkspaceFile = SourceWorkspaceFile;
     this.TargetWorkspaceFile = TargetWorkspaceFile;
 }
 public WorkspaceFileToMove(StreamFileInfo StreamFile, TrackedFileInfo TrackedFile, WorkspaceFileInfo WorkspaceFile)
 {
     this.StreamFile    = StreamFile;
     this.TrackedFile   = TrackedFile;
     this.WorkspaceFile = WorkspaceFile;
 }