opensim – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 eva 1 /*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27  
28 using System;
29 using System.Collections.Generic;
30 using OpenMetaverse;
31 using log4net;
32 using Nini.Config;
33 using System.Reflection;
34 using OpenSim.Services.Base;
35 using OpenSim.Services.Interfaces;
36 using OpenSim.Data;
37 using OpenSim.Framework;
38  
39 namespace OpenSim.Services.InventoryService
40 {
41 public class XInventoryService : ServiceBase, IInventoryService
42 {
43 private static readonly ILog m_log =
44 LogManager.GetLogger(
45 MethodBase.GetCurrentMethod().DeclaringType);
46  
47 protected IXInventoryData m_Database;
48 protected bool m_AllowDelete = true;
49 protected string m_ConfigName = "InventoryService";
50  
51 public XInventoryService(IConfigSource config)
52 : this(config, "InventoryService")
53 {
54 }
55  
56 public XInventoryService(IConfigSource config, string configName) : base(config)
57 {
58 if (configName != string.Empty)
59 m_ConfigName = configName;
60  
61 string dllName = String.Empty;
62 string connString = String.Empty;
63 //string realm = "Inventory"; // OSG version doesn't use this
64  
65 //
66 // Try reading the [InventoryService] section first, if it exists
67 //
68 IConfig authConfig = config.Configs[m_ConfigName];
69 if (authConfig != null)
70 {
71 dllName = authConfig.GetString("StorageProvider", dllName);
72 connString = authConfig.GetString("ConnectionString", connString);
73 m_AllowDelete = authConfig.GetBoolean("AllowDelete", true);
74 // realm = authConfig.GetString("Realm", realm);
75 }
76  
77 //
78 // Try reading the [DatabaseService] section, if it exists
79 //
80 IConfig dbConfig = config.Configs["DatabaseService"];
81 if (dbConfig != null)
82 {
83 if (dllName == String.Empty)
84 dllName = dbConfig.GetString("StorageProvider", String.Empty);
85 if (connString == String.Empty)
86 connString = dbConfig.GetString("ConnectionString", String.Empty);
87 }
88  
89 //
90 // We tried, but this doesn't exist. We can't proceed.
91 //
92 if (dllName == String.Empty)
93 throw new Exception("No StorageProvider configured");
94  
95 m_Database = LoadPlugin<IXInventoryData>(dllName,
96 new Object[] {connString, String.Empty});
97  
98 if (m_Database == null)
99 throw new Exception("Could not find a storage interface in the given module");
100 }
101  
102 public virtual bool CreateUserInventory(UUID principalID)
103 {
104 // This is braindeaad. We can't ever communicate that we fixed
105 // an existing inventory. Well, just return root folder status,
106 // but check sanity anyway.
107 //
108 bool result = false;
109  
110 InventoryFolderBase rootFolder = GetRootFolder(principalID);
111  
112 if (rootFolder == null)
113 {
114 rootFolder = ConvertToOpenSim(CreateFolder(principalID, UUID.Zero, (int)AssetType.RootFolder, "My Inventory"));
115 result = true;
116 }
117  
118 XInventoryFolder[] sysFolders = GetSystemFolders(principalID, rootFolder.ID);
119  
120 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Animation) return true; return false; }))
121 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Animation, "Animations");
122 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Bodypart) return true; return false; }))
123 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Bodypart, "Body Parts");
124 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.CallingCard) return true; return false; }))
125 CreateFolder(principalID, rootFolder.ID, (int)AssetType.CallingCard, "Calling Cards");
126 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Clothing) return true; return false; }))
127 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Clothing, "Clothing");
128 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Gesture) return true; return false; }))
129 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Gesture, "Gestures");
130 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Landmark) return true; return false; }))
131 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Landmark, "Landmarks");
132 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.LostAndFoundFolder) return true; return false; }))
133 CreateFolder(principalID, rootFolder.ID, (int)AssetType.LostAndFoundFolder, "Lost And Found");
134 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Notecard) return true; return false; }))
135 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Notecard, "Notecards");
136 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Object) return true; return false; }))
137 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Object, "Objects");
138 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.SnapshotFolder) return true; return false; }))
139 CreateFolder(principalID, rootFolder.ID, (int)AssetType.SnapshotFolder, "Photo Album");
140 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.LSLText) return true; return false; }))
141 CreateFolder(principalID, rootFolder.ID, (int)AssetType.LSLText, "Scripts");
142 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Sound) return true; return false; }))
143 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Sound, "Sounds");
144 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Texture) return true; return false; }))
145 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Texture, "Textures");
146 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.TrashFolder) return true; return false; }))
147 CreateFolder(principalID, rootFolder.ID, (int)AssetType.TrashFolder, "Trash");
148  
149 return result;
150 }
151  
152 protected XInventoryFolder CreateFolder(UUID principalID, UUID parentID, int type, string name)
153 {
154 XInventoryFolder newFolder = new XInventoryFolder();
155  
156 newFolder.folderName = name;
157 newFolder.type = type;
158 newFolder.version = 1;
159 newFolder.folderID = UUID.Random();
160 newFolder.agentID = principalID;
161 newFolder.parentFolderID = parentID;
162  
163 m_Database.StoreFolder(newFolder);
164  
165 return newFolder;
166 }
167  
168 protected virtual XInventoryFolder[] GetSystemFolders(UUID principalID, UUID rootID)
169 {
170 // m_log.DebugFormat("[XINVENTORY SERVICE]: Getting system folders for {0}", principalID);
171  
172 XInventoryFolder[] allFolders = m_Database.GetFolders(
173 new string[] { "agentID", "parentFolderID" },
174 new string[] { principalID.ToString(), rootID.ToString() });
175  
176 XInventoryFolder[] sysFolders = Array.FindAll(
177 allFolders,
178 delegate (XInventoryFolder f)
179 {
180 if (f.type > 0)
181 return true;
182 return false;
183 });
184  
185 // m_log.DebugFormat(
186 // "[XINVENTORY SERVICE]: Found {0} system folders for {1}", sysFolders.Length, principalID);
187  
188 return sysFolders;
189 }
190  
191 public virtual List<InventoryFolderBase> GetInventorySkeleton(UUID principalID)
192 {
193 XInventoryFolder[] allFolders = m_Database.GetFolders(
194 new string[] { "agentID" },
195 new string[] { principalID.ToString() });
196  
197 if (allFolders.Length == 0)
198 return null;
199  
200 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
201  
202 foreach (XInventoryFolder x in allFolders)
203 {
204 //m_log.DebugFormat("[XINVENTORY SERVICE]: Adding folder {0} to skeleton", x.folderName);
205 folders.Add(ConvertToOpenSim(x));
206 }
207  
208 return folders;
209 }
210  
211 public virtual InventoryFolderBase GetRootFolder(UUID principalID)
212 {
213 XInventoryFolder[] folders = m_Database.GetFolders(
214 new string[] { "agentID", "parentFolderID"},
215 new string[] { principalID.ToString(), UUID.Zero.ToString() });
216  
217 if (folders.Length == 0)
218 return null;
219  
220 XInventoryFolder root = null;
221 foreach (XInventoryFolder folder in folders)
222 {
223 if (folder.folderName == "My Inventory")
224 {
225 root = folder;
226 break;
227 }
228 }
229  
230 if (root == null) // oops
231 root = folders[0];
232  
233 return ConvertToOpenSim(root);
234 }
235  
236 public virtual InventoryFolderBase GetFolderForType(UUID principalID, AssetType type)
237 {
238 // m_log.DebugFormat("[XINVENTORY SERVICE]: Getting folder type {0} for user {1}", type, principalID);
239  
240 InventoryFolderBase rootFolder = GetRootFolder(principalID);
241  
242 if (rootFolder == null)
243 {
244 m_log.WarnFormat(
245 "[XINVENTORY]: Found no root folder for {0} in GetFolderForType() when looking for {1}",
246 principalID, type);
247  
248 return null;
249 }
250  
251 return GetSystemFolderForType(rootFolder, type);
252 }
253  
254 private InventoryFolderBase GetSystemFolderForType(InventoryFolderBase rootFolder, AssetType type)
255 {
256 // m_log.DebugFormat("[XINVENTORY SERVICE]: Getting folder type {0} for user {1}", type, principalID);
257  
258 if (type == AssetType.RootFolder)
259 return rootFolder;
260  
261 XInventoryFolder[] folders = m_Database.GetFolders(
262 new string[] { "agentID", "parentFolderID", "type"},
263 new string[] { rootFolder.Owner.ToString(), rootFolder.ID.ToString(), ((int)type).ToString() });
264  
265 if (folders.Length == 0)
266 {
267 // m_log.WarnFormat("[XINVENTORY SERVICE]: Found no folder for type {0} for user {1}", type, principalID);
268 return null;
269 }
270  
271 // m_log.DebugFormat(
272 // "[XINVENTORY SERVICE]: Found folder {0} {1} for type {2} for user {3}",
273 // folders[0].folderName, folders[0].folderID, type, principalID);
274  
275 return ConvertToOpenSim(folders[0]);
276 }
277  
278 public virtual InventoryCollection GetFolderContent(UUID principalID, UUID folderID)
279 {
280 // This method doesn't receive a valud principal id from the
281 // connector. So we disregard the principal and look
282 // by ID.
283 //
284 //m_log.DebugFormat("[XINVENTORY SERVICE]: Fetch contents for folder {0}", folderID.ToString());
285 InventoryCollection inventory = new InventoryCollection();
286 inventory.UserID = principalID;
287 inventory.Folders = new List<InventoryFolderBase>();
288 inventory.Items = new List<InventoryItemBase>();
289  
290 XInventoryFolder[] folders = m_Database.GetFolders(
291 new string[] { "parentFolderID"},
292 new string[] { folderID.ToString() });
293  
294 foreach (XInventoryFolder x in folders)
295 {
296 //m_log.DebugFormat("[XINVENTORY]: Adding folder {0} to response", x.folderName);
297 inventory.Folders.Add(ConvertToOpenSim(x));
298 }
299  
300 XInventoryItem[] items = m_Database.GetItems(
301 new string[] { "parentFolderID"},
302 new string[] { folderID.ToString() });
303  
304 foreach (XInventoryItem i in items)
305 {
306 //m_log.DebugFormat("[XINVENTORY]: Adding item {0} to response", i.inventoryName);
307 inventory.Items.Add(ConvertToOpenSim(i));
308 }
309  
310 return inventory;
311 }
312  
313 public virtual List<InventoryItemBase> GetFolderItems(UUID principalID, UUID folderID)
314 {
315 // m_log.DebugFormat("[XINVENTORY]: Fetch items for folder {0}", folderID);
316  
317 // Since we probably don't get a valid principal here, either ...
318 //
319 List<InventoryItemBase> invItems = new List<InventoryItemBase>();
320  
321 XInventoryItem[] items = m_Database.GetItems(
322 new string[] { "parentFolderID" },
323 new string[] { folderID.ToString() });
324  
325 foreach (XInventoryItem i in items)
326 invItems.Add(ConvertToOpenSim(i));
327  
328 return invItems;
329 }
330  
331 public virtual bool AddFolder(InventoryFolderBase folder)
332 {
333 // m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID);
334  
335 InventoryFolderBase check = GetFolder(folder);
336 if (check != null)
337 return false;
338  
339 if (folder.Type != (short)AssetType.Folder && folder.Type != (short)AssetType.Unknown)
340 {
341 InventoryFolderBase rootFolder = GetRootFolder(folder.Owner);
342  
343 if (rootFolder == null)
344 {
345 m_log.WarnFormat(
346 "[XINVENTORY]: Found no root folder for {0} in AddFolder() when looking for {1}",
347 folder.Owner, folder.Type);
348  
349 return false;
350 }
351  
352 // Check we're not trying to add this as a system folder.
353 if (folder.ParentID == rootFolder.ID)
354 {
355 InventoryFolderBase existingSystemFolder
356 = GetSystemFolderForType(rootFolder, (AssetType)folder.Type);
357  
358 if (existingSystemFolder != null)
359 {
360 m_log.WarnFormat(
361 "[XINVENTORY]: System folder of type {0} already exists when tried to add {1} to {2} for {3}",
362 folder.Type, folder.Name, folder.ParentID, folder.Owner);
363  
364 return false;
365 }
366 }
367 }
368  
369 XInventoryFolder xFolder = ConvertFromOpenSim(folder);
370 return m_Database.StoreFolder(xFolder);
371 }
372  
373 public virtual bool UpdateFolder(InventoryFolderBase folder)
374 {
375 // m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID);
376  
377 XInventoryFolder xFolder = ConvertFromOpenSim(folder);
378 InventoryFolderBase check = GetFolder(folder);
379  
380 if (check == null)
381 return AddFolder(folder);
382  
383 if ((check.Type != (short)AssetType.Unknown || xFolder.type != (short)AssetType.Unknown)
384 && (check.Type != (short)AssetType.OutfitFolder || xFolder.type != (short)AssetType.OutfitFolder))
385 {
386 if (xFolder.version < check.Version)
387 {
388 // m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version);
389 return false;
390 }
391  
392 check.Version = (ushort)xFolder.version;
393 xFolder = ConvertFromOpenSim(check);
394  
395 // m_log.DebugFormat(
396 // "[XINVENTORY]: Storing version only update to system folder {0} {1} {2}",
397 // xFolder.folderName, xFolder.version, xFolder.type);
398  
399 return m_Database.StoreFolder(xFolder);
400 }
401  
402 if (xFolder.version < check.Version)
403 xFolder.version = check.Version;
404  
405 xFolder.folderID = check.ID;
406  
407 return m_Database.StoreFolder(xFolder);
408 }
409  
410 public virtual bool MoveFolder(InventoryFolderBase folder)
411 {
412 return m_Database.MoveFolder(folder.ID.ToString(), folder.ParentID.ToString());
413 }
414  
415 // We don't check the principal's ID here
416 //
417 public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs)
418 {
419 return DeleteFolders(principalID, folderIDs, true);
420 }
421  
422 public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs, bool onlyIfTrash)
423 {
424 if (!m_AllowDelete)
425 return false;
426  
427 // Ignore principal ID, it's bogus at connector level
428 //
429 foreach (UUID id in folderIDs)
430 {
431 if (onlyIfTrash && !ParentIsTrash(id))
432 continue;
433 //m_log.InfoFormat("[XINVENTORY SERVICE]: Delete folder {0}", id);
434 InventoryFolderBase f = new InventoryFolderBase();
435 f.ID = id;
436 PurgeFolder(f, onlyIfTrash);
437 m_Database.DeleteFolders("folderID", id.ToString());
438 }
439  
440 return true;
441 }
442  
443 public virtual bool PurgeFolder(InventoryFolderBase folder)
444 {
445 return PurgeFolder(folder, true);
446 }
447  
448 public virtual bool PurgeFolder(InventoryFolderBase folder, bool onlyIfTrash)
449 {
450 if (!m_AllowDelete)
451 return false;
452  
453 if (onlyIfTrash && !ParentIsTrash(folder.ID))
454 return false;
455  
456 XInventoryFolder[] subFolders = m_Database.GetFolders(
457 new string[] { "parentFolderID" },
458 new string[] { folder.ID.ToString() });
459  
460 foreach (XInventoryFolder x in subFolders)
461 {
462 PurgeFolder(ConvertToOpenSim(x), onlyIfTrash);
463 m_Database.DeleteFolders("folderID", x.folderID.ToString());
464 }
465  
466 m_Database.DeleteItems("parentFolderID", folder.ID.ToString());
467  
468 return true;
469 }
470  
471 public virtual bool AddItem(InventoryItemBase item)
472 {
473 // m_log.DebugFormat(
474 // "[XINVENTORY SERVICE]: Adding item {0} {1} to folder {2} for {3}", item.Name, item.ID, item.Folder, item.Owner);
475  
476 return m_Database.StoreItem(ConvertFromOpenSim(item));
477 }
478  
479 public virtual bool UpdateItem(InventoryItemBase item)
480 {
481 if (!m_AllowDelete)
482 if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder)
483 return false;
484  
485 // m_log.InfoFormat(
486 // "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder);
487  
488 InventoryItemBase retrievedItem = GetItem(item);
489  
490 if (retrievedItem == null)
491 {
492 m_log.WarnFormat(
493 "[XINVENTORY SERVICE]: Tried to update item {0} {1}, owner {2} but no existing item found.",
494 item.Name, item.ID, item.Owner);
495  
496 return false;
497 }
498  
499 // Do not allow invariants to change. Changes to folder ID occur in MoveItems()
500 if (retrievedItem.InvType != item.InvType
501 || retrievedItem.AssetType != item.AssetType
502 || retrievedItem.Folder != item.Folder
503 || retrievedItem.CreatorIdentification != item.CreatorIdentification
504 || retrievedItem.Owner != item.Owner)
505 {
506 m_log.WarnFormat(
507 "[XINVENTORY SERVICE]: Caller to UpdateItem() for {0} {1} tried to alter property(s) that should be invariant, (InvType, AssetType, Folder, CreatorIdentification, Owner), existing ({2}, {3}, {4}, {5}, {6}), update ({7}, {8}, {9}, {10}, {11})",
508 retrievedItem.Name,
509 retrievedItem.ID,
510 retrievedItem.InvType,
511 retrievedItem.AssetType,
512 retrievedItem.Folder,
513 retrievedItem.CreatorIdentification,
514 retrievedItem.Owner,
515 item.InvType,
516 item.AssetType,
517 item.Folder,
518 item.CreatorIdentification,
519 item.Owner);
520  
521 item.InvType = retrievedItem.InvType;
522 item.AssetType = retrievedItem.AssetType;
523 item.Folder = retrievedItem.Folder;
524 item.CreatorIdentification = retrievedItem.CreatorIdentification;
525 item.Owner = retrievedItem.Owner;
526 }
527  
528 return m_Database.StoreItem(ConvertFromOpenSim(item));
529 }
530  
531 public virtual bool MoveItems(UUID principalID, List<InventoryItemBase> items)
532 {
533 // Principal is b0rked. *sigh*
534 //
535 foreach (InventoryItemBase i in items)
536 {
537 m_Database.MoveItem(i.ID.ToString(), i.Folder.ToString());
538 }
539  
540 return true;
541 }
542  
543 public virtual bool DeleteItems(UUID principalID, List<UUID> itemIDs)
544 {
545 if (!m_AllowDelete)
546 {
547 // We must still allow links and links to folders to be deleted, otherwise they will build up
548 // in the player's inventory until they can no longer log in. Deletions of links due to code bugs or
549 // similar is inconvenient but on a par with accidental movement of items. The original item is never
550 // touched.
551 foreach (UUID id in itemIDs)
552 {
553 if (!m_Database.DeleteItems(
554 new string[] { "inventoryID", "assetType" },
555 new string[] { id.ToString(), ((sbyte)AssetType.Link).ToString() }))
556 {
557 m_Database.DeleteItems(
558 new string[] { "inventoryID", "assetType" },
559 new string[] { id.ToString(), ((sbyte)AssetType.LinkFolder).ToString() });
560 }
561 }
562 }
563 else
564 {
565 // Just use the ID... *facepalms*
566 //
567 foreach (UUID id in itemIDs)
568 m_Database.DeleteItems("inventoryID", id.ToString());
569 }
570  
571 return true;
572 }
573  
574 public virtual InventoryItemBase GetItem(InventoryItemBase item)
575 {
576 XInventoryItem[] items = m_Database.GetItems(
577 new string[] { "inventoryID" },
578 new string[] { item.ID.ToString() });
579  
580 if (items.Length == 0)
581 return null;
582  
583 return ConvertToOpenSim(items[0]);
584 }
585  
586 public virtual InventoryFolderBase GetFolder(InventoryFolderBase folder)
587 {
588 XInventoryFolder[] folders = m_Database.GetFolders(
589 new string[] { "folderID"},
590 new string[] { folder.ID.ToString() });
591  
592 if (folders.Length == 0)
593 return null;
594  
595 return ConvertToOpenSim(folders[0]);
596 }
597  
598 public virtual List<InventoryItemBase> GetActiveGestures(UUID principalID)
599 {
600 XInventoryItem[] items = m_Database.GetActiveGestures(principalID);
601  
602 if (items.Length == 0)
603 return new List<InventoryItemBase>();
604  
605 List<InventoryItemBase> ret = new List<InventoryItemBase>();
606  
607 foreach (XInventoryItem x in items)
608 ret.Add(ConvertToOpenSim(x));
609  
610 return ret;
611 }
612  
613 public virtual int GetAssetPermissions(UUID principalID, UUID assetID)
614 {
615 return m_Database.GetAssetPermissions(principalID, assetID);
616 }
617  
618 public virtual InventoryCollection GetUserInventory(UUID userID)
619 {
620 InventoryCollection userInventory = new InventoryCollection();
621 userInventory.UserID = userID;
622 userInventory.Folders = new List<InventoryFolderBase>();
623 userInventory.Items = new List<InventoryItemBase>();
624  
625 List<InventoryFolderBase> skel = GetInventorySkeleton(userID);
626 if (skel != null)
627 {
628 foreach (InventoryFolderBase f in skel)
629 {
630 InventoryCollection c = GetFolderContent(userID, f.ID);
631 if (c != null && c.Items != null && c.Items.Count > 0)
632 userInventory.Items.AddRange(c.Items);
633 if (c != null && c.Folders != null && c.Folders.Count > 0)
634 userInventory.Folders.AddRange(c.Folders);
635 }
636 }
637 m_log.DebugFormat("[XINVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items",
638 userID, userInventory.Folders.Count, userInventory.Items.Count);
639 return userInventory;
640 }
641  
642 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
643 {
644 }
645  
646 // Unused.
647 //
648 public bool HasInventoryForUser(UUID userID)
649 {
650 return false;
651 }
652  
653 // CM Helpers
654 //
655 protected InventoryFolderBase ConvertToOpenSim(XInventoryFolder folder)
656 {
657 InventoryFolderBase newFolder = new InventoryFolderBase();
658  
659 newFolder.ParentID = folder.parentFolderID;
660 newFolder.Type = (short)folder.type;
661 // Viewer can't understand anything that's not in it's LLFolderType enum
662 if (newFolder.Type == 100)
663 newFolder.Type = -1;
664 newFolder.Version = (ushort)folder.version;
665 newFolder.Name = folder.folderName;
666 newFolder.Owner = folder.agentID;
667 newFolder.ID = folder.folderID;
668  
669 return newFolder;
670 }
671  
672 protected XInventoryFolder ConvertFromOpenSim(InventoryFolderBase folder)
673 {
674 XInventoryFolder newFolder = new XInventoryFolder();
675  
676 newFolder.parentFolderID = folder.ParentID;
677 newFolder.type = (int)folder.Type;
678 newFolder.version = (int)folder.Version;
679 newFolder.folderName = folder.Name;
680 newFolder.agentID = folder.Owner;
681 newFolder.folderID = folder.ID;
682  
683 return newFolder;
684 }
685  
686 protected InventoryItemBase ConvertToOpenSim(XInventoryItem item)
687 {
688 InventoryItemBase newItem = new InventoryItemBase();
689  
690 newItem.AssetID = item.assetID;
691 newItem.AssetType = item.assetType;
692 newItem.Name = item.inventoryName;
693 newItem.Owner = item.avatarID;
694 newItem.ID = item.inventoryID;
695 newItem.InvType = item.invType;
696 newItem.Folder = item.parentFolderID;
697 newItem.CreatorIdentification = item.creatorID;
698 newItem.Description = item.inventoryDescription;
699 newItem.NextPermissions = (uint)item.inventoryNextPermissions;
700 newItem.CurrentPermissions = (uint)item.inventoryCurrentPermissions;
701 newItem.BasePermissions = (uint)item.inventoryBasePermissions;
702 newItem.EveryOnePermissions = (uint)item.inventoryEveryOnePermissions;
703 newItem.GroupPermissions = (uint)item.inventoryGroupPermissions;
704 newItem.GroupID = item.groupID;
705 if (item.groupOwned == 0)
706 newItem.GroupOwned = false;
707 else
708 newItem.GroupOwned = true;
709 newItem.SalePrice = item.salePrice;
710 newItem.SaleType = (byte)item.saleType;
711 newItem.Flags = (uint)item.flags;
712 newItem.CreationDate = item.creationDate;
713  
714 return newItem;
715 }
716  
717 protected XInventoryItem ConvertFromOpenSim(InventoryItemBase item)
718 {
719 XInventoryItem newItem = new XInventoryItem();
720  
721 newItem.assetID = item.AssetID;
722 newItem.assetType = item.AssetType;
723 newItem.inventoryName = item.Name;
724 newItem.avatarID = item.Owner;
725 newItem.inventoryID = item.ID;
726 newItem.invType = item.InvType;
727 newItem.parentFolderID = item.Folder;
728 newItem.creatorID = item.CreatorIdentification;
729 newItem.inventoryDescription = item.Description;
730 newItem.inventoryNextPermissions = (int)item.NextPermissions;
731 newItem.inventoryCurrentPermissions = (int)item.CurrentPermissions;
732 newItem.inventoryBasePermissions = (int)item.BasePermissions;
733 newItem.inventoryEveryOnePermissions = (int)item.EveryOnePermissions;
734 newItem.inventoryGroupPermissions = (int)item.GroupPermissions;
735 newItem.groupID = item.GroupID;
736 if (item.GroupOwned)
737 newItem.groupOwned = 1;
738 else
739 newItem.groupOwned = 0;
740 newItem.salePrice = item.SalePrice;
741 newItem.saleType = (int)item.SaleType;
742 newItem.flags = (int)item.Flags;
743 newItem.creationDate = item.CreationDate;
744  
745 return newItem;
746 }
747  
748 private bool ParentIsTrash(UUID folderID)
749 {
750 XInventoryFolder[] folder = m_Database.GetFolders(new string[] {"folderID"}, new string[] {folderID.ToString()});
751 if (folder.Length < 1)
752 return false;
753  
754 if (folder[0].type == (int)AssetType.TrashFolder)
755 return true;
756  
757 UUID parentFolder = folder[0].parentFolderID;
758  
759 while (parentFolder != UUID.Zero)
760 {
761 XInventoryFolder[] parent = m_Database.GetFolders(new string[] {"folderID"}, new string[] {parentFolder.ToString()});
762 if (parent.Length < 1)
763 return false;
764  
765 if (parent[0].type == (int)AssetType.TrashFolder)
766 return true;
767 if (parent[0].type == (int)AssetType.RootFolder)
768 return false;
769  
770 parentFolder = parent[0].parentFolderID;
771 }
772 return false;
773 }
774 }
775 }