diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs | 82 |
1 files changed, 58 insertions, 24 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs index 47e34dc..0d90a15 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveUtils.cs | |||
@@ -149,14 +149,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
149 | 149 | ||
150 | /// <summary> | 150 | /// <summary> |
151 | /// Find an item given a PATH_DELIMITOR delimited path starting from the user's root folder. | 151 | /// Find an item given a PATH_DELIMITOR delimited path starting from the user's root folder. |
152 | /// | 152 | /// </summary> |
153 | /// <remarks> | ||
153 | /// This method does not handle paths that contain multiple delimitors | 154 | /// This method does not handle paths that contain multiple delimitors |
154 | /// | 155 | /// |
155 | /// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some | 156 | /// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some |
156 | /// XPath like expression | 157 | /// XPath like expression |
157 | /// | 158 | /// |
158 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. | 159 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. |
159 | /// </summary> | 160 | /// </remarks> |
160 | /// | 161 | /// |
161 | /// <param name="inventoryService"> | 162 | /// <param name="inventoryService"> |
162 | /// Inventory service to query | 163 | /// Inventory service to query |
@@ -178,32 +179,66 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
178 | 179 | ||
179 | return FindItemByPath(inventoryService, rootFolder, path); | 180 | return FindItemByPath(inventoryService, rootFolder, path); |
180 | } | 181 | } |
181 | 182 | ||
182 | /// <summary> | 183 | /// <summary> |
183 | /// Find an item given a PATH_DELIMITOR delimited path starting from this folder. | 184 | /// Find an item given a PATH_DELIMITOR delimited path starting from this folder. |
184 | /// | 185 | /// </summary> |
185 | /// This method does not handle paths that contain multiple delimitors | 186 | /// <remarks> |
187 | /// This method does not handle paths that contain multiple delimiters | ||
186 | /// | 188 | /// |
187 | /// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some | 189 | /// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some |
188 | /// XPath like expression | 190 | /// XPath like expression |
189 | /// | 191 | /// |
190 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. | 192 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. |
191 | /// </summary> | 193 | /// </remarks> |
192 | /// | 194 | /// |
193 | /// <param name="inventoryService"> | 195 | /// <param name="inventoryService">Inventory service to query</param> |
194 | /// Inventory service to query | 196 | /// <param name="startFolder">The folder from which the path starts</param> |
195 | /// </param> | 197 | /// <param name="path">The path to the required item.</param> |
196 | /// <param name="startFolder"> | ||
197 | /// The folder from which the path starts | ||
198 | /// </param> | ||
199 | /// <param name="path"> | ||
200 | /// <param name="path"> | ||
201 | /// The path to the required item. | ||
202 | /// </param> | ||
203 | /// <returns>null if the item is not found</returns> | 198 | /// <returns>null if the item is not found</returns> |
204 | public static InventoryItemBase FindItemByPath( | 199 | public static InventoryItemBase FindItemByPath( |
205 | IInventoryService inventoryService, InventoryFolderBase startFolder, string path) | 200 | IInventoryService inventoryService, InventoryFolderBase startFolder, string path) |
206 | { | 201 | { |
202 | List<InventoryItemBase> foundItems = FindItemsByPath(inventoryService, startFolder, path); | ||
203 | |||
204 | if (foundItems.Count != 0) | ||
205 | return foundItems[0]; | ||
206 | else | ||
207 | return null; | ||
208 | } | ||
209 | |||
210 | public static List<InventoryItemBase> FindItemsByPath( | ||
211 | IInventoryService inventoryService, UUID userId, string path) | ||
212 | { | ||
213 | InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId); | ||
214 | |||
215 | if (null == rootFolder) | ||
216 | return new List<InventoryItemBase>(); | ||
217 | |||
218 | return FindItemsByPath(inventoryService, rootFolder, path); | ||
219 | } | ||
220 | |||
221 | /// <summary> | ||
222 | /// Find items that match a given PATH_DELIMITOR delimited path starting from this folder. | ||
223 | /// </summary> | ||
224 | /// <remarks> | ||
225 | /// This method does not handle paths that contain multiple delimiters | ||
226 | /// | ||
227 | /// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some | ||
228 | /// XPath like expression | ||
229 | /// | ||
230 | /// FIXME: Delimitors which occur in names themselves are not currently escapable. | ||
231 | /// </remarks> | ||
232 | /// | ||
233 | /// <param name="inventoryService">Inventory service to query</param> | ||
234 | /// <param name="startFolder">The folder from which the path starts</param> | ||
235 | /// <param name="path">The path to the required item.</param> | ||
236 | /// <returns>The items that were found with this path. An empty list if no items were found.</returns> | ||
237 | public static List<InventoryItemBase> FindItemsByPath( | ||
238 | IInventoryService inventoryService, InventoryFolderBase startFolder, string path) | ||
239 | { | ||
240 | List<InventoryItemBase> foundItems = new List<InventoryItemBase>(); | ||
241 | |||
207 | // If the path isn't just / then trim any starting extraneous slashes | 242 | // If the path isn't just / then trim any starting extraneous slashes |
208 | path = path.TrimStart(new char[] { PATH_DELIMITER }); | 243 | path = path.TrimStart(new char[] { PATH_DELIMITER }); |
209 | 244 | ||
@@ -215,11 +250,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
215 | if (components.Length == 1) | 250 | if (components.Length == 1) |
216 | { | 251 | { |
217 | // m_log.DebugFormat( | 252 | // m_log.DebugFormat( |
218 | // "FOUND SINGLE COMPONENT [{0}]. Looking for this in [{1}] {2}", | 253 | // "FOUND SINGLE COMPONENT [{0}]. Looking for this in [{1}] {2}", |
219 | // components[0], startFolder.Name, startFolder.ID); | 254 | // components[0], startFolder.Name, startFolder.ID); |
220 | 255 | ||
221 | List<InventoryItemBase> items = inventoryService.GetFolderItems(startFolder.Owner, startFolder.ID); | 256 | List<InventoryItemBase> items = inventoryService.GetFolderItems(startFolder.Owner, startFolder.ID); |
222 | 257 | ||
223 | // m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Found {0} items in FindItemByPath()", items.Count); | 258 | // m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Found {0} items in FindItemByPath()", items.Count); |
224 | 259 | ||
225 | foreach (InventoryItemBase item in items) | 260 | foreach (InventoryItemBase item in items) |
@@ -227,24 +262,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
227 | // m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Inspecting item {0} {1}", item.Name, item.ID); | 262 | // m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Inspecting item {0} {1}", item.Name, item.ID); |
228 | 263 | ||
229 | if (item.Name == components[0]) | 264 | if (item.Name == components[0]) |
230 | return item; | 265 | foundItems.Add(item); |
231 | } | 266 | } |
232 | } | 267 | } |
233 | else | 268 | else |
234 | { | 269 | { |
235 | // m_log.DebugFormat("FOUND COMPONENTS [{0}] and [{1}]", components[0], components[1]); | 270 | // m_log.DebugFormat("FOUND COMPONENTS [{0}] and [{1}]", components[0], components[1]); |
236 | 271 | ||
237 | InventoryCollection contents = inventoryService.GetFolderContent(startFolder.Owner, startFolder.ID); | 272 | InventoryCollection contents = inventoryService.GetFolderContent(startFolder.Owner, startFolder.ID); |
238 | 273 | ||
239 | foreach (InventoryFolderBase folder in contents.Folders) | 274 | foreach (InventoryFolderBase folder in contents.Folders) |
240 | { | 275 | { |
241 | if (folder.Name == components[0]) | 276 | if (folder.Name == components[0]) |
242 | return FindItemByPath(inventoryService, folder, components[1]); | 277 | foundItems.AddRange(FindItemsByPath(inventoryService, folder, components[1])); |
243 | } | 278 | } |
244 | } | 279 | } |
245 | 280 | ||
246 | // We didn't find an item or intermediate folder with the given name | 281 | return foundItems; |
247 | return null; | ||
248 | } | 282 | } |
249 | 283 | ||
250 | /// <summary> | 284 | /// <summary> |