void FileSystem_OnFileEvent(BaseFile srcFile, FSObjectEvents eventtype) { lock (RemoteClients) { if (yNotRule.RulePool.ContainsKey(eventtype)) foreach (var r in yNotRule.RulePool[eventtype]) r.Eval(this, srcFile); } ///блокировки файлов и т д if (eventtype == FSObjectEvents.local_changed) { Log(LogLevel.Info, "Отправка обновленной метаинформации"); Environment.SendToAll(new UpdateMetaInfoMessage(srcFile)); } if (eventtype == FSObjectEvents.local_opend) { Environment.SendToAll(new LockFileMessage(srcFile)); if (!srcFile.data.Downloaded) { ///файл не загружен - выбираем слуйчайную реплику ///загружаем файл ///добавляем себя в реплики ///сообщаем об изменении метаинформации var r = GetRandomReplica(srcFile); if (r == null) throw new Exception("Не найдены релики"); var m = new EventWaitHandle(false, EventResetMode.AutoReset); (r as RemoteClient).Send(new DownloadFileMessage(srcFile, m)); m.WaitOne(-1); srcFile.AddReplica(Id); Log(NLog.LogLevel.Info, "Получена реплика файла {0}", this); FileSystem_OnFileEvent(srcFile, FSObjectEvents.local_changed); } } if (eventtype == FSObjectEvents.local_changed || eventtype == FSObjectEvents.remote_changed) { ///если хэши не совпадают (и реплика загружена), обновить реплику ///OR ///если я в репликах - я дожен загузить этот файл /// // if () if ((srcFile.data.Downloaded && srcFile.data.ComputeHash() != srcFile.meta.Hash) || (GetFileReplics(srcFile).Contains(this) && !srcFile.data.Downloaded)) { Log(LogLevel.Info, "Файл изменен. Инициирую обновление {0}", srcFile); var m = new EventWaitHandle(false, EventResetMode.AutoReset); Log(LogLevel.Info, "Загружаю реплику {0}", srcFile.Name); (GetFileOwner(srcFile) as RemoteClient).Send(new DownloadFileMessage(srcFile, m)); //m.WaitOne(-1); } Log(LogLevel.Info, "Обновлена метаинформация для файла {0}", srcFile.Name); } if (eventtype == FSObjectEvents.local_closed) { ///сравнить хэш ///если совпадает - файл не изменен. просто разлокируем его ///если нет - ставим себя влядельцем файла и рассылаем всем новую метаинфу. ///те должны сравнить хэш и загрузить файл. ///после этого файл можно разблокировать /// var oldhash = srcFile.meta.Hash; var newhash = srcFile.data.ComputeHash(); if (oldhash != newhash) { srcFile.SetHash(newhash); srcFile.SetOwner(Id); FileSystem_OnFileEvent(srcFile, FSObjectEvents.local_changed); // ParentFolder.FS.ParentClient.Environment.SendToAll(new UpdateMetaInfoMessage(this)); } Environment.SendToAll(new UnLockFileMessage(srcFile)); } }