Ejemplo n.º 1
0
        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));

            }
        }