FullStream GenerateInitialStream(FileSystemObject fso, Dictionary<Guid, BackupStream> knownGuids)
 {
     if (!ShouldBeAdded(fso, knownGuids))
     {
         FixUpStreamReference(fso, knownGuids);
         return null;
     }
     var ret = new FullStream
     {
         UniqueId = fso.StreamUniqueId,
         PhysicalSize = fso.Size,
         VirtualSize = fso.Size,
     };
     if (fso.FileSystemGuid != null)
         knownGuids[fso.FileSystemGuid.Value] = ret;
     ret.FileSystemObjects.Add(fso);
     return ret;
 }
 private BackupStream CheckAndMaybeAdd(FileSystemObject fso, Dictionary<Guid, BackupStream> knownGuids)
 {
     if (!ShouldBeAdded(fso, knownGuids))
     {
         FixUpStreamReference(fso, knownGuids);
         return null;
     }
     int existingVersion = -1;
     if (fso.BackupMode != BackupMode.ForceFull && !FileHasChanged(fso, out existingVersion))
         fso.BackupMode = BackupMode.Unmodified;
     BackupStream newStream;
     switch (fso.BackupMode)
     {
         case BackupMode.Unmodified:
             newStream = new UnmodifiedStream
             {
                 UniqueId = fso.StreamUniqueId,
                 ContainingVersion = existingVersion,
                 VirtualSize = fso.Size,
             };
             newStream.FileSystemObjects.Add(fso);
             break;
         case BackupMode.ForceFull:
         case BackupMode.Full:
             newStream = new FullStream
             {
                 UniqueId = fso.StreamUniqueId,
                 PhysicalSize = fso.Size,
                 VirtualSize = fso.Size,
             };
             newStream.FileSystemObjects.Add(fso);
             break;
         case BackupMode.Rsync:
             throw new NotImplementedException("Differential backup not implemented.");
         default:
             throw new ArgumentOutOfRangeException();
     }
     if (fso.FileSystemGuid != null)
         knownGuids[fso.FileSystemGuid.Value] = newStream;
     return newStream;
 }