/// <summary> /// Moves this folder to destination folder with option to rename. /// </summary> /// <param name="destFolder">Folder to copy this folder to.</param> /// <param name="destName">New name of this folder.</param> /// <param name="multistatus">Container for errors. We put here errors occurring while moving /// individual files/folders.</param> public override void MoveTo(IItemCollection destFolder, string destName, MultistatusException multistatus) { DavFolder destDavFolder = destFolder as DavFolder; if (destFolder == null) { throw new DavException("Destination folder doesn't exist", DavStatus.CONFLICT); } if (isRecursive(destDavFolder)) { throw new DavException("Cannot move folder to its subtree", DavStatus.FORBIDDEN); } DavFolder parent = GetParent(); if (parent == null) { throw new DavException("Cannot move root", DavStatus.CONFLICT); } if (!ClientHasToken() || !destDavFolder.ClientHasToken() || !parent.ClientHasToken()) { throw new LockedException(); } DavHierarchyItem destItem = destDavFolder.FindChild(destName); DavFolder newDestFolder; // copy this folder if (destItem != null) { if (destItem is IFile) { try { destItem.Delete(multistatus); } catch (DavException ex) { multistatus.AddInnerException(destItem.Path, ex); return; } newDestFolder = CopyThisItem(destDavFolder, null, destName); } else { newDestFolder = destItem as DavFolder; if (newDestFolder == null) { multistatus.AddInnerException( destItem.Path, new DavException("Destionation item is not folder", DavStatus.CONFLICT)); } } } else { newDestFolder = CopyThisItem(destDavFolder, null, destName); } // move children bool movedAllChildren = true; foreach (IHierarchyItem child in GetChildren(new PropertyName[0])) { DavHierarchyItem dbchild = child as DavHierarchyItem; try { dbchild.MoveTo(newDestFolder, child.Name, multistatus); } catch (DavException ex) { multistatus.AddInnerException(dbchild.Path, ex); movedAllChildren = false; } } if (movedAllChildren) { DeleteThisItem(parent); } }
/// <summary> /// Determines whether <paramref name="destFolder"/> is inside this folder. /// </summary> /// <param name="destFolder">Folder to test.</param> /// <returns>Returns <c>true</c>if <paramref name="destFolder"/> is inside this folder.</returns> private bool isRecursive(DavFolder destFolder) { return(destFolder.Path.StartsWith(Path)); }
internal DavFolder CopyThisItem(DavFolder destFolder, DavHierarchyItem destItem, string destName) { // returns created folder, if any, otherwise null DavFolder createdFolder = null; Guid destID; if (destItem == null) { // copy item string commandText = @"INSERT INTO DMS_Folders(ID, Name, CreatedOn, ModifiedOn, ParentID, CreatorDisplayName, AutoVersion, AutoCheckedOut, TotalContentLength, Attributes) SELECT @Identity, @Name, GETUTCDATE(), GETUTCDATE(), @Parent, CreatorDisplayName, AutoVersion, AutoCheckedOut, TotalContentLength, Attributes FROM DMS_Folders WHERE ID = @ItemId; INSERT INTO DMS_Documents(ID, Name, CreatedOn, ModifiedOn, ParentID, FileContent, ContentType, SerialNumber, CreatorDisplayName, Comment, AutoVersion, AutoCheckedOut, TotalContentLength, LastChunkSaved, Attributes) SELECT @Identity, @Name, GETUTCDATE(), GETUTCDATE(), @Parent, FileContent, ContentType, SerialNumber, CreatorDisplayName, Comment, AutoVersion, AutoCheckedOut, TotalContentLength, LastChunkSaved, Attributes FROM DMS_Documents WHERE ID = @ItemId"; destID = Guid.NewGuid(); Context.ExecuteNonQuery( commandText, "@Name", destName, "@Parent", destFolder.ItemId, "@ItemId", ItemId, "@Identity", destID); destFolder.UpdateModified(); if (this is IFolder) { createdFolder = new DavFolder( Context, destID, destFolder.ItemId, destName, destFolder.Path + EncodeUtil.EncodeUrlPart(destName) + "/", DateTime.UtcNow, DateTime.UtcNow, fileAttributes); } } else { // update existing destination destID = destItem.ItemId; string commandText = @"UPDATE DMS_Folders SET ModifiedOn = GETUTCDATE() FROM (SELECT * FROM DMS_Folders WHERE ID=@SrcID) src WHERE DMS_Folders.ID=@DestID ; UPDATE DMS_Documents SET ModifiedOn = GETUTCDATE() , ContentType = src.ContentType FROM (SELECT * FROM DMS_Documents WHERE ID=@SrcID) src WHERE DMS_Documents.ID=@DestID"; Context.ExecuteNonQuery( commandText, "@SrcID", ItemId, "@DestID", destID); // remove old properties from the destination Context.ExecuteNonQuery( "DELETE FROM DMS_DocumentProperties WHERE ItemId = @ItemId", "@ItemId", destID); } // copy properties string command = @"INSERT INTO DMS_DocumentProperties(ItemId, Name, Namespace, PropVal) SELECT @DestID, Name, Namespace, PropVal FROM DMS_DocumentProperties WHERE ItemId = @SrcID"; Context.ExecuteNonQuery( command, "@SrcID", ItemId, "@DestID", destID); return(createdFolder); }