diff options
author | Justin Clarke Casey | 2009-03-04 20:31:03 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2009-03-04 20:31:03 +0000 |
commit | b52ac542ade6af9ad404dcebf68be3bef769b0e1 (patch) | |
tree | 2a304eb111ed61080c04893f14f89858bedda2e2 /OpenSim/Region/CoreModules/Avatar | |
parent | * Whoops. Left MiniModule enabled to anyone. (potential security risk). Disab... (diff) | |
download | opensim-SC_OLD-b52ac542ade6af9ad404dcebf68be3bef769b0e1.zip opensim-SC_OLD-b52ac542ade6af9ad404dcebf68be3bef769b0e1.tar.gz opensim-SC_OLD-b52ac542ade6af9ad404dcebf68be3bef769b0e1.tar.bz2 opensim-SC_OLD-b52ac542ade6af9ad404dcebf68be3bef769b0e1.tar.xz |
* Add the abilty to load and save iar item nodes where folders have identical names
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar')
4 files changed, 132 insertions, 31 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveConstants.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveConstants.cs index b274af2..e2bce16 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveConstants.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveConstants.cs | |||
@@ -51,6 +51,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
51 | public static readonly string ASSET_EXTENSION_SEPARATOR = "_"; | 51 | public static readonly string ASSET_EXTENSION_SEPARATOR = "_"; |
52 | 52 | ||
53 | /// <summary> | 53 | /// <summary> |
54 | /// Used to separate components in an inventory node name | ||
55 | /// </summary> | ||
56 | public static readonly string INVENTORY_NODE_NAME_COMPONENT_SEPARATOR = "__"; | ||
57 | |||
58 | /// <summary> | ||
54 | /// Extensions used for asset types in the archive | 59 | /// Extensions used for asset types in the archive |
55 | /// </summary> | 60 | /// </summary> |
56 | public static readonly IDictionary<sbyte, string> ASSET_TYPE_TO_EXTENSION = new Dictionary<sbyte, string>(); | 61 | public static readonly IDictionary<sbyte, string> ASSET_TYPE_TO_EXTENSION = new Dictionary<sbyte, string>(); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index fc63957..4a681bc 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs | |||
@@ -85,7 +85,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
85 | 85 | ||
86 | if (contents.Equals("")) return null; | 86 | if (contents.Equals("")) return null; |
87 | 87 | ||
88 | reader.ReadStartElement("InventoryObject"); | 88 | reader.ReadStartElement("InventoryItem"); |
89 | reader.ReadStartElement("Name"); | 89 | reader.ReadStartElement("Name"); |
90 | item.Name = reader.ReadString(); | 90 | item.Name = reader.ReadString(); |
91 | reader.ReadEndElement(); | 91 | reader.ReadEndElement(); |
@@ -138,10 +138,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
138 | reader.ReadStartElement("GroupOwned"); | 138 | reader.ReadStartElement("GroupOwned"); |
139 | item.GroupOwned = Convert.ToBoolean(reader.ReadString()); | 139 | item.GroupOwned = Convert.ToBoolean(reader.ReadString()); |
140 | reader.ReadEndElement(); | 140 | reader.ReadEndElement(); |
141 | //reader.ReadStartElement("ParentFolderID"); | ||
142 | //item.Folder = UUID.Parse(reader.ReadString()); | ||
143 | //reader.ReadEndElement(); | ||
144 | //reader.ReadEndElement(); | ||
145 | 141 | ||
146 | return item; | 142 | return item; |
147 | } | 143 | } |
@@ -187,13 +183,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
187 | 183 | ||
188 | if (null == rootDestinationFolder) | 184 | if (null == rootDestinationFolder) |
189 | { | 185 | { |
190 | // TODO: Later on, automatically create this folder if it does not exist | 186 | // Possibly provide an option later on to automatically create this folder if it does not exist |
191 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: Inventory path {0} does not exist", m_invPath); | 187 | m_log.ErrorFormat("[INVENTORY ARCHIVER]: Inventory path {0} does not exist", m_invPath); |
192 | 188 | ||
193 | return nodesLoaded; | 189 | return nodesLoaded; |
194 | } | 190 | } |
195 | 191 | ||
196 | archive = new TarArchiveReader(m_loadStream); | 192 | archive = new TarArchiveReader(m_loadStream); |
193 | |||
194 | // In order to load identically named folders, we need to keep track of the folders that we have already | ||
195 | // created | ||
196 | Dictionary <string, InventoryFolderImpl> foldersCreated = new Dictionary<string, InventoryFolderImpl>(); | ||
197 | 197 | ||
198 | byte[] data; | 198 | byte[] data; |
199 | TarArchiveReader.TarEntryType entryType; | 199 | TarArchiveReader.TarEntryType entryType; |
@@ -222,12 +222,72 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
222 | item.Creator = m_userInfo.UserProfile.ID; | 222 | item.Creator = m_userInfo.UserProfile.ID; |
223 | item.Owner = m_userInfo.UserProfile.ID; | 223 | item.Owner = m_userInfo.UserProfile.ID; |
224 | 224 | ||
225 | filePath = filePath.Substring(InventoryArchiveConstants.INVENTORY_PATH.Length); | 225 | string fsPath = filePath.Substring(InventoryArchiveConstants.INVENTORY_PATH.Length); |
226 | filePath = filePath.Remove(filePath.LastIndexOf("/")); | 226 | fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); |
227 | string originalFsPath = fsPath; | ||
228 | |||
229 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); | ||
227 | 230 | ||
228 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to file path {0}", filePath); | 231 | InventoryFolderImpl foundFolder = null; |
232 | while (null == foundFolder && fsPath.Length > 0) | ||
233 | { | ||
234 | if (foldersCreated.ContainsKey(fsPath)) | ||
235 | { | ||
236 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Found previously created fs path {0}", fsPath); | ||
237 | foundFolder = foldersCreated[fsPath]; | ||
238 | } | ||
239 | else | ||
240 | { | ||
241 | // Don't include the last slash | ||
242 | int penultimateSlashIndex = fsPath.LastIndexOf("/", fsPath.Length - 2); | ||
243 | |||
244 | if (penultimateSlashIndex >= 0) | ||
245 | { | ||
246 | fsPath = fsPath.Remove(penultimateSlashIndex + 1); | ||
247 | } | ||
248 | else | ||
249 | { | ||
250 | m_log.DebugFormat( | ||
251 | "[INVENTORY ARCHIVER]: Found no previously created fs path for {0}", | ||
252 | originalFsPath); | ||
253 | fsPath = string.Empty; | ||
254 | foundFolder = rootDestinationFolder; | ||
255 | } | ||
256 | } | ||
257 | } | ||
229 | 258 | ||
230 | string[] rawFolders = filePath.Split(new char[] { '/' }); | 259 | string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); |
260 | string[] rawDirsToCreate | ||
261 | = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); | ||
262 | int i = 0; | ||
263 | |||
264 | while (i < rawDirsToCreate.Length) | ||
265 | { | ||
266 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); | ||
267 | |||
268 | int identicalNameIdentifierIndex | ||
269 | = rawDirsToCreate[i].LastIndexOf( | ||
270 | InventoryArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); | ||
271 | string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); | ||
272 | |||
273 | UUID newFolderId = UUID.Random(); | ||
274 | m_userInfo.CreateFolder( | ||
275 | folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); | ||
276 | foundFolder = foundFolder.GetChildFolder(newFolderId); | ||
277 | |||
278 | // Record that we have now created this folder | ||
279 | fsPath += rawDirsToCreate[i] + "/"; | ||
280 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); | ||
281 | foldersCreated[fsPath] = foundFolder; | ||
282 | |||
283 | if (0 == i) | ||
284 | nodesLoaded.Add(foundFolder); | ||
285 | |||
286 | i++; | ||
287 | } | ||
288 | |||
289 | /* | ||
290 | string[] rawFolders = filePath.Split(new char[] { '/' }); | ||
231 | 291 | ||
232 | // Find the folders that do exist along the path given | 292 | // Find the folders that do exist along the path given |
233 | int i = 0; | 293 | int i = 0; |
@@ -257,16 +317,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
257 | m_userInfo.CreateFolder( | 317 | m_userInfo.CreateFolder( |
258 | rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); | 318 | rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); |
259 | foundFolder = foundFolder.GetChildFolder(newFolderId); | 319 | foundFolder = foundFolder.GetChildFolder(newFolderId); |
260 | } | 320 | } |
321 | */ | ||
261 | 322 | ||
262 | // Reset folder ID to the one in which we want to load it | 323 | // Reset folder ID to the one in which we want to load it |
263 | item.Folder = foundFolder.ID; | 324 | item.Folder = foundFolder.ID; |
264 | |||
265 | //item.Folder = rootDestinationFolder.ID; | ||
266 | 325 | ||
267 | m_userInfo.AddItem(item); | 326 | m_userInfo.AddItem(item); |
268 | successfulItemRestores++; | 327 | successfulItemRestores++; |
269 | nodesLoaded.Add(item); | 328 | |
329 | // If we're loading an item directly into the given destination folder then we need to record | ||
330 | // it separately from any loaded root folders | ||
331 | if (rootDestinationFolder == foundFolder) | ||
332 | nodesLoaded.Add(item); | ||
270 | } | 333 | } |
271 | } | 334 | } |
272 | } | 335 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 2b071f0..357ed40 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | |||
@@ -106,14 +106,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
106 | m_module.TriggerInventoryArchiveSaved(succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); | 106 | m_module.TriggerInventoryArchiveSaved(succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); |
107 | } | 107 | } |
108 | 108 | ||
109 | protected void saveInvItem(InventoryItemBase inventoryItem, string path) | 109 | protected void SaveInvItem(InventoryItemBase inventoryItem, string path) |
110 | { | 110 | { |
111 | string filename = string.Format("{0}{1}_{2}.xml", path, inventoryItem.Name, inventoryItem.ID); | 111 | string filename = string.Format("{0}{1}_{2}.xml", path, inventoryItem.Name, inventoryItem.ID); |
112 | StringWriter sw = new StringWriter(); | 112 | StringWriter sw = new StringWriter(); |
113 | XmlTextWriter writer = new XmlTextWriter(sw); | 113 | XmlTextWriter writer = new XmlTextWriter(sw); |
114 | writer.Formatting = Formatting.Indented; | 114 | writer.Formatting = Formatting.Indented; |
115 | 115 | ||
116 | writer.WriteStartElement("InventoryObject"); | 116 | writer.WriteStartElement("InventoryItem"); |
117 | |||
117 | writer.WriteStartElement("Name"); | 118 | writer.WriteStartElement("Name"); |
118 | writer.WriteString(inventoryItem.Name); | 119 | writer.WriteString(inventoryItem.Name); |
119 | writer.WriteEndElement(); | 120 | writer.WriteEndElement(); |
@@ -168,9 +169,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
168 | writer.WriteStartElement("GroupOwned"); | 169 | writer.WriteStartElement("GroupOwned"); |
169 | writer.WriteString(inventoryItem.GroupOwned.ToString()); | 170 | writer.WriteString(inventoryItem.GroupOwned.ToString()); |
170 | writer.WriteEndElement(); | 171 | writer.WriteEndElement(); |
171 | writer.WriteStartElement("ParentFolderID"); | 172 | |
172 | writer.WriteString(inventoryItem.Folder.ToString()); | ||
173 | writer.WriteEndElement(); | ||
174 | writer.WriteEndElement(); | 173 | writer.WriteEndElement(); |
175 | 174 | ||
176 | archive.AddFile(filename, sw.ToString()); | 175 | archive.AddFile(filename, sw.ToString()); |
@@ -178,20 +177,48 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
178 | m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (AssetType)inventoryItem.AssetType, assetUuids); | 177 | m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (AssetType)inventoryItem.AssetType, assetUuids); |
179 | } | 178 | } |
180 | 179 | ||
181 | protected void saveInvDir(InventoryFolderImpl inventoryFolder, string path) | 180 | protected void SaveInvDir(InventoryFolderImpl inventoryFolder, string path) |
182 | { | 181 | { |
183 | List<InventoryFolderImpl> inventories = inventoryFolder.RequestListOfFolderImpls(); | 182 | path += |
184 | List<InventoryItemBase> items = inventoryFolder.RequestListOfItems(); | 183 | string.Format( |
185 | string newPath = path + inventoryFolder.Name + InventoryFolderImpl.PATH_DELIMITER; | 184 | "{0}{1}{2}/", |
186 | archive.AddDir(newPath); | 185 | inventoryFolder.Name, |
186 | InventoryArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, | ||
187 | inventoryFolder.ID); | ||
188 | archive.AddDir(path); | ||
189 | |||
190 | List<InventoryFolderImpl> childFolders = inventoryFolder.RequestListOfFolderImpls(); | ||
191 | List<InventoryItemBase> items = inventoryFolder.RequestListOfItems(); | ||
192 | |||
193 | /* | ||
194 | Dictionary identicalFolderNames = new Dictionary<string, int>(); | ||
187 | 195 | ||
188 | foreach (InventoryFolderImpl folder in inventories) | 196 | foreach (InventoryFolderImpl folder in inventories) |
189 | { | 197 | { |
190 | saveInvDir(folder, newPath); | 198 | |
199 | if (!identicalFolderNames.ContainsKey(folder.Name)) | ||
200 | identicalFolderNames[folder.Name] = 0; | ||
201 | else | ||
202 | identicalFolderNames[folder.Name] = identicalFolderNames[folder.Name]++; | ||
203 | |||
204 | int folderNameNumber = identicalFolderName[folder.Name]; | ||
205 | |||
206 | SaveInvDir( | ||
207 | folder, | ||
208 | string.Format( | ||
209 | "{0}{1}{2}/", | ||
210 | path, InventoryArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, folderNameNumber)); | ||
211 | } | ||
212 | */ | ||
213 | |||
214 | foreach (InventoryFolderImpl childFolder in childFolders) | ||
215 | { | ||
216 | SaveInvDir(childFolder, path); | ||
191 | } | 217 | } |
218 | |||
192 | foreach (InventoryItemBase item in items) | 219 | foreach (InventoryItemBase item in items) |
193 | { | 220 | { |
194 | saveInvItem(item, newPath); | 221 | SaveInvItem(item, path); |
195 | } | 222 | } |
196 | } | 223 | } |
197 | 224 | ||
@@ -270,7 +297,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
270 | inventoryItem.Name, inventoryItem.ID, m_invPath); | 297 | inventoryItem.Name, inventoryItem.ID, m_invPath); |
271 | 298 | ||
272 | //get and export item info | 299 | //get and export item info |
273 | saveInvItem(inventoryItem, m_invPath); | 300 | SaveInvItem(inventoryItem, m_invPath); |
274 | } | 301 | } |
275 | } | 302 | } |
276 | else | 303 | else |
@@ -280,7 +307,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
280 | inventoryFolder.Name, inventoryFolder.ID, m_invPath); | 307 | inventoryFolder.Name, inventoryFolder.ID, m_invPath); |
281 | 308 | ||
282 | //recurse through all dirs getting dirs and files | 309 | //recurse through all dirs getting dirs and files |
283 | saveInvDir(inventoryFolder, InventoryArchiveConstants.INVENTORY_PATH); | 310 | SaveInvDir(inventoryFolder, InventoryArchiveConstants.INVENTORY_PATH); |
284 | } | 311 | } |
285 | 312 | ||
286 | new AssetsRequest(assetUuids.Keys, m_module.CommsManager.AssetCache, ReceivedAllAssets).Execute(); | 313 | new AssetsRequest(assetUuids.Keys, m_module.CommsManager.AssetCache, ReceivedAllAssets).Execute(); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index cb613f7..5cc0340 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs | |||
@@ -124,15 +124,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
124 | MemoryStream archiveReadStream = new MemoryStream(archive); | 124 | MemoryStream archiveReadStream = new MemoryStream(archive); |
125 | TarArchiveReader tar = new TarArchiveReader(archiveReadStream); | 125 | TarArchiveReader tar = new TarArchiveReader(archiveReadStream); |
126 | 126 | ||
127 | InventoryFolderImpl objectsFolder = userInfo.RootFolder.FindFolderByPath("Objects"); | ||
128 | |||
127 | //bool gotControlFile = false; | 129 | //bool gotControlFile = false; |
128 | bool gotObject1File = false; | 130 | bool gotObject1File = false; |
129 | //bool gotObject2File = false; | 131 | //bool gotObject2File = false; |
130 | string expectedObject1FilePath = string.Format( | 132 | string expectedObject1FilePath = string.Format( |
131 | "{0}{1}{2}_{3}.xml", | 133 | "{0}{1}/{2}_{3}.xml", |
132 | InventoryArchiveConstants.INVENTORY_PATH, | 134 | InventoryArchiveConstants.INVENTORY_PATH, |
133 | "Objects/", | 135 | string.Format( |
136 | "Objects{0}{1}", InventoryArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, objectsFolder.ID), | ||
134 | item1.Name, | 137 | item1.Name, |
135 | item1Id); | 138 | item1Id); |
139 | |||
136 | /* | 140 | /* |
137 | string expectedObject2FileName = string.Format( | 141 | string expectedObject2FileName = string.Format( |
138 | "{0}_{1:000}-{2:000}-{3:000}__{4}.xml", | 142 | "{0}_{1:000}-{2:000}-{3:000}__{4}.xml", |
@@ -146,6 +150,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
146 | 150 | ||
147 | while (tar.ReadEntry(out filePath, out tarEntryType) != null) | 151 | while (tar.ReadEntry(out filePath, out tarEntryType) != null) |
148 | { | 152 | { |
153 | Console.WriteLine("Got {0}", filePath); | ||
154 | |||
149 | /* | 155 | /* |
150 | if (ArchiveConstants.CONTROL_FILE_PATH == filePath) | 156 | if (ArchiveConstants.CONTROL_FILE_PATH == filePath) |
151 | { | 157 | { |
@@ -153,7 +159,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
153 | } | 159 | } |
154 | */ | 160 | */ |
155 | if (filePath.StartsWith(InventoryArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml")) | 161 | if (filePath.StartsWith(InventoryArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml")) |
156 | { | 162 | { |
157 | //string fileName = filePath.Remove(0, "Objects/".Length); | 163 | //string fileName = filePath.Remove(0, "Objects/".Length); |
158 | 164 | ||
159 | //if (fileName.StartsWith(part1.Name)) | 165 | //if (fileName.StartsWith(part1.Name)) |