From b658e4115d137713ab55bf73f517a528deffb534 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Tue, 6 Apr 2010 16:02:14 +0300
Subject: [PATCH] Fixed normal bug  EXT-6464 (Buy pass from popup menu doesn't
 work).

- The bug was caused by deselection of parcel(because of zero ref count to parcel selection) after appearance of alert with ok/cancel.
Added setting pointer to this selection before notification appearance and nullifying pointer it after user chooses ok or cancel. Nullifying
will always take place because alert is modal, so there is no chance that LLPanelLandGeneral::cbBuyPass() won't be called.

Reviewed by Mike at https://codereview.productengine.com/secondlife/r/180/

--HG--
branch : product-engine
---
 indra/newview/llfloaterland.cpp | 5 +++++
 indra/newview/llfloaterland.h   | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 25d3f971b5b..256796aa80a 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -90,6 +90,7 @@ static std::string MATURITY 		= "[MATURITY]";
 // constants used in callbacks below - syntactic sugar.
 static const BOOL BUY_GROUP_LAND = TRUE;
 static const BOOL BUY_PERSONAL_LAND = FALSE;
+LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL;
 
 // Statics
 LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL;
@@ -974,6 +975,8 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
 	args["PARCEL_NAME"] = parcel_name;
 	args["TIME"] = time;
 	
+	// creating pointer on selection to avoid deselection of parcel until we are done with buying pass (EXT-6464)
+	sSelectionForBuyPass = LLViewerParcelMgr::getInstance()->getParcelSelection();
 	LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);
 }
 
@@ -1005,6 +1008,8 @@ bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& respons
 		// User clicked OK
 		LLViewerParcelMgr::getInstance()->buyPass();
 	}
+	// we are done with buying pass, additional selection is no longer needed
+	sSelectionForBuyPass = NULL;
 	return false;
 }
 
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index fe80766a746..0a743e5215c 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -234,6 +234,11 @@ class LLPanelLandGeneral
 
 	LLSafeHandle<LLParcelSelection>&	mParcel;
 
+	// This pointer is needed to avoid parcel deselection until buying pass is completed or canceled.
+	// Deselection happened because of zero references to parcel selection, which took place when 
+	// "Buy Pass" was called from popup menu(EXT-6464)
+	static LLPointer<LLParcelSelection>	sSelectionForBuyPass;
+
 	static LLHandle<LLFloater> sBuyPassDialogHandle;
 };
 
-- 
GitLab