Esempio n. 1
0
 void synchfolders(BaseFolder srcFolder, FSObjectEvents eventtype)
 {
     Dispatcher.BeginInvoke(new Action(() =>
     {
         v_curdir = v_curdir;
     }), null);
 }
Esempio n. 2
0
        internal void Delete(FSObjectEvents eventtype)
        {
            foreach (var f in Files)
                FS.Delete(f, eventtype);
            foreach (var it in Folders)
                FS.Delete(it,eventtype);

            if (Directory.Exists(RealPath))
                Directory.Delete(RealPath,true);
            if (Directory.Exists(MetaPath))
                Directory.Delete(MetaPath, true);
        }
Esempio n. 3
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));

            }
        }
Esempio n. 4
0
 void FileSystem_OnFolderEvent(BaseFolder srcFolder, FSObjectEvents eventtype)
 {
     if (eventtype == FSObjectEvents.local_created)
     {
         Log(LogLevel.Info, "Шлем команду \"создать папку {0}\"", srcFolder.Name);
         Environment.SendToAll(new NewFolderMessage(srcFolder));
     }
     if (eventtype == FSObjectEvents.local_delete)
     {
         Log(LogLevel.Info, "Шлем команду \"удалить папку {0}\"", srcFolder.Name);
         Environment.SendToAll(new DeleteFSObjMessage(srcFolder));
     }
 }
Esempio n. 5
0
 public virtual void OnFolderEventHandled(BaseFolder srcFolder, FSObjectEvents eventtype)
 {
     ///передача агрегированных событий
     if (OnFolderEvent != null)
         OnFolderEvent(srcFolder, eventtype);
 }
Esempio n. 6
0
        public virtual void OnFileEventHandled(BaseFile srcFile, FSObjectEvents eventtype)
        {
            //if (ReadOnly && eventtype == FSObjectEvents.remote_create)
            //    throw new Exception("Can not create file on readonly mode");

            ///подписываемся на события каждого нового файла
            if (eventtype == FSObjectEvents.local_created || eventtype == FSObjectEvents.remote_create)
                srcFile.OnFileEvent += OnFileEventHandled;

            ///передача агрегированных событий
            if (OnFileEvent != null)
                OnFileEvent(srcFile, eventtype);
        }
Esempio n. 7
0
        public IFSObject Delete(IFSObject iFSObject, FSObjectEvents eventtype)
        {
            //     if (ReadOnly) return null;

            lock (RootDir.FS)
            {
                ///check exists
                ///
                if (Find(iFSObject.RelativePath) == null)
                {
                    throw new Exception(string.Format("Cant found {0} ", iFSObject.Name));
                    return null;
                }

                if (iFSObject is BaseFile) (iFSObject as BaseFile).Delete();
                if (iFSObject is BaseFolder)
                {
                    var its = (iFSObject as BaseFolder).Items;
                    while (its.Count > 0)
                        Delete(its[0], eventtype);
                    (iFSObject as BaseFolder).Delete(eventtype);
                }

                //remove sourcelist fs
                if (iFSObject is BaseFile)
                {
                    var f = iFSObject as BaseFile;
                    f.ParentFolder.Files.Remove(f);
                }
                else if (iFSObject is BaseFolder)
                {
                    var f = iFSObject as BaseFolder;
                    (f.ParentFolder as BaseFolder).Folders.Remove(f);
                }

                if (iFSObject is BaseFile)
                    if (_OnFileEvent != null)
                        _OnFileEvent(iFSObject as BaseFile, eventtype);
                if (iFSObject is BaseFolder)
                    if (_OnFolderEvent != null)
                        _OnFolderEvent(iFSObject as BaseFolder, eventtype);

                return iFSObject;
            }
        }
Esempio n. 8
0
        /// <summary>
        /// CreateFolder folders without subfolders
        /// </summary>
        /// <param name="ParentFolder">parent folder</param>
        /// <param name="FolderName">folder name only (or '\\' for root)</param>
        /// <param name="CreationType">type of folder creatinon (by local or by remote)</param>
        /// <returns></returns>
        public BaseFolder CreateFolder(BaseFolder ParentFolder, string FolderName, FSObjectEvents CreationType)
        {
            //   if (ReadOnly) return null;

            if (!string.IsNullOrEmpty(FolderName) && FolderName.Length > 0 && FolderName != "\\" && FolderName[0] == '\\')
                FolderName = FolderName.Substring(1);
            if (FolderName.Contains("\\") || FolderName.Contains("/"))
            {
                var g = FolderName.Split('\\').ToList();
                while (g.Count > 0)
                {
                    var pfold = Path.Combine(ParentFolder.RelativePath, g[0]);
                    var tmpfold = FindFSObjByRelativePath(pfold, ParentFolder) as BaseFolder;
                    if (tmpfold == null)
                        ParentFolder = CreateFolder(ParentFolder, g[0], CreationType);
                    else ParentFolder = tmpfold;
                    g.RemoveAt(0);
                }
            }

            var realdir = Path.Combine(ParentFolder.RealPath, FolderName);
            if (Directory.Exists(realdir))
            {
                //Delete(dirtodel, FSObjectEvents.local_delete);
                throw new Exception(string.Format("Folder {0} exists!", FolderName));
                return Find(FolderName) as BaseFolder;
            }
            //create real
            //create meta
            try
            {
                lock (ParentFolder.FS)
                {
                    var f = ParentFolder.CreateFolder(FolderName);

                    ParentFolder.Folders.Add(f);

                    if (_OnFolderEvent != null)
                        _OnFolderEvent(f, CreationType);

                    return f;
                }
            }
            catch (Exception)
            {
                //ParentClient.Log(NLog.LogLevel.Error, ex.Message);
                return null;
            }
        }
Esempio n. 9
0
        /// <summary>
        /// Add file by metafileinfo
        /// </summary>
        /// <param name="ParentFolder">Direactory to move new file</param>
        /// <param name="MetaFile">new file meta information</param>
        /// <returns></returns>
        public BaseFile AddFile(BaseFolder ParentFolder, FileMetaInfo MetaFile, FSObjectEvents FileEventType)
        {
            //   if (ReadOnly) return null;

            lock (ParentFolder.FS)
            {
                var metapath = Path.Combine(ParentFolder.MetaPath, MetaFile.Name);

                if (File.Exists(metapath))
                    throw new Exception(string.Format("Файл \"{0}\" уже существует!", metapath));// return null;

                var f = new BaseFile(ParentFolder, MetaFile);
                ParentFolder.Files.Add(f);

                //add to files
                if (_OnFileEvent != null)
                    _OnFileEvent(f, FileEventType);

                return f;
            }
        }