/// <summary> /// Copies this file to another folder. /// </summary> /// <param name="destFolder">Destination folder.</param> /// <param name="destName">New file name in destination folder.</param> /// <param name="deep">Is not used.</param> /// <param name="multistatus">Container for errors with items other than this file.</param> public override void CopyTo( IItemCollection destFolder, string destName, bool deep, MultistatusException multistatus) { DavFolder destDavFolder = destFolder as DavFolder; if (destFolder == null) { throw new DavException("Destination folder doesn't exist.", DavStatus.CONFLICT); } if (!destDavFolder.ClientHasToken()) { throw new LockedException("Doesn't have token for destination folder."); } DavHierarchyItem destItem = destDavFolder.FindChild(destName); if (destItem != null) { try { destItem.Delete(multistatus); } catch (DavException ex) { multistatus.AddInnerException(destItem.Path, ex); return; } } CopyThisItem(destDavFolder, null, destName); }
/// <summary> /// Deletes this folder. /// </summary> /// <param name="multistatus">Container for errors. /// If some child file/folder fails to remove we report error in this container.</param> public override void Delete(MultistatusException multistatus) { DavFolder parent = GetParent(); if (parent == null) { throw new DavException("Cannot delete root.", DavStatus.CONFLICT); } if (!parent.ClientHasToken()) { throw new LockedException(); } if (!ClientHasToken()) { throw new LockedException(); } bool deletedAllChildren = true; foreach (IHierarchyItem child in GetChildren(new PropertyName[0])) { DavHierarchyItem dbchild = child as DavHierarchyItem; try { dbchild.Delete(multistatus); } catch (DavException ex) { multistatus.AddInnerException(dbchild.Path, ex); deletedAllChildren = false; } } if (deletedAllChildren) { DeleteThisItem(parent); } }
/// <summary> /// Moves this file to different folder and renames it. /// </summary> /// <param name="destFolder">Destination folder.</param> /// <param name="destName">New file name.</param> /// <param name="multistatus">Container for errors with items other than this file.</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); } 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); if (destItem != null) { try { destItem.Delete(multistatus); } catch (DavException ex) { multistatus.AddInnerException(destItem.Path, ex); return; } } MoveThisItem(destDavFolder, destName, parent); }
/// <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); } }