aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs249
1 files changed, 139 insertions, 110 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 69a4bd7..2ecb7d4 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -144,116 +144,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
144 } 144 }
145 else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH)) 145 else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH))
146 { 146 {
147 string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); 147 InventoryFolderImpl foundFolder
148 148 = ReplicateArchivePathToUserInventory(
149 // Remove the file portion if we aren't already dealing with a directory path 149 filePath, TarArchiveReader.TarEntryType.TYPE_DIRECTORY == entryType,
150 if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) 150 rootDestinationFolder, foldersCreated, nodesLoaded);
151 fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1);
152
153 string originalFsPath = fsPath;
154
155 m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath);
156
157 InventoryFolderImpl foundFolder = null;
158
159 // XXX: Nasty way of dealing with a path that has no directory component
160 if (fsPath.Length > 0)
161 {
162 while (null == foundFolder && fsPath.Length > 0)
163 {
164 if (foldersCreated.ContainsKey(fsPath))
165 {
166 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found previously created fs path {0}", fsPath);
167 foundFolder = foldersCreated[fsPath];
168 }
169 else
170 {
171 // Don't include the last slash
172 int penultimateSlashIndex = fsPath.LastIndexOf("/", fsPath.Length - 2);
173
174 if (penultimateSlashIndex >= 0)
175 {
176 fsPath = fsPath.Remove(penultimateSlashIndex + 1);
177 }
178 else
179 {
180 m_log.DebugFormat(
181 "[INVENTORY ARCHIVER]: Found no previously created fs path for {0}",
182 originalFsPath);
183 fsPath = string.Empty;
184 foundFolder = rootDestinationFolder;
185 }
186 }
187 }
188 }
189 else
190 {
191 foundFolder = rootDestinationFolder;
192 }
193
194 string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length);
195 string[] rawDirsToCreate
196 = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
197 int i = 0;
198
199 while (i < rawDirsToCreate.Length)
200 {
201 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]);
202
203 int identicalNameIdentifierIndex
204 = rawDirsToCreate[i].LastIndexOf(
205 ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR);
206 string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex);
207
208 UUID newFolderId = UUID.Random();
209 m_userInfo.CreateFolder(
210 folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
211 foundFolder = foundFolder.GetChildFolder(newFolderId);
212
213 // Record that we have now created this folder
214 fsPath += rawDirsToCreate[i] + "/";
215 m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath);
216 foldersCreated[fsPath] = foundFolder;
217
218 if (0 == i)
219 nodesLoaded.Add(foundFolder);
220
221 i++;
222 }
223
224 /*
225 string[] rawFolders = filePath.Split(new char[] { '/' });
226
227 // Find the folders that do exist along the path given
228 int i = 0;
229 bool noFolder = false;
230 InventoryFolderImpl foundFolder = rootDestinationFolder;
231 while (!noFolder && i < rawFolders.Length)
232 {
233 InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]);
234 if (null != folder)
235 {
236 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name);
237 foundFolder = folder;
238 i++;
239 }
240 else
241 {
242 noFolder = true;
243 }
244 }
245
246 // Create any folders that did not previously exist
247 while (i < rawFolders.Length)
248 {
249 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]);
250
251 UUID newFolderId = UUID.Random();
252 m_userInfo.CreateFolder(
253 rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
254 foundFolder = foundFolder.GetChildFolder(newFolderId);
255 }
256 */
257 151
258 if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) 152 if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
259 { 153 {
@@ -286,6 +180,141 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
286 180
287 return nodesLoaded; 181 return nodesLoaded;
288 } 182 }
183
184 /// <summary>
185 /// Replicate the inventory paths in the archive to the user's inventory as necessary.
186 /// </summary>
187 /// <param name="fsPath"></param>
188 /// <param name="isDir">Is the path we're dealing with a directory?</param>
189 /// <param name="rootDestinationFolder">The root folder for the inventory load</param>
190 /// <param name="foldersCreated">
191 /// The folders created so far. This method will add more folders if necessary
192 /// </param>
193 /// <param name="nodesLoaded">
194 /// Track the inventory nodes created. This is distinct from the folders created since for a particular folder
195 /// chain, only the root node needs to be recorded
196 /// </param>
197 /// <returns>The last user inventory folder created or found for the archive path</returns>
198 public InventoryFolderImpl ReplicateArchivePathToUserInventory(
199 string fsPath,
200 bool isDir,
201 InventoryFolderImpl rootDestinationFolder,
202 Dictionary <string, InventoryFolderImpl> foldersCreated,
203 List<InventoryNodeBase> nodesLoaded)
204 {
205 fsPath = fsPath.Substring(ArchiveConstants.INVENTORY_PATH.Length);
206
207 // Remove the file portion if we aren't already dealing with a directory path
208 if (!isDir)
209 fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1);
210
211 string originalFsPath = fsPath;
212
213 m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath);
214
215 InventoryFolderImpl foundFolder = null;
216
217 // XXX: Nasty way of dealing with a path that has no directory component
218 if (fsPath.Length > 0)
219 {
220 while (null == foundFolder && fsPath.Length > 0)
221 {
222 if (foldersCreated.ContainsKey(fsPath))
223 {
224 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found previously created fs path {0}", fsPath);
225 foundFolder = foldersCreated[fsPath];
226 }
227 else
228 {
229 // Don't include the last slash
230 int penultimateSlashIndex = fsPath.LastIndexOf("/", fsPath.Length - 2);
231
232 if (penultimateSlashIndex >= 0)
233 {
234 fsPath = fsPath.Remove(penultimateSlashIndex + 1);
235 }
236 else
237 {
238 m_log.DebugFormat(
239 "[INVENTORY ARCHIVER]: Found no previously created fs path for {0}",
240 originalFsPath);
241 fsPath = string.Empty;
242 foundFolder = rootDestinationFolder;
243 }
244 }
245 }
246 }
247 else
248 {
249 foundFolder = rootDestinationFolder;
250 }
251
252 string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length);
253 string[] rawDirsToCreate
254 = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
255 int i = 0;
256
257 while (i < rawDirsToCreate.Length)
258 {
259 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]);
260
261 int identicalNameIdentifierIndex
262 = rawDirsToCreate[i].LastIndexOf(
263 ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR);
264 string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex);
265
266 UUID newFolderId = UUID.Random();
267 m_userInfo.CreateFolder(
268 folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
269 foundFolder = foundFolder.GetChildFolder(newFolderId);
270
271 // Record that we have now created this folder
272 fsPath += rawDirsToCreate[i] + "/";
273 m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath);
274 foldersCreated[fsPath] = foundFolder;
275
276 if (0 == i)
277 nodesLoaded.Add(foundFolder);
278
279 i++;
280 }
281
282 return foundFolder;
283
284 /*
285 string[] rawFolders = filePath.Split(new char[] { '/' });
286
287 // Find the folders that do exist along the path given
288 int i = 0;
289 bool noFolder = false;
290 InventoryFolderImpl foundFolder = rootDestinationFolder;
291 while (!noFolder && i < rawFolders.Length)
292 {
293 InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]);
294 if (null != folder)
295 {
296 m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name);
297 foundFolder = folder;
298 i++;
299 }
300 else
301 {
302 noFolder = true;
303 }
304 }
305
306 // Create any folders that did not previously exist
307 while (i < rawFolders.Length)
308 {
309 m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]);
310
311 UUID newFolderId = UUID.Random();
312 m_userInfo.CreateFolder(
313 rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID);
314 foundFolder = foundFolder.GetChildFolder(newFolderId);
315 }
316 */
317 }
289 318
290 /// <summary> 319 /// <summary>
291 /// Load an asset 320 /// Load an asset