/// <summary> /// <see cref="OpenSim.Framework.Communications.IInventoryServices"></see> /// </summary> /// <param name="userID"></param> /// <param name="callback"></param> public void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback) { if (!m_RequestingInventory.ContainsKey(userID)) { m_RequestingInventory.Add(userID, callback); try { m_log.InfoFormat( "[OGS1 INVENTORY SERVICE]: Requesting inventory from {0}/GetInventory/ for user {1}", _inventoryServerUrl, userID); RestObjectPosterResponse <InventoryCollection> requester = new RestObjectPosterResponse <InventoryCollection>(); requester.ResponseCallback = InventoryResponse; requester.BeginPostObject <Guid>(_inventoryServerUrl + "/GetInventory/", userID.Guid); } catch (WebException e) { if (StatsManager.SimExtraStats != null) { StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); } m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: Request inventory operation failed, {0} {1}", e.Source, e.Message); } } else { m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: RequestInventoryForUser() - could you not find user profile for {0}", userID); } }
/// <summary> /// <see cref="OpenSim.Framework.Communications.IInventoryServices"></see> /// </summary> /// <param name="userID"></param> /// <param name="callback"></param> public void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback) { if (!m_RequestingInventory.ContainsKey(userID)) { m_RequestingInventory.Add(userID, callback); try { m_log.InfoFormat( "[OGS1 INVENTORY SERVICE]: Requesting inventory from {0}/GetInventory/ for user {1}", _inventoryServerUrl, userID); RestObjectPosterResponse<InventoryCollection> requester = new RestObjectPosterResponse<InventoryCollection>(); requester.ResponseCallback = InventoryResponse; requester.BeginPostObject<Guid>(_inventoryServerUrl + "/GetInventory/", userID.Guid); } catch (WebException e) { if (StatsManager.SimExtraStats != null) StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: Request inventory operation failed, {0} {1}", e.Source, e.Message); } } else { m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: RequestInventoryForUser() - could you not find user profile for {0}", userID); } }
public override void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback) { m_log.InfoFormat("[LOCAL INVENTORY SERVICE]: Requesting inventory for user {0}", userID); List <InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID); if (skeletonFolders == null) { return; } InventoryFolderImpl rootFolder = null; List <InventoryFolderImpl> folders = new List <InventoryFolderImpl>(); List <InventoryItemBase> allItems = RequestAllItems(userID); Dictionary <UUID, InventoryFolderImpl> sortedFolders = new Dictionary <UUID, InventoryFolderImpl>(); List <InventoryItemBase> folderItems = new List <InventoryItemBase>(); // Need to retrieve the root folder on the first pass foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ParentID == UUID.Zero) { rootFolder = new InventoryFolderImpl(folder); folders.Add(rootFolder); sortedFolders.Add(folder.ID, rootFolder); //items.AddRange(RequestFolderItems(rootFolder.ID)); break; // Only 1 root folder per user } } if (rootFolder != null) { foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ID != rootFolder.ID) { InventoryFolderImpl fimpl = new InventoryFolderImpl(folder); folders.Add(fimpl); sortedFolders.Add(fimpl.ID, fimpl); } } foreach (InventoryItemBase item in allItems) { if (sortedFolders.ContainsKey(item.Folder)) { folderItems.Add(item); } } } m_log.InfoFormat( "[LOCAL INVENTORY SERVICE]: Received inventory response for user {0} containing {1} folders and {2} items", userID, folders.Count, folderItems.Count); callback(folders, folderItems); }
/// <summary> /// Caller must catch eventual Exceptions. /// </summary> /// <param name="userID"></param> /// <param name="sessionID"></param> /// <param name="callback"></param> public void GetUserInventory(string userIDStr, UUID sessionID, InventoryReceiptCallback callback) { UUID userID = UUID.Zero; if (UUID.TryParse(userIDStr, out userID)) { lock (m_RequestingInventory) { // *HACK ALERT* // If an inventory request times out, it blocks any further requests from the // same user, even after a relog. This is bad, and makes me sad. // Really, we should detect a timeout and report a failure to the callback, // BUT in my testing i found that it's hard to detect a timeout.. sometimes, // a partial response is recieved, and sometimes a null response. // So, for now, add a timer of ten seconds (which is the request timeout). // This should basically have the same effect. lock (m_RequestTime) { if (m_RequestTime.ContainsKey(userID)) { TimeSpan interval = DateTime.Now - m_RequestTime[userID]; if (interval.TotalSeconds > 10) { m_RequestTime.Remove(userID); if (m_RequestingInventory.ContainsKey(userID)) { m_RequestingInventory.Remove(userID); } } } if (!m_RequestingInventory.ContainsKey(userID)) { m_RequestTime.Add(userID, DateTime.Now); m_RequestingInventory.Add(userID, callback); } else { m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetUserInventory - ignoring repeated request for user {0}", userID); return; } } } m_log.InfoFormat( "[INVENTORY CONNECTOR]: Requesting inventory from {0}/GetInventory/ for user {1}", m_ServerURI, userID); RestSessionObjectPosterResponse <Guid, InventoryCollection> requester = new RestSessionObjectPosterResponse <Guid, InventoryCollection>(); requester.ResponseCallback = InventoryResponse; requester.BeginPostObject(m_ServerURI + "/GetInventory/", userID.Guid, sessionID.ToString(), userID.ToString()); } }
public void RequestInventoryForUser(UUID userID, UUID session_id, InventoryReceiptCallback callback) { if (IsLocalStandaloneUser(userID)) { base.RequestInventoryForUser(userID, callback); return; } // grid/hypergrid mode lock (m_RequestingInventory) { if (!m_RequestingInventory.ContainsKey(userID)) { m_RequestingInventory.Add(userID, callback); } else { m_log.ErrorFormat("[HGrid INVENTORY SERVICE]: RequestInventoryForUser() - could not find user profile for {0}", userID); return; } } string invServer = GetUserInventoryURI(userID); m_log.InfoFormat( "[HGrid INVENTORY SERVICE]: Requesting inventory from {0}/GetInventory/ for user {1} ({2})", /*_inventoryServerUrl*/ invServer, userID, userID.Guid); try { //RestSessionObjectPosterResponse<Guid, InventoryCollection> requester // = new RestSessionObjectPosterResponse<Guid, InventoryCollection>(); //requester.ResponseCallback = InventoryResponse; //requester.BeginPostObject(invServer + "/GetInventory/", userID.Guid, session_id.ToString(), userID.ToString()); GetInventoryDelegate d = GetInventoryAsync; d.BeginInvoke(invServer, userID, session_id, GetInventoryCompleted, d); } catch (WebException e) { if (StatsManager.SimExtraStats != null) { StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); } m_log.ErrorFormat("[HGrid INVENTORY SERVICE]: Request inventory operation failed, {0} {1}", e.Source, e.Message); // Well, let's synthesize one InventoryCollection icol = new InventoryCollection(); icol.UserID = userID; icol.Items = new List <InventoryItemBase>(); icol.Folders = new List <InventoryFolderBase>(); InventoryFolderBase rootFolder = new InventoryFolderBase(); rootFolder.ID = UUID.Random(); rootFolder.Owner = userID; icol.Folders.Add(rootFolder); InventoryResponse(icol); } }
/// <summary> /// Callback used by the inventory server GetInventory request /// </summary> /// <param name="userID"></param> private void InventoryResponse(InventoryCollection response) { UUID userID = response.UserID; if (m_RequestingInventory.ContainsKey(userID)) { m_log.InfoFormat("[OGS1 INVENTORY SERVICE]: " + "Received inventory response for user {0} containing {1} folders and {2} items", userID, response.Folders.Count, response.Items.Count); InventoryFolderImpl rootFolder = null; InventoryReceiptCallback callback = m_RequestingInventory[userID]; ICollection <InventoryFolderImpl> folders = new List <InventoryFolderImpl>(); ICollection <InventoryItemBase> items = new List <InventoryItemBase>(); foreach (InventoryFolderBase folder in response.Folders) { if (folder.ParentID == UUID.Zero) { rootFolder = new InventoryFolderImpl(folder); folders.Add(rootFolder); break; } } if (rootFolder != null) { foreach (InventoryFolderBase folder in response.Folders) { if (folder.ID != rootFolder.ID) { folders.Add(new InventoryFolderImpl(folder)); } } foreach (InventoryItemBase item in response.Items) { items.Add(item); } } else { m_log.ErrorFormat("[OGS1 INVENTORY SERVICE]: Did not get back an inventory containing a root folder for user {0}", userID); } callback(folders, items); m_RequestingInventory.Remove(userID); } else { m_log.WarnFormat( "[OGS1 INVENTORY SERVICE]: " + "Received inventory response for {0} for which we do not have a record of requesting!", userID); } }
public void GetUserInventory(string id, UUID sessionID, InventoryReceiptCallback callback) { m_log.Debug("[HGInventory]: GetUserInventory " + id); string url = string.Empty; string userID = string.Empty; if (StringToUrlAndUserID(id, out url, out userID)) { ISessionAuthInventoryService connector = GetConnector(url); connector.GetUserInventory(userID, sessionID, callback); } }
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { if (IsLocalGridUser(userID)) { m_GridService.GetUserInventory(userID, callback); } else { UUID sessionID = GetSessionID(userID); string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); m_HGService.GetUserInventory(uri, sessionID, callback); } }
public override void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback) { m_log.InfoFormat("[LOCAL INVENTORY SERVICE]: Requesting inventory for user {0}", userID); List<InventoryFolderImpl> folders = new List<InventoryFolderImpl>(); List<InventoryItemBase> items = new List<InventoryItemBase>(); List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID); if (skeletonFolders != null) { InventoryFolderImpl rootFolder = null; // Need to retrieve the root folder on the first pass foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ParentID == UUID.Zero) { rootFolder = new InventoryFolderImpl(folder); folders.Add(rootFolder); items.AddRange(RequestFolderItems(rootFolder.ID)); break; // Only 1 root folder per user } } if (rootFolder != null) { foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ID != rootFolder.ID) { folders.Add(new InventoryFolderImpl(folder)); items.AddRange(RequestFolderItems(folder.ID)); } } } m_log.InfoFormat( "[LOCAL INVENTORY SERVICE]: Received inventory response for user {0} containing {1} folders and {2} items", userID, folders.Count, items.Count); } else { m_log.WarnFormat("[LOCAL INVENTORY SERVICE]: User {0} inventory not available", userID); } callback(folders, items); }
/// <summary> /// Asynchronous inventory fetch. /// </summary> /// <param name="userID"></param> /// <param name="callback"></param> public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { m_log.InfoFormat("[INVENTORY SERVICE]: Requesting inventory for user {0}", userID); List <InventoryFolderImpl> folders = new List <InventoryFolderImpl>(); List <InventoryItemBase> items = new List <InventoryItemBase>(); List <InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID); if (skeletonFolders != null) { InventoryFolderImpl rootFolder = null; // Need to retrieve the root folder on the first pass foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ParentID == UUID.Zero) { rootFolder = new InventoryFolderImpl(folder); folders.Add(rootFolder); items.AddRange(GetFolderItems(userID, rootFolder.ID)); break; // Only 1 root folder per user } } if (rootFolder != null) { foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ID != rootFolder.ID) { folders.Add(new InventoryFolderImpl(folder)); items.AddRange(GetFolderItems(userID, folder.ID)); } } } m_log.InfoFormat( "[INVENTORY SERVICE]: Received inventory response for user {0} containing {1} folders and {2} items", userID, folders.Count, items.Count); } else { m_log.WarnFormat("[INVENTORY SERVICE]: User {0} inventory not available", userID); } Util.FireAndForget(delegate { callback(folders, items); }); }
public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { UUID sessionID = GetSessionID(userID); try { m_RemoteConnector.GetUserInventory(userID.ToString(), sessionID, callback); } catch (Exception e) { if (StatsManager.SimExtraStats != null) { StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); } m_log.ErrorFormat("[INVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}", e.Source, e.Message); } }
public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { if (IsLocalGridUser(userID)) m_GridService.GetUserInventory(userID, callback); else { UUID sessionID = GetSessionID(userID); string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); m_HGService.GetUserInventory(uri, sessionID, callback); } }
public override void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback) { }
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { m_log.Error("[SIMIAN INVENTORY CONNECTOR]: Obsolete GetUserInventory called for " + userID); callback(new List <InventoryFolderImpl>(0), new List <InventoryItemBase>(0)); }
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { }
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { m_InventoryService.GetUserInventory(userID, callback); }
public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { m_log.Error("[SIMIAN INVENTORY CONNECTOR]: Obsolete GetUserInventory called for " + userID); callback(new List<InventoryFolderImpl>(0), new List<InventoryItemBase>(0)); }
public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback) { }
public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { UUID sessionID = GetSessionID(userID); try { m_RemoteConnector.GetUserInventory(userID.ToString(), sessionID, callback); } catch (Exception e) { if (StatsManager.SimExtraStats != null) StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); m_log.ErrorFormat("[INVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}", e.Source, e.Message); } }
// See IInventoryServices public abstract void RequestInventoryForUser(UUID userID, InventoryReceiptCallback callback);
/// <summary> /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the /// inventory has been received /// </summary> /// <param name="userID"></param> /// <param name="callback"></param> public abstract void GetUserInventory(UUID userID, InventoryReceiptCallback callback);
/// <summary> /// Caller must catch eventual Exceptions. /// </summary> /// <param name="userID"></param> /// <param name="sessionID"></param> /// <param name="callback"></param> public void GetUserInventory(string userIDStr, UUID sessionID, InventoryReceiptCallback callback) { UUID userID = UUID.Zero; if (UUID.TryParse(userIDStr, out userID)) { lock (m_RequestingInventory) { // *HACK ALERT* // If an inventory request times out, it blocks any further requests from the // same user, even after a relog. This is bad, and makes me sad. // Really, we should detect a timeout and report a failure to the callback, // BUT in my testing i found that it's hard to detect a timeout.. sometimes, // a partial response is recieved, and sometimes a null response. // So, for now, add a timer of ten seconds (which is the request timeout). // This should basically have the same effect. lock (m_RequestTime) { if (m_RequestTime.ContainsKey(userID)) { TimeSpan interval = DateTime.Now - m_RequestTime[userID]; if (interval.TotalSeconds > 10) { m_RequestTime.Remove(userID); if (m_RequestingInventory.ContainsKey(userID)) { m_RequestingInventory.Remove(userID); } } } if (!m_RequestingInventory.ContainsKey(userID)) { m_RequestTime.Add(userID, DateTime.Now); m_RequestingInventory.Add(userID, callback); } else { m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetUserInventory - ignoring repeated request for user {0}", userID); return; } } } m_log.InfoFormat( "[INVENTORY CONNECTOR]: Requesting inventory from {0}/GetInventory/ for user {1}", m_ServerURI, userID); RestSessionObjectPosterResponse<Guid, InventoryCollection> requester = new RestSessionObjectPosterResponse<Guid, InventoryCollection>(); requester.ResponseCallback = InventoryResponse; requester.BeginPostObject(m_ServerURI + "/GetInventory/", userID.Guid, sessionID.ToString(), userID.ToString()); } }