summaryrefslogtreecommitdiff
path: root/indra/newview/llinventorymodel.cpp
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2013-06-07 12:58:04 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2013-06-07 12:58:04 -0400
commit89e3959cf393ce9eeb058304264d4f55f4fe9ca2 (patch)
treea5a96828ef79d33890fb5bd6efc485c17563580f /indra/newview/llinventorymodel.cpp
parent41694a902dc8cfebebb6e23691d41cb5627fa5a1 (diff)
SH-4216 WIP - moved AISv3 commands and responders to llaisapi.* files
Diffstat (limited to 'indra/newview/llinventorymodel.cpp')
-rwxr-xr-xindra/newview/llinventorymodel.cpp248
1 files changed, 1 insertions, 247 deletions
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 3c7539a7f9..6dc193292e 100755
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llinventorymodel.h"
+#include "llaisapi.h"
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
@@ -1154,253 +1155,6 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
notifyObservers();
}
-class AISUpdate
-{
-public:
- AISUpdate(const LLSD& update);
- void parseUpdate(const LLSD& update);
- void parseUUIDArray(const LLSD& content, const std::string& name, uuid_vec_t& ids);
- void parseLink(const LLUUID& link_id, const LLSD& link_map);
- void parseCreatedLinks(const LLSD& links);
- void doUpdate();
-private:
- typedef std::map<LLUUID,S32> uuid_int_map_t;
- uuid_int_map_t mCatDeltas;
- uuid_int_map_t mCatVersions;
-
- typedef std::map<LLUUID,LLPointer<LLViewerInventoryItem> > deferred_item_map_t;
- deferred_item_map_t mItemsCreated;
- deferred_item_map_t mItemsUpdated;
-
- std::set<LLUUID> mObjectsDeleted;
- uuid_vec_t mItemsCreatedIds;
-};
-
-AISUpdate::AISUpdate(const LLSD& update)
-{
- parseUpdate(update);
-}
-
-void AISUpdate::parseUpdate(const LLSD& update)
-{
- // parse _categories_removed -> mObjectsDeleted
- uuid_vec_t cat_ids;
- parseUUIDArray(update,"_categories_removed",cat_ids);
- for (uuid_vec_t::const_iterator it = cat_ids.begin();
- it != cat_ids.end(); ++it)
- {
- LLViewerInventoryCategory *cat = gInventory.getCategory(*it);
- mCatDeltas[cat->getParentUUID()]--;
- mObjectsDeleted.insert(*it);
- }
-
- // parse _categories_items_removed -> mObjectsDeleted
- uuid_vec_t item_ids;
- parseUUIDArray(update,"_category_items_removed",item_ids);
- for (uuid_vec_t::const_iterator it = item_ids.begin();
- it != item_ids.end(); ++it)
- {
- LLViewerInventoryItem *item = gInventory.getItem(*it);
- mCatDeltas[item->getParentUUID()]--;
- mObjectsDeleted.insert(*it);
- }
-
- // parse _broken_links_removed -> mObjectsDeleted
- uuid_vec_t broken_link_ids;
- parseUUIDArray(update,"_broken_links_removed",broken_link_ids);
- for (uuid_vec_t::const_iterator it = broken_link_ids.begin();
- it != broken_link_ids.end(); ++it)
- {
- LLViewerInventoryItem *item = gInventory.getItem(*it);
- mCatDeltas[item->getParentUUID()]--;
- mObjectsDeleted.insert(*it);
- }
-
- // parse _created_items
- parseUUIDArray(update,"_created_items",mItemsCreatedIds);
-
- if (update.has("_embedded"))
- {
- const LLSD& embedded = update["_embedded"];
- for(LLSD::map_const_iterator it = embedded.beginMap(),
- end = embedded.endMap();
- it != end; ++it)
- {
- const std::string& field = (*it).first;
-
- // parse created links
- if (field == "link")
- {
- const LLSD& links = embedded["link"];
- parseCreatedLinks(links);
- }
- else
- {
- llwarns << "unrecognized embedded field " << field << llendl;
- }
- }
-
- }
-
- // Parse item update at the top level.
- if (update.has("item_id"))
- {
- LLUUID item_id = update["item_id"].asUUID();
- LLPointer<LLViewerInventoryItem> new_item(new LLViewerInventoryItem);
- BOOL rv = new_item->unpackMessage(update);
- if (rv)
- {
- mItemsUpdated[item_id] = new_item;
- // This statement is here to cause a new entry with 0
- // delta to be created if it does not already exist;
- // otherwise has no effect.
- mCatDeltas[new_item->getParentUUID()];
- }
- else
- {
- llerrs << "unpack failed" << llendl;
- }
- }
-
- // Parse updated category versions.
- const std::string& ucv = "_updated_category_versions";
- if (update.has(ucv))
- {
- for(LLSD::map_const_iterator it = update[ucv].beginMap(),
- end = update[ucv].endMap();
- it != end; ++it)
- {
- const LLUUID id((*it).first);
- S32 version = (*it).second.asInteger();
- mCatVersions[id] = version;
- }
- }
-}
-
-void AISUpdate::parseUUIDArray(const LLSD& content, const std::string& name, uuid_vec_t& ids)
-{
- ids.clear();
- if (content.has(name))
- {
- for(LLSD::array_const_iterator it = content[name].beginArray(),
- end = content[name].endArray();
- it != end; ++it)
- {
- ids.push_back((*it).asUUID());
- }
- }
-}
-
-void AISUpdate::parseLink(const LLUUID& link_id, const LLSD& link_map)
-{
- LLPointer<LLViewerInventoryItem> new_link(new LLViewerInventoryItem);
- BOOL rv = new_link->unpackMessage(link_map);
- if (rv)
- {
- LLPermissions default_perms;
- default_perms.init(gAgent.getID(),gAgent.getID(),LLUUID::null,LLUUID::null);
- default_perms.initMasks(PERM_NONE,PERM_NONE,PERM_NONE,PERM_NONE,PERM_NONE);
- new_link->setPermissions(default_perms);
- LLSaleInfo default_sale_info;
- new_link->setSaleInfo(default_sale_info);
- //LL_DEBUGS("Inventory") << "creating link from llsd: " << ll_pretty_print_sd(link_map) << llendl;
- mItemsCreated[link_id] = new_link;
- const LLUUID& parent_id = new_link->getParentUUID();
- mCatDeltas[parent_id]++;
- }
- else
- {
- llwarns << "failed to parse" << llendl;
- }
-}
-
-void AISUpdate::parseCreatedLinks(const LLSD& links)
-{
- for(LLSD::map_const_iterator linkit = links.beginMap(),
- linkend = links.endMap();
- linkit != linkend; ++linkit)
- {
- const LLUUID link_id((*linkit).first);
- const LLSD& link_map = (*linkit).second;
- uuid_vec_t::const_iterator pos =
- std::find(mItemsCreatedIds.begin(),
- mItemsCreatedIds.end(),link_id);
- if (pos != mItemsCreatedIds.end())
- {
- parseLink(link_id,link_map);
- }
- else
- {
- LL_DEBUGS("Inventory") << "Ignoring link not in created items list " << link_id << llendl;
- }
- }
-}
-
-void AISUpdate::doUpdate()
-{
- // Do descendent/version accounting.
- // Can remove this if/when we use the version info directly.
- for (std::map<LLUUID,S32>::const_iterator catit = mCatDeltas.begin();
- catit != mCatDeltas.end(); ++catit)
- {
- const LLUUID cat_id(catit->first);
- S32 delta = catit->second;
- LLInventoryModel::LLCategoryUpdate up(cat_id, delta);
- gInventory.accountForUpdate(up);
- }
-
- // TODO - how can we use this version info? Need to be sure all
- // changes are going through AIS first, or at least through
- // something with a reliable responder.
- for (uuid_int_map_t::iterator ucv_it = mCatVersions.begin();
- ucv_it != mCatVersions.end(); ++ucv_it)
- {
- const LLUUID id = ucv_it->first;
- S32 version = ucv_it->second;
- LLViewerInventoryCategory *cat = gInventory.getCategory(id);
- if (cat->getVersion() != version)
- {
- llwarns << "Possible version mismatch, viewer " << cat->getVersion()
- << " server " << version << llendl;
- }
- }
-
- // CREATE ITEMS
- for (deferred_item_map_t::const_iterator create_it = mItemsCreated.begin();
- create_it != mItemsCreated.end(); ++create_it)
- {
- LLUUID item_id(create_it->first);
- LLPointer<LLViewerInventoryItem> new_item = create_it->second;
-
- // FIXME risky function since it calls updateServer() in some
- // cases. Maybe break out the update/create cases, in which
- // case this is create.
- LL_DEBUGS("Inventory") << "created item " << item_id << llendl;
- gInventory.updateItem(new_item);
- }
-
- // UPDATE ITEMS
- for (deferred_item_map_t::const_iterator update_it = mItemsUpdated.begin();
- update_it != mItemsUpdated.end(); ++update_it)
- {
- LLUUID item_id(update_it->first);
- LLPointer<LLViewerInventoryItem> new_item = update_it->second;
- // FIXME risky function since it calls updateServer() in some
- // cases. Maybe break out the update/create cases, in which
- // case this is update.
- LL_DEBUGS("Inventory") << "updated item " << item_id << llendl;
- gInventory.updateItem(new_item);
- }
-
- // DELETE OBJECTS
- for (std::set<LLUUID>::const_iterator del_it = mObjectsDeleted.begin();
- del_it != mObjectsDeleted.end(); ++del_it)
- {
- LL_DEBUGS("Inventory") << "deleted item " << *del_it << llendl;
- gInventory.onObjectDeletedFromServer(*del_it, false, false);
- }
-}
-
void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLSD& update)
{
if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))