Exemplo n.º 1
0
        /// <summary>
        /// Adds the given new file to our in-memory data structures and to our database. Updates all clients on success.
        /// </summary>
        /// <param name="newFile"></param>
        /// <param name="parent"></param>
        private FileResult UploadOnNewFile(SoundboxNode newFile, SoundboxDirectory parent)
        {
            try
            {
                DatabaseLock.EnterWriteLock();

                //save previous watermark for event
                Guid previousWatermark = GetRootWatermark();
                Guid newWatermark      = Guid.NewGuid();

                //add to cache
                parent.AddChild(newFile);
                NodesCache[newFile.ID] = newFile;
                //add to database
                //TODO async
                Database.Insert(newFile);

                //update cache and database watermarks (this will call Update for parent)
                SetWatermark(newFile, newWatermark);

                //update our clients
                GetHub().OnFileEvent(new SoundboxFileChangeEvent()
                {
                    Event             = SoundboxFileChangeEvent.Type.ADDED,
                    File              = FlattenForEvent(newFile),
                    PreviousWatermark = previousWatermark
                });

                if (newFile is Sound sound)
                {
                    SpeechRecognition_OnSoundChanged(sound, null);
                }

                return(new FileResult(BaseResultStatus.OK, newFile, previousWatermark));
            }
            finally
            {
                DatabaseLock.ExitWriteLock();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Moves a file to a new directory without performing an <see cref="Edit(SoundboxNode)"/>.
        /// </summary>
        /// <param name="file"></param>
        /// <param name="directory">
        /// Null: uses the root directory instead.
        /// </param>
        /// <returns></returns>
        public async Task <FileResult> Move(SoundboxNode file, SoundboxDirectory directory)
        {
            file = GetCleanFile(file);
            if (file == null)
            {
                return(new FileResult(BaseResultStatus.INVALID_PARAMETER));
            }
            if (IsRootDirectory(file))
            {
                return(new FileResult(FileResultStatus.ILLEGAL_FILE_EDIT_DENIED_ROOT));
            }

            if (directory == null)
            {
                directory = GetRootDirectory();
            }
            else
            {
                directory = GetCleanFile(directory);
                if (directory == null)
                {
                    return(new FileResult(BaseResultStatus.INVALID_PARAMETER));
                }
            }

            if (file == directory)
            {
                //not possible
                return(new FileResult(FileResultStatus.MOVE_TARGET_INVALID));
            }
            if (file.ParentDirectory == directory)
            {
                //no change
                return(new FileResult(BaseResultStatus.OK_NO_CHANGE));
            }

            try
            {
                DatabaseLock.EnterWriteLock();

                //save previous watermark for event
                Guid previousWatermark = GetRootWatermark();
                Guid newWatermark      = Guid.NewGuid();

                //move in cache
                SoundboxDirectory oldParent = file.ParentDirectory;
                oldParent.Children.Remove(file);

                directory.AddChild(file);

                //update file in database
                if (!(file is SoundboxDirectory))
                {
                    //TODO async
                    Database.Update(file);
                }
                //else: is updated anyways in SetWatermak

                //update cache and database watermarks (this will call Update for parent)
                SetWatermark(file, newWatermark);
                SetWatermark(oldParent, newWatermark);

                //update our clients
                GetHub().OnFileEvent(new SoundboxFileMoveEvent()
                {
                    Event             = SoundboxFileChangeEvent.Type.MOVED,
                    File              = FlattenForEvent(file),
                    FromDirectory     = oldParent,
                    PreviousWatermark = previousWatermark
                });

                return(new FileResult(BaseResultStatus.OK, file, previousWatermark, oldParent));
            }
            catch (Exception ex)
            {
                Log(ex);
                return(new FileResult(BaseResultStatus.INTERNAL_SERVER_ERROR));
            }
            finally
            {
                DatabaseLock.ExitWriteLock();
            }
        }