aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--linden/indra/newview/llfloateropenobject.cpp81
-rw-r--r--linden/indra/newview/llfloateropenobject.h15
-rw-r--r--linden/indra/newview/llinventorybridge.cpp18
-rw-r--r--linden/indra/newview/llinventorymodel.cpp119
-rw-r--r--linden/indra/newview/llinventorymodel.h8
-rw-r--r--linden/indra/newview/llviewerregion.cpp1
6 files changed, 210 insertions, 32 deletions
diff --git a/linden/indra/newview/llfloateropenobject.cpp b/linden/indra/newview/llfloateropenobject.cpp
index fc483dd..3e672b5 100644
--- a/linden/indra/newview/llfloateropenobject.cpp
+++ b/linden/indra/newview/llfloateropenobject.cpp
@@ -155,29 +155,76 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
155 { 155 {
156 parent_category_id = gAgent.getInventoryRootID(); 156 parent_category_id = gAgent.getInventoryRootID();
157 } 157 }
158
159 LLCategoryCreate* cat_data = new LLCategoryCreate(object_id, wear);
158 LLUUID category_id = gInventory.createNewCategory(parent_category_id, 160 LLUUID category_id = gInventory.createNewCategory(parent_category_id,
159 LLAssetType::AT_NONE, 161 LLAssetType::AT_NONE,
160 name); 162 name,
161 163 callbackCreateInventoryCategory,
162 LLCatAndWear* data = new LLCatAndWear; 164 (void*)cat_data);
163 data->mCatID = category_id; 165
164 data->mWear = wear;
165
166 // Copy and/or move the items into the newly created folder.
167 // Ignore any "you're going to break this item" messages.
168 BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
169 callbackMoveInventory,
170 (void*)data);
171 if (!success)
172 {
173 delete data;
174 data = NULL;
175 166
176 LLNotifications::instance().add("OpenObjectCannotCopy"); 167 // If we get a null category ID, we are using a capability in
168 // createNewCategory and we will handle the following in the
169 // callbackCreateInventoryCategory routine.
170 if (category_id.notNull())
171 {
172 delete cat_data;
173
174 LLCatAndWear* data = new LLCatAndWear;
175 data->mCatID = category_id;
176 data->mWear = wear;
177 data->mFolderResponded = false;
178
179 // Copy and/or move the items into the newly created folder.
180 // Ignore any "you're going to break this item" messages.
181 BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
182 callbackMoveInventory,
183 (void*)data);
184 if (!success)
185 {
186 delete data;
187 data = NULL;
188
189 LLNotifications::instance().add("OpenObjectCannotCopy");
190 }
177 } 191 }
178} 192}
179 193
180// static 194// static
195void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, void* data)
196{
197 LLCategoryCreate* cat_data = (LLCategoryCreate*)data;
198 if (result.has("failure") and result["failure"])
199 {
200 delete cat_data;
201 return;
202 }
203
204 LLUUID category_id = result["folder_id"].asUUID();
205 LLCatAndWear* wear_data = new LLCatAndWear;
206
207 wear_data->mCatID = category_id;
208 wear_data->mWear = cat_data->mWear;
209 wear_data->mFolderResponded = true;
210
211 // Copy and/or move the items into the newly created folder.
212 // Ignore any "you're going to break this item" messages.
213
214 BOOL success = move_inv_category_world_to_agent(cat_data->mObjectID, category_id, TRUE,
215 callbackMoveInventory,
216 (void*)wear_data);
217 if (!success)
218 {
219 delete wear_data;
220 wear_data = NULL;
221
222 LLNotifications::instance().add("OpenObjectCannotCopy");
223 }
224 delete cat_data;
225 }
226
227// static
181void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data) 228void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
182{ 229{
183 LLCatAndWear* cat = (LLCatAndWear*)data; 230 LLCatAndWear* cat = (LLCatAndWear*)data;
diff --git a/linden/indra/newview/llfloateropenobject.h b/linden/indra/newview/llfloateropenobject.h
index 27653a5..4b89158 100644
--- a/linden/indra/newview/llfloateropenobject.h
+++ b/linden/indra/newview/llfloateropenobject.h
@@ -50,10 +50,24 @@ public:
50 static void show(); 50 static void show();
51 static void dirty(); 51 static void dirty();
52 52
53 class LLCategoryCreate
54 {
55 public:
56 LLCategoryCreate(LLUUID object_id, bool wear)
57 : mObjectID(object_id),
58 mWear(wear)
59 {}
60
61 public:
62 LLUUID mObjectID;
63 bool mWear;
64 };
65
53 struct LLCatAndWear 66 struct LLCatAndWear
54 { 67 {
55 LLUUID mCatID; 68 LLUUID mCatID;
56 bool mWear; 69 bool mWear;
70 bool mFolderResponded;
57 }; 71 };
58 72
59protected: 73protected:
@@ -67,6 +81,7 @@ protected:
67 81
68 static void onClickMoveToInventory(void* data); 82 static void onClickMoveToInventory(void* data);
69 static void onClickMoveAndWear(void* data); 83 static void onClickMoveAndWear(void* data);
84 static void callbackCreateInventoryCategory(const LLSD& result, void* data);
70 static void callbackMoveInventory(S32 result, void* data); 85 static void callbackMoveInventory(S32 result, void* data);
71 static void* createPanelInventory(void* data); 86 static void* createPanelInventory(void* data);
72 87
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index f71df2d..eb2170a 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -1610,18 +1610,21 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
1610class LLInventoryCopyAndWearObserver : public LLInventoryObserver 1610class LLInventoryCopyAndWearObserver : public LLInventoryObserver
1611{ 1611{
1612public: 1612public:
1613 LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} 1613 LLInventoryCopyAndWearObserver(const LLUUID& cat_id,
1614 int count,
1615 bool folder_added = false)
1616 : mCatID(cat_id),
1617 mContentsCount(count),
1618 mFolderAdded(folder_added) {}
1614 virtual ~LLInventoryCopyAndWearObserver() {} 1619 virtual ~LLInventoryCopyAndWearObserver() {}
1615 virtual void changed(U32 mask); 1620 virtual void changed(U32 mask);
1616 1621
1617protected: 1622protected:
1618 LLUUID mCatID; 1623 LLUUID mCatID;
1619 int mContentsCount; 1624 int mContentsCount;
1620 BOOL mFolderAdded; 1625 bool mFolderAdded;
1621}; 1626};
1622 1627
1623
1624
1625void LLInventoryCopyAndWearObserver::changed(U32 mask) 1628void LLInventoryCopyAndWearObserver::changed(U32 mask)
1626{ 1629{
1627 if((mask & (LLInventoryObserver::ADD)) != 0) 1630 if((mask & (LLInventoryObserver::ADD)) != 0)
@@ -2331,13 +2334,16 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
2331 2334
2332 if(option == 0 && object) 2335 if(option == 0 && object)
2333 { 2336 {
2334 if (cat_and_wear && cat_and_wear->mWear) 2337 if (cat_and_wear && cat_and_wear->mWear) // && !cat_and_wear->mFolderResponded)
2335 { 2338 {
2336 InventoryObjectList inventory_objects; 2339 InventoryObjectList inventory_objects;
2337 object->getInventoryContents(inventory_objects); 2340 object->getInventoryContents(inventory_objects);
2338 int contents_count = inventory_objects.size()-1; //subtract one for containing folder 2341 int contents_count = inventory_objects.size()-1; //subtract one for containing folder
2339 2342
2340 LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); 2343 LLInventoryCopyAndWearObserver* inventoryObserver;
2344 inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID,
2345 contents_count,
2346 cat_and_wear->mFolderResponded);
2341 gInventory.addObserver(inventoryObserver); 2347 gInventory.addObserver(inventoryObserver);
2342 } 2348 }
2343 2349
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index 58a2bdc..dc216e3 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -60,6 +60,7 @@
60#include "llvoavatar.h" 60#include "llvoavatar.h"
61#include "llsdutil.h" 61#include "llsdutil.h"
62#include <deque> 62#include <deque>
63#include "llfloateropenobject.h"
63 64
64// [RLVa:KB] 65// [RLVa:KB]
65#include "rlvhandler.h" 66#include "rlvhandler.h"
@@ -396,25 +397,83 @@ LLUUID LLInventoryModel::findCategoryByName(std::string name)
396 return LLUUID::null; 397 return LLUUID::null;
397} 398}
398 399
400class LLCreateInventoryCategoryResponder : public LLHTTPClient::Responder
401{
402public:
403 LLCreateInventoryCategoryResponder(LLInventoryModel* model,
404 void (*callback)(const LLSD&, void*),
405 void* user_data)
406 : mModel(model),
407 mCallback(callback),
408 mData(user_data)
409 {
410 }
411
412 virtual void error(U32 status, const std::string& reason)
413 {
414 llwarns << "CreateInventoryCategory failed. status = " << status
415 << ", reason = \"" << reason << "\"" << llendl;
416 }
417
418 virtual void result(const LLSD& content)
419 {
420 // Server has created folder.
421
422 LLUUID category_id = content["folder_id"].asUUID();
423
424 // Add the category to the internal representation
425 LLPointer<LLViewerInventoryCategory> cat;
426 cat = new LLViewerInventoryCategory(category_id,
427 content["parent_id"].asUUID(),
428 (LLAssetType::EType)content["type"].asInteger(),
429 content["name"].asString(),
430 gAgent.getID());
431 cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL);
432 cat->setDescendentCount(0);
433 LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
434 mModel->accountForUpdate(update);
435 mModel->updateCategory(cat);
436
437 if (mCallback && mData)
438 {
439 mCallback(content, mData);
440 }
441 }
442
443private:
444 void (*mCallback)(const LLSD&, void*);
445 void* mData;
446 LLInventoryModel* mModel;
447};
448
399// Convenience function to create a new category. You could call 449// Convenience function to create a new category. You could call
400// updateCategory() with a newly generated UUID category, but this 450// updateCategory() with a newly generated UUID category, but this
401// version will take care of details like what the name should be 451// version will take care of details like what the name should be
402// based on preferred type. Returns the UUID of the new category. 452// based on preferred type. Returns the UUID of the new category.
403LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, 453LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
404 LLAssetType::EType preferred_type, 454 LLAssetType::EType preferred_type, const std::string& pname,
405 const std::string& pname) 455 void (*callback)(const LLSD&, void*),
456 void* user_data)
406{ 457{
458 llassert_always(NULL != callback);
459
407 LLUUID id; 460 LLUUID id;
461
408 if(!isInventoryUsable()) 462 if(!isInventoryUsable())
409 { 463 {
410 llwarns << "Inventory is broken." << llendl; 464 llwarns << "Inventory is broken." << llendl;
411 return id; 465 LLSD result;
412 } 466 result["failure"] = true;
467 callback(result, user_data);
468 }
469
413 470
414 if(preferred_type == LLAssetType::AT_SIMSTATE) 471 if(preferred_type == LLAssetType::AT_SIMSTATE)
415 { 472 {
416 LL_DEBUGS("Inventory") << "Attempt to create simstate category." << LL_ENDL; 473 LL_DEBUGS("Inventory") << "Attempt to create simstate category." << LL_ENDL;
417 return id; 474 LLSD result;
475 result["failure"] = true;
476 callback(result, user_data);
418 } 477 }
419 478
420 id.generate(); 479 id.generate();
@@ -433,6 +492,54 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
433 name.assign(NEW_CATEGORY_NAME); 492 name.assign(NEW_CATEGORY_NAME);
434 } 493 }
435 494
495 if (user_data) // callback required for acked message.
496 {
497
498
499 LLViewerRegion* viewer_region = gAgent.getRegion();
500
501 if (!viewer_region->capabilitiesReceived())
502 {
503 LL_DEBUGS("Inventory") << "We didn't get the region caps yet." << LL_ENDL;
504 }
505
506 std::string url;
507 if (viewer_region)
508 {
509 url = viewer_region->getCapability("CreateInventoryCategory");
510 }
511
512 if (!url.empty())
513 {
514 LL_DEBUGS("Inventory") << "Using the CreateInventoryCategory capability." << LL_ENDL;
515 // Let's use the new capability.
516 LLSD request, body;
517 body["folder_id"] = id;
518 body["parent_id"] = parent_id;
519 body["type"] = (LLSD::Integer) preferred_type;
520 body["name"] = name;
521
522 request["message"] = "CreateInventoryCategory";
523 request["payload"] = body;
524
525 LLHTTPClient::post(url, body,
526 new LLCreateInventoryCategoryResponder(this,
527 callback,
528 user_data));
529 return LLUUID::null;
530 }
531 else
532 {
533 LL_DEBUGS("Inventory") << "Cap url empty" << LL_ENDL;
534 }
535 }
536 else //NULL == user_data
537 {
538 // user_data is a LLCategoryCreate object instantiated in the calling
539 // function - bug (or low memory - any leaks?).
540 llwarns << "NULL user_data" << llendl;
541 }
542
436 // Add the category to the internal representation 543 // Add the category to the internal representation
437 LLPointer<LLViewerInventoryCategory> cat = 544 LLPointer<LLViewerInventoryCategory> cat =
438 new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID()); 545 new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID());
@@ -3173,7 +3280,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
3173 // << titem->getParentUUID() << llendl; 3280 // << titem->getParentUUID() << llendl;
3174 U32 callback_id; 3281 U32 callback_id;
3175 msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id); 3282 msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id);
3176 if(titem->getUUID().notNull()) 3283 if (titem->getUUID().notNull()) // && callback_id.notNull())
3177 { 3284 {
3178 items.push_back(titem); 3285 items.push_back(titem);
3179 cblist.push_back(InventoryCallbackInfo(callback_id, titem->getUUID())); 3286 cblist.push_back(InventoryCallbackInfo(callback_id, titem->getUUID()));
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h
index 7222c60..7788c34 100644
--- a/linden/indra/newview/llinventorymodel.h
+++ b/linden/indra/newview/llinventorymodel.h
@@ -308,9 +308,11 @@ public:
308 // based on preferred type. Returns the UUID of the new 308 // based on preferred type. Returns the UUID of the new
309 // category. If you want to use the default name based on type, 309 // category. If you want to use the default name based on type,
310 // pass in a NULL to the 'name parameter. 310 // pass in a NULL to the 'name parameter.
311 LLUUID createNewCategory(const LLUUID& parent_id, 311 LLUUID createNewCategory(const LLUUID& parent_id,
312 LLAssetType::EType preferred_type, 312 LLAssetType::EType preferred_type,
313 const std::string& name); 313 const std::string& name,
314 void (*callback)(const LLSD&, void*) = NULL,
315 void* user_data = NULL);
314 316
315 LLUUID findCategoryByName(std::string name); 317 LLUUID findCategoryByName(std::string name);
316 318
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index a43e0c0..2fafe30 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -1428,6 +1428,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
1428 LLSD capabilityNames = LLSD::emptyArray(); 1428 LLSD capabilityNames = LLSD::emptyArray();
1429 capabilityNames.append("ChatSessionRequest"); 1429 capabilityNames.append("ChatSessionRequest");
1430 capabilityNames.append("CopyInventoryFromNotecard"); 1430 capabilityNames.append("CopyInventoryFromNotecard");
1431 capabilityNames.append("CreateInventoryCategory");
1431 // Aurora settings -- MC 1432 // Aurora settings -- MC
1432 capabilityNames.append("DispatchOpenRegionSettings"); 1433 capabilityNames.append("DispatchOpenRegionSettings");
1433 capabilityNames.append("DispatchRegionInfo"); 1434 capabilityNames.append("DispatchRegionInfo");