RemoteInventoryServiceConnector.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  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. using log4net;
  28. using System;
  29. using System.Collections.Generic;
  30. using System.Reflection;
  31. using Nini.Config;
  32. using OpenSim.Framework;
  33. using OpenSim.Framework.Statistics;
  34. using OpenSim.Framework.Communications.Cache;
  35. using OpenSim.Services.Connectors;
  36. using OpenSim.Region.Framework.Interfaces;
  37. using OpenSim.Region.Framework.Scenes;
  38. using OpenSim.Services.Interfaces;
  39. using OpenMetaverse;
  40. namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
  41. {
  42. public class RemoteInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService
  43. {
  44. private static readonly ILog m_log =
  45. LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  46. private bool m_Enabled = false;
  47. private bool m_Initialized = false;
  48. private Scene m_Scene;
  49. private UserProfileCacheService m_UserProfileService;
  50. private InventoryServicesConnector m_RemoteConnector;
  51. public Type ReplaceableInterface
  52. {
  53. get { return null; }
  54. }
  55. public string Name
  56. {
  57. get { return "RemoteInventoryServicesConnector"; }
  58. }
  59. public RemoteInventoryServicesConnector()
  60. {
  61. }
  62. public RemoteInventoryServicesConnector(IConfigSource source)
  63. {
  64. Init(source);
  65. }
  66. protected override void Init(IConfigSource source)
  67. {
  68. m_RemoteConnector = new InventoryServicesConnector(source);
  69. base.Init(source);
  70. }
  71. #region ISharedRegionModule
  72. public void Initialise(IConfigSource source)
  73. {
  74. IConfig moduleConfig = source.Configs["Modules"];
  75. if (moduleConfig != null)
  76. {
  77. string name = moduleConfig.GetString("InventoryServices", "");
  78. if (name == Name)
  79. {
  80. Init(source);
  81. m_Enabled = true;
  82. m_log.Info("[INVENTORY CONNECTOR]: Remote inventory enabled");
  83. }
  84. }
  85. }
  86. public void PostInitialise()
  87. {
  88. }
  89. public void Close()
  90. {
  91. }
  92. public void AddRegion(Scene scene)
  93. {
  94. m_Scene = scene;
  95. //m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName);
  96. if (!m_Enabled)
  97. return;
  98. if (!m_Initialized)
  99. {
  100. // ugh!
  101. scene.CommsManager.UserProfileCacheService.SetInventoryService(this);
  102. scene.CommsManager.UserService.SetInventoryService(this);
  103. m_Initialized = true;
  104. }
  105. scene.RegisterModuleInterface<IInventoryService>(this);
  106. m_cache.AddRegion(scene);
  107. }
  108. public void RemoveRegion(Scene scene)
  109. {
  110. if (!m_Enabled)
  111. return;
  112. m_cache.RemoveRegion(scene);
  113. }
  114. public void RegionLoaded(Scene scene)
  115. {
  116. m_UserProfileService = m_Scene.CommsManager.UserProfileCacheService;
  117. if (m_UserProfileService != null)
  118. m_log.Debug("[XXXX] Set m_UserProfileService in " + m_Scene.RegionInfo.RegionName);
  119. if (!m_Enabled)
  120. return;
  121. m_log.InfoFormat("[INVENTORY CONNECTOR]: Enabled remote inventory for region {0}", scene.RegionInfo.RegionName);
  122. }
  123. #endregion ISharedRegionModule
  124. #region IInventoryService
  125. public override bool CreateUserInventory(UUID user)
  126. {
  127. return false;
  128. }
  129. public override List<InventoryFolderBase> GetInventorySkeleton(UUID userId)
  130. {
  131. return new List<InventoryFolderBase>();
  132. }
  133. public override InventoryCollection GetUserInventory(UUID userID)
  134. {
  135. return null;
  136. }
  137. public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
  138. {
  139. UUID sessionID = GetSessionID(userID);
  140. try
  141. {
  142. m_RemoteConnector.GetUserInventory(userID.ToString(), sessionID, callback);
  143. }
  144. catch (Exception e)
  145. {
  146. if (StatsManager.SimExtraStats != null)
  147. StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure();
  148. m_log.ErrorFormat("[INVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}",
  149. e.Source, e.Message);
  150. }
  151. }
  152. // inherited. See base class
  153. // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
  154. public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
  155. {
  156. UUID sessionID = GetSessionID(userID);
  157. return m_RemoteConnector.GetSystemFolders(userID.ToString(), sessionID);
  158. }
  159. public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
  160. {
  161. UUID sessionID = GetSessionID(userID);
  162. try
  163. {
  164. return m_RemoteConnector.GetFolderContent(userID.ToString(), folderID, sessionID);
  165. }
  166. catch (Exception e)
  167. {
  168. m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}",
  169. e.Source, e.Message);
  170. }
  171. InventoryCollection nullCollection = new InventoryCollection();
  172. nullCollection.Folders = new List<InventoryFolderBase>();
  173. nullCollection.Items = new List<InventoryItemBase>();
  174. nullCollection.UserID = userID;
  175. return nullCollection;
  176. }
  177. public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
  178. {
  179. UUID sessionID = GetSessionID(userID);
  180. return m_RemoteConnector.GetFolderItems(userID.ToString(), folderID, sessionID);
  181. }
  182. public override bool AddFolder(InventoryFolderBase folder)
  183. {
  184. if (folder == null)
  185. return false;
  186. UUID sessionID = GetSessionID(folder.Owner);
  187. return m_RemoteConnector.AddFolder(folder.Owner.ToString(), folder, sessionID);
  188. }
  189. public override bool UpdateFolder(InventoryFolderBase folder)
  190. {
  191. if (folder == null)
  192. return false;
  193. UUID sessionID = GetSessionID(folder.Owner);
  194. return m_RemoteConnector.UpdateFolder(folder.Owner.ToString(), folder, sessionID);
  195. }
  196. public override bool MoveFolder(InventoryFolderBase folder)
  197. {
  198. if (folder == null)
  199. return false;
  200. UUID sessionID = GetSessionID(folder.Owner);
  201. return m_RemoteConnector.MoveFolder(folder.Owner.ToString(), folder, sessionID);
  202. }
  203. public override bool DeleteFolders(UUID ownerID, List<UUID> folderIDs)
  204. {
  205. if (folderIDs == null)
  206. return false;
  207. if (folderIDs.Count == 0)
  208. return false;
  209. UUID sessionID = GetSessionID(ownerID);
  210. return m_RemoteConnector.DeleteFolders(ownerID.ToString(), folderIDs, sessionID);
  211. }
  212. public override bool PurgeFolder(InventoryFolderBase folder)
  213. {
  214. if (folder == null)
  215. return false;
  216. UUID sessionID = GetSessionID(folder.Owner);
  217. return m_RemoteConnector.PurgeFolder(folder.Owner.ToString(), folder, sessionID);
  218. }
  219. // public bool AddItem(InventoryItemBase item) inherited
  220. // Uses AddItemPlain
  221. protected override bool AddItemPlain(InventoryItemBase item)
  222. {
  223. if (item == null)
  224. return false;
  225. UUID sessionID = GetSessionID(item.Owner);
  226. return m_RemoteConnector.AddItem(item.Owner.ToString(), item, sessionID);
  227. }
  228. public override bool UpdateItem(InventoryItemBase item)
  229. {
  230. if (item == null)
  231. return false;
  232. UUID sessionID = GetSessionID(item.Owner);
  233. return m_RemoteConnector.UpdateItem(item.Owner.ToString(), item, sessionID);
  234. }
  235. public override bool MoveItems(UUID ownerID, List<InventoryItemBase> items)
  236. {
  237. if (items == null)
  238. return false;
  239. UUID sessionID = GetSessionID(ownerID);
  240. return m_RemoteConnector.MoveItems(ownerID.ToString(), items, sessionID);
  241. }
  242. public override bool DeleteItems(UUID ownerID, List<UUID> itemIDs)
  243. {
  244. if (itemIDs == null)
  245. return false;
  246. if (itemIDs.Count == 0)
  247. return true;
  248. UUID sessionID = GetSessionID(ownerID);
  249. return m_RemoteConnector.DeleteItems(ownerID.ToString(), itemIDs, sessionID);
  250. }
  251. public override InventoryItemBase GetItem(InventoryItemBase item)
  252. {
  253. if (item == null)
  254. return null;
  255. UUID sessionID = GetSessionID(item.Owner);
  256. return m_RemoteConnector.QueryItem(item.Owner.ToString(), item, sessionID);
  257. }
  258. public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
  259. {
  260. if (folder == null)
  261. return null;
  262. UUID sessionID = GetSessionID(folder.Owner);
  263. return m_RemoteConnector.QueryFolder(folder.Owner.ToString(), folder, sessionID);
  264. }
  265. public override bool HasInventoryForUser(UUID userID)
  266. {
  267. return false;
  268. }
  269. public override List<InventoryItemBase> GetActiveGestures(UUID userId)
  270. {
  271. return new List<InventoryItemBase>();
  272. }
  273. public override int GetAssetPermissions(UUID userID, UUID assetID)
  274. {
  275. UUID sessionID = GetSessionID(userID);
  276. return m_RemoteConnector.GetAssetPermissions(userID.ToString(), assetID, sessionID);
  277. }
  278. #endregion
  279. private UUID GetSessionID(UUID userID)
  280. {
  281. //if (m_Scene == null)
  282. //{
  283. // m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null");
  284. //}
  285. if (m_UserProfileService == null)
  286. {
  287. //m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null");
  288. return UUID.Zero;
  289. }
  290. CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
  291. if (uinfo != null)
  292. return uinfo.SessionID;
  293. m_log.DebugFormat("[INVENTORY CONNECTOR]: user profile for {0} not found", userID);
  294. return UUID.Zero;
  295. }
  296. }
  297. }