Пример #1
0
        private bool AutoIntegrate(LocalFolder folder, List<LockError> errors)
        {
            bool save = false;

            if (!folder.Info.IsFlagged(StorageFlags.Modified))
            {
                StorageFolder latestFolder = folder.Info;

                // this will process will find higher has integrated my file
                // and highest has integrated his file, and return latest

                // from self to highest
                foreach (ulong id in InheritIDs)
                    if (folder.HigherChanges.ContainsKey(id))
                        // higherChanges consists of files that are newer than local
                        foreach (StorageFolder changeFolder in folder.HigherChanges[id])
                            if (changeFolder.Date >= latestFolder.Date && Storages.ItemDiff(latestFolder, changeFolder) == StorageActions.None)
                            {
                                latestFolder = (StorageFolder)folder.HigherChanges[id][0]; // first element is newest file
                                break;
                            }

                // if current file/folder is not our own (itemdiff)
                if (Storages.ItemDiff(latestFolder, folder.Info) != StorageActions.None)
                {
                    ReplaceFolder(folder.GetPath(), latestFolder, false);

                    save = true;
                }
            }

            string dir = folder.GetPath();

            folder.Files.LockReading(delegate()
            {
                foreach (LocalFile file in folder.Files.Values)
                    if (AutoIntegrate(file, dir, errors))
                        save = true;
            });

            folder.Folders.LockReading(delegate()
            {
                foreach (LocalFolder subfolder in folder.Folders.Values)
                    if (AutoIntegrate(subfolder, errors))
                        save = true;
            });

            return save;
        }