OSDN Git Service

Adjust to the introduction of FolderType ENUM in libomv
[radegast/radegast.git] / Radegast / GUI / Consoles / Inventory / FolderCopy.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using OpenMetaverse;
7
8 namespace Radegast
9 {
10
11     public class FolderCopy
12     {
13         RadegastInstance Instance;
14         GridClient Client;
15
16         public FolderCopy(RadegastInstance instance)
17         {
18             this.Instance = instance;
19             this.Client = this.Instance.Client;
20         }
21
22         public void GetFolders(string folder)
23         {
24             var f = FindFolder(folder, Client.Inventory.Store.LibraryRootNode);
25             if (f == null) return;
26
27             UUID dest = Client.Inventory.FindFolderForType(AssetType.Clothing);
28             if (dest == UUID.Zero) return;
29
30             var destFolder = (InventoryFolder)Client.Inventory.Store[dest];
31
32             WorkPool.QueueUserWorkItem(sync =>
33             {
34                 Instance.TabConsole.DisplayNotificationInChat("Starting copy operation...");
35                 foreach (var node in f.Nodes.Values)
36                 {
37                     if (node.Data is InventoryFolder)
38                     {
39                         var s = (InventoryFolder)node.Data;
40                         Instance.TabConsole.DisplayNotificationInChat(string.Format("  Copying {0} to {1}", s.Name, destFolder.Name));
41                         CopyFolder(destFolder, s);
42                     }
43                 }
44                 Instance.TabConsole.DisplayNotificationInChat("Done.");
45             });
46         }
47
48         public void CopyFolder(InventoryFolder dest, InventoryFolder folder)
49         {
50             UUID newFolderID = Client.Inventory.CreateFolder(dest.UUID, folder.Name, FolderType.None);
51             Thread.Sleep(500);
52             var items = Client.Inventory.FolderContents(folder.UUID, folder.OwnerID, true, true, InventorySortOrder.ByDate, 45 * 1000);
53             AutoResetEvent copied = new AutoResetEvent(false);
54             foreach (var item in items)
55             {
56                 if (item is InventoryItem)
57                 {
58                     copied.Reset();
59                     Client.Inventory.RequestCopyItem(item.UUID, newFolderID, item.Name, folder.OwnerID, (InventoryBase target) =>
60                     {
61                         Instance.TabConsole.DisplayNotificationInChat(string.Format("    * Copied {0} to {1}", item.Name, dest.Name));
62                         copied.Set();
63                     });
64                     copied.WaitOne(15 * 1000, false);
65                 }
66             }
67         }
68
69         public InventoryNode FindFolder(string folder, InventoryNode start)
70         {
71             if (start.Data.Name == folder)
72             {
73                 return start;
74             }
75
76             foreach (var node in start.Nodes.Values)
77             {
78                 if (node.Data is InventoryFolder)
79                 {
80                     var n = FindFolder(folder, node);
81                     if (n != null)
82                     {
83                         return n;
84                     }
85                 }
86             }
87
88             return null;
89         }
90     }
91 }