diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-07 10:35:07 -0400 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-07 10:35:07 -0400 |
commit | 41694a902dc8cfebebb6e23691d41cb5627fa5a1 (patch) | |
tree | 66217c9ff07d7858aed64fd657379fbb4af432d1 | |
parent | d847b9dc3fdbc0a17ca4a1191955699505940f65 (diff) |
SH-4216 WIP - broke up the onAISUpdateReceived monolith
-rwxr-xr-x | indra/newview/llinventorymodel.cpp | 252 |
1 files changed, 149 insertions, 103 deletions
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 532d3a3495..3c7539a7f9 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1154,70 +1154,70 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat, notifyObservers(); } -void parse_llsd_uuid_array(const LLSD& content, const std::string& name, uuid_vec_t& ids) +class AISUpdate { - 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 LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLSD& update) -{ - if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) - { - dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update); - } +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; - // Track changes to descendent counts for accounting. - std::map<LLUUID,S32> cat_deltas; typedef std::map<LLUUID,LLPointer<LLViewerInventoryItem> > deferred_item_map_t; - deferred_item_map_t items_created; - deferred_item_map_t items_updated; - std::set<LLUUID> objects_deleted; + deferred_item_map_t mItemsCreated; + deferred_item_map_t mItemsUpdated; - // parse _categories_removed -> objects_deleted + 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; - parse_llsd_uuid_array(update,"_categories_removed",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 = getCategory(*it); - cat_deltas[cat->getParentUUID()]--; - objects_deleted.insert(*it); + LLViewerInventoryCategory *cat = gInventory.getCategory(*it); + mCatDeltas[cat->getParentUUID()]--; + mObjectsDeleted.insert(*it); } - // parse _categories_items_removed -> objects_deleted + // parse _categories_items_removed -> mObjectsDeleted uuid_vec_t item_ids; - parse_llsd_uuid_array(update,"_category_items_removed",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 = getItem(*it); - cat_deltas[item->getParentUUID()]--; - objects_deleted.insert(*it); + LLViewerInventoryItem *item = gInventory.getItem(*it); + mCatDeltas[item->getParentUUID()]--; + mObjectsDeleted.insert(*it); } - // parse _broken_links_removed -> objects_deleted + // parse _broken_links_removed -> mObjectsDeleted uuid_vec_t broken_link_ids; - parse_llsd_uuid_array(update,"_broken_links_removed",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 = getItem(*it); - cat_deltas[item->getParentUUID()]--; - objects_deleted.insert(*it); + LLViewerInventoryItem *item = gInventory.getItem(*it); + mCatDeltas[item->getParentUUID()]--; + mObjectsDeleted.insert(*it); } // parse _created_items - uuid_vec_t created_item_ids; - parse_llsd_uuid_array(update,"_created_items",created_item_ids); + parseUUIDArray(update,"_created_items",mItemsCreatedIds); if (update.has("_embedded")) { @@ -1227,48 +1227,13 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS it != end; ++it) { const std::string& field = (*it).first; - + // parse created links if (field == "link") { const LLSD& links = embedded["link"]; - 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(created_item_ids.begin(), - created_item_ids.end(),link_id); - if (pos != created_item_ids.end()) - { - 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; - items_created[link_id] = new_link; - const LLUUID& parent_id = new_link->getParentUUID(); - cat_deltas[parent_id]++; - } - else - { - llwarns << "failed to unpack" << llendl; - } - } - else - { - LL_DEBUGS("Inventory") << "Ignoring link not in created items list " << link_id << llendl; - } - } - } + parseCreatedLinks(links); + } else { llwarns << "unrecognized embedded field " << field << llendl; @@ -1285,11 +1250,11 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS BOOL rv = new_item->unpackMessage(update); if (rv) { - items_updated[item_id] = new_item; + 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. - cat_deltas[new_item->getParentUUID()]; + mCatDeltas[new_item->getParentUUID()]; } else { @@ -1297,10 +1262,86 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS } } + // 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 = cat_deltas.begin(); - catit != cat_deltas.end(); ++catit) + for (std::map<LLUUID,S32>::const_iterator catit = mCatDeltas.begin(); + catit != mCatDeltas.end(); ++catit) { const LLUUID cat_id(catit->first); S32 delta = catit->second; @@ -1311,27 +1352,22 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS // 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. - const std::string& ucv = "_updated_category_versions"; - if (update.has(ucv)) + for (uuid_int_map_t::iterator ucv_it = mCatVersions.begin(); + ucv_it != mCatVersions.end(); ++ucv_it) { - for(LLSD::map_const_iterator it = update[ucv].beginMap(), - end = update[ucv].endMap(); - it != end; ++it) + const LLUUID id = ucv_it->first; + S32 version = ucv_it->second; + LLViewerInventoryCategory *cat = gInventory.getCategory(id); + if (cat->getVersion() != version) { - const LLUUID id((*it).first); - S32 version = (*it).second.asInteger(); - LLViewerInventoryCategory *cat = gInventory.getCategory(id); - if (cat->getVersion() != version) - { - llwarns << "Possible version mismatch, viewer " << cat->getVersion() - << " server " << version << llendl; - } + llwarns << "Possible version mismatch, viewer " << cat->getVersion() + << " server " << version << llendl; } } // CREATE ITEMS - for (deferred_item_map_t::const_iterator create_it = items_created.begin(); - create_it != items_created.end(); ++create_it) + 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; @@ -1344,8 +1380,8 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS } // UPDATE ITEMS - for (deferred_item_map_t::const_iterator update_it = items_updated.begin(); - update_it != items_updated.end(); ++update_it) + 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; @@ -1357,13 +1393,23 @@ void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLS } // DELETE OBJECTS - for (std::set<LLUUID>::const_iterator del_it = objects_deleted.begin(); - del_it != objects_deleted.end(); ++del_it) + for (std::set<LLUUID>::const_iterator del_it = mObjectsDeleted.begin(); + del_it != mObjectsDeleted.end(); ++del_it) { LL_DEBUGS("Inventory") << "deleted item " << *del_it << llendl; - onObjectDeletedFromServer(*del_it, false, false); + gInventory.onObjectDeletedFromServer(*del_it, false, false); + } +} + +void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLSD& update) +{ + if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) + { + dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update); } + AISUpdate ais_update(update); // parse update llsd into stuff to do. + ais_update.doUpdate(); // execute the updates in the appropriate order. } void LLInventoryModel::onItemUpdated(const LLUUID& item_id, const LLSD& updates, bool update_parent_version) |