diff options
Diffstat (limited to 'indra')
34 files changed, 263 insertions, 112 deletions
| diff --git a/indra/llcommon/llformat.cpp b/indra/llcommon/llformat.cpp index cf509bee14..689f649d0a 100644 --- a/indra/llcommon/llformat.cpp +++ b/indra/llcommon/llformat.cpp @@ -37,16 +37,40 @@  #include <cstdarg> -std::string llformat(const char *fmt, ...) +// common used function with va_list argument +// wrapper for vsnprintf to be called from llformatXXX functions. +static void va_format(std::string& out, const char *fmt, va_list va)  {  	char tstr[1024];	/* Flawfinder: ignore */ -	va_list va; -	va_start(va, fmt);  #if LL_WINDOWS  	_vsnprintf(tstr, 1024, fmt, va);  #else  	vsnprintf(tstr, 1024, fmt, va);	/* Flawfinder: ignore */  #endif +	out.assign(tstr); +} + +std::string llformat(const char *fmt, ...) +{ +	std::string res; +	va_list va; +	va_start(va, fmt); +	va_format(res, fmt, va);  	va_end(va); -	return std::string(tstr); +	return res; +} + +std::string llformat_to_utf8(const char *fmt, ...) +{ +	std::string res; +	va_list va; +	va_start(va, fmt); +	va_format(res, fmt, va); +	va_end(va); + +#if LL_WINDOWS +	// made converting to utf8. See EXT-8318. +	res = ll_convert_string_to_utf8_string(res); +#endif +	return res;  } diff --git a/indra/llcommon/llformat.h b/indra/llcommon/llformat.h index dc64edb26d..17d8b4a8ad 100644 --- a/indra/llcommon/llformat.h +++ b/indra/llcommon/llformat.h @@ -42,4 +42,8 @@  std::string LL_COMMON_API llformat(const char *fmt, ...); +// the same version as above but ensures that returned string is in utf8 on windows +// to enable correct converting utf8_to_wstring. +std::string LL_COMMON_API llformat_to_utf8(const char *fmt, ...); +  #endif // LL_LLFORMAT_H diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 1561bda201..804c00fd60 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -633,14 +633,14 @@ namespace snprintf_hack  	}  } -std::string ll_convert_wide_to_string(const wchar_t* in) +std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page)  {  	std::string out;  	if(in)  	{  		int len_in = wcslen(in);  		int len_out = WideCharToMultiByte( -			CP_ACP, +			code_page,  			0,  			in,  			len_in, @@ -655,7 +655,7 @@ std::string ll_convert_wide_to_string(const wchar_t* in)  		if(pout)  		{  			WideCharToMultiByte( -				CP_ACP, +				code_page,  				0,  				in,  				len_in, @@ -669,6 +669,31 @@ std::string ll_convert_wide_to_string(const wchar_t* in)  	}  	return out;  } + +wchar_t* ll_convert_string_to_wide(const std::string& in, unsigned int code_page) +{ +	int output_str_len = MultiByteToWideChar(code_page, 0, in.c_str(), in.length(), NULL, 0); + +	// reserve place to NULL terminator +	wchar_t* w_out = new wchar_t[output_str_len + 1]; + +	memset(w_out, 0, output_str_len + 1); +	MultiByteToWideChar (code_page, 0, in.c_str(), in.length(), w_out, output_str_len); + +	//looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858. +	w_out[output_str_len] = 0; + +	return w_out; +} + +std::string ll_convert_string_to_utf8_string(const std::string& in) +{ +	wchar_t* w_mesg = ll_convert_string_to_wide(in, CP_ACP); +	std::string out_utf8 = ll_convert_wide_to_string(w_mesg, CP_UTF8); +	delete[] w_mesg; + +	return out_utf8; +}  #endif // LL_WINDOWS  long LLStringOps::sPacificTimeOffset = 0; diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 8071c8aa2d..41fac0f8cc 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -564,7 +564,20 @@ using snprintf_hack::snprintf;   *   * This replaces the unsafe W2A macro from ATL.   */ -LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in); +LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page); + +/** + * Converts a string to wide string. + * + * It will allocate memory for result string with "new []". Don't forget to release it with "delete []". + */ +LL_COMMON_API wchar_t* ll_convert_string_to_wide(const std::string& in, unsigned int code_page); + +/** + * Converts incoming string into urf8 string + * + */ +LL_COMMON_API std::string ll_convert_string_to_utf8_string(const std::string& in);  //@}  #endif // LL_WINDOWS diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index 36874a5d48..ac50411de8 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -364,13 +364,6 @@ U32 LLCurl::Easy::report(CURLcode code)  		responseCode = 499;  		responseReason = strerror(code) + " : " + mErrorBuffer;  	} -		 -	if(responseCode >= 300 && responseCode < 400) //redirect -	{ -		char new_url[512] ; -		curl_easy_getinfo(mCurlEasyHandle, CURLINFO_REDIRECT_URL, new_url); -		responseReason = new_url ; //get the new URL. -	}  	if (mResponder)  	{	 @@ -469,6 +462,13 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	setopt(CURLOPT_HEADERFUNCTION, (void*)&curlHeaderCallback);  	setopt(CURLOPT_HEADERDATA, (void*)this); +	// Allow up to five redirects +	if(responder && responder->followRedir()) +	{ +		setopt(CURLOPT_FOLLOWLOCATION, 1); +		setopt(CURLOPT_MAXREDIRS, MAX_REDIRECTS); +	} +  	setErrorBuffer();  	setCA(); @@ -1061,3 +1061,4 @@ void LLCurl::cleanupClass()  	curl_global_cleanup();  } +const unsigned int LLCurl::MAX_REDIRECTS = 5; diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index b6a637ae5b..20ca87c87b 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -123,6 +123,11 @@ public:  			// Used internally to set the url for debugging later.  			void setURL(const std::string& url); +			virtual bool followRedir()  +			{ +				return false; +			} +  	public: /* but not really -- don't touch this */  		U32 mReferenceCount; @@ -182,6 +187,7 @@ public:  private:  	static std::string sCAPath;  	static std::string sCAFile; +	static const unsigned int MAX_REDIRECTS;  };  namespace boost diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 2d408f8e10..69ef3f9ed7 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -109,11 +109,20 @@ void LLImageGL::checkTexSize(bool forced) const  {  	if ((forced || gDebugGL) && mTarget == GL_TEXTURE_2D)  	{ +		{ +			//check viewport +			GLint vp[4] ; +			glGetIntegerv(GL_VIEWPORT, vp) ; +			llcallstacks << "viewport: " << vp[0] << " : " << vp[1] << " : " << vp[2] << " : " << vp[3] << llcallstacksendl ; +		} +  		GLint texname;  		glGetIntegerv(GL_TEXTURE_BINDING_2D, &texname);  		BOOL error = FALSE;  		if (texname != mTexName)  		{ +			llinfos << "Bound: " << texname << " Should bind: " << mTexName << " Default: " << LLImageGL::sDefaultGLTexture->getTexName() << llendl; +  			error = TRUE;  			if (gDebugSession)  			{ diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index 6f81f5434c..0c524cd470 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -81,17 +81,6 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)  	// must be big enough to hold all children  	setUseBoundingRect(TRUE); -	// Label (add a little space to make sure text actually renders) -	const S32 FUDGE = 10; -	S32 text_width = mFont->getWidth( p.label ) + FUDGE; -	S32 text_height = llround(mFont->getLineHeight()); -	LLRect label_rect; -	label_rect.setOriginAndSize( -		llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, -		llcheckboxctrl_vpad + 1, // padding to get better alignment -		text_width + llcheckboxctrl_hpad, -		text_height ); -  	// *HACK Get rid of this with SL-55508...   	// this allows blank check boxes and radio boxes for now  	std::string local_label = p.label; @@ -101,7 +90,6 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)  	}  	LLTextBox::Params tbparams = p.label_text; -	tbparams.rect(label_rect);  	tbparams.initial_value(local_label);  	if (p.font.isProvided())  	{ @@ -111,6 +99,17 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)  	mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);  	addChild(mLabel); +	S32 text_width = mLabel->getTextBoundingRect().getWidth(); +	S32 text_height = llround(mFont->getLineHeight()); +	LLRect label_rect; +	label_rect.setOriginAndSize( +		llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, +		llcheckboxctrl_vpad + 1, // padding to get better alignment +		text_width + llcheckboxctrl_hpad, +		text_height ); +	mLabel->setShape(label_rect); + +  	// Button  	// Note: button cover the label by extending all the way to the right.  	LLRect btn_rect; @@ -190,8 +189,7 @@ void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)  	static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);  	static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0); -	const S32 FUDGE = 10; -	S32 text_width = mLabel->getTextBoundingRect().getWidth() + FUDGE; +	S32 text_width = mLabel->getTextBoundingRect().getWidth();  	S32 text_height = llround(mFont->getLineHeight());  	LLRect label_rect;  	label_rect.setOriginAndSize( @@ -199,7 +197,7 @@ void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)  		llcheckboxctrl_vpad,  		text_width,  		text_height ); -	mLabel->setRect(label_rect); +	mLabel->setShape(label_rect);  	LLRect btn_rect;  	btn_rect.setOriginAndSize( @@ -207,7 +205,7 @@ void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)  		llcheckboxctrl_vpad,  		llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width,  		llmax( text_height, llcheckboxctrl_btn_size() ) ); -	mButton->setRect( btn_rect ); +	mButton->setShape( btn_rect );  	LLUICtrl::reshape(width, height, called_from_parent);  } diff --git a/indra/llui/llresmgr.cpp b/indra/llui/llresmgr.cpp index ed870d46d5..9158bc70f5 100644 --- a/indra/llui/llresmgr.cpp +++ b/indra/llui/llresmgr.cpp @@ -298,11 +298,11 @@ void LLResMgr::getIntegerString( std::string& output, S32 input ) const  		{  			if (fraction == remaining_count)  			{ -				fraction_string = llformat("%d%c", fraction, getThousandsSeparator()); +				fraction_string = llformat_to_utf8("%d%c", fraction, getThousandsSeparator());  			}  			else  			{ -				fraction_string = llformat("%3.3d%c", fraction, getThousandsSeparator()); +				fraction_string = llformat_to_utf8("%3.3d%c", fraction, getThousandsSeparator());  			}  			output = fraction_string + output;  		} diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 72d51540ef..a4bf56fc96 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3075,7 +3075,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *  		return;  	} -	if (gAgentCamera.cameraCustomizeAvatar()) +	if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures())  	{  		// ignore baked textures when in customize mode  		return; @@ -3544,7 +3544,7 @@ void LLAgent::sendAgentSetAppearance()  {  	if (!isAgentAvatarValid()) return; -	if (gAgentQueryManager.mNumPendingQueries > 0 && !gAgentCamera.cameraCustomizeAvatar())  +	if (gAgentQueryManager.mNumPendingQueries > 0 && (isAgentAvatarValid() && gAgentAvatarp->isUsingBakedTextures()))   	{  		return;  	} diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 1ef9e34f87..4dc78e9a1d 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -941,7 +941,7 @@ void LLAgentCamera::cameraZoomIn(const F32 fraction)  		*/  	} -	if( cameraCustomizeAvatar() ) +	if(cameraCustomizeAvatar())  	{  		new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );  	} diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index c423473740..bb4e6c7a3e 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -167,6 +167,10 @@ void LLViewerDynamicTexture::postRender(BOOL success)  			{  				generateGLTexture() ;  			} +			if(!mGLTexturep->getHasGLTexture()) +			{ +				generateGLTexture() ; +			}  			llcallstacks << "class type: " << (S32)getType() << llcallstacksendl ;  			success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight); diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index e4a7a158a3..2546390fcb 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -96,9 +96,12 @@ void LLPanelInventoryListItemBase::draw()  	if (mSeparatorVisible && mSeparatorImage)  	{ -		// stretch along bottom of listitem, using image height +		// place under bottom of listitem, using image height +		// item_pad in list using the item should be >= image height +		// to avoid cropping of top of the next item.  		LLRect separator_rect = getLocalRect(); -		separator_rect.mTop = mSeparatorImage->getHeight(); +		separator_rect.mTop = separator_rect.mBottom; +		separator_rect.mBottom -= mSeparatorImage->getHeight();  		mSeparatorImage->draw(separator_rect);  	} diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 06f490e8e3..32c358368a 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -58,6 +58,7 @@  #endif  #include "llsecapi.h"  #include "llstartup.h" +#include "llmachineid.h"  static const char * const TOS_REPLY_PUMP = "lllogininstance_tos_callback";  static const char * const TOS_LISTENER_NAME = "lllogininstance_tos"; @@ -165,22 +166,22 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	// (re)initialize the request params with creds.  	LLSD request_params = user_credential->getLoginParams(); -	char hashed_mac_string[MD5HEX_STR_SIZE];		/* Flawfinder: ignore */ -	LLMD5 hashed_mac; -	unsigned char MACAddress[MAC_ADDRESS_BYTES]; -	if(LLUUID::getNodeID(MACAddress) == 0) { -		llerrs << "Failed to get node id; cannot uniquely identify this machine." << llendl; +	char hashed_unique_id_string[MD5HEX_STR_SIZE];		/* Flawfinder: ignore */ +	LLMD5 hashed_unique_id; +	unsigned char unique_id[MAC_ADDRESS_BYTES]; +	if(LLMachineID::getUniqueID(unique_id, sizeof(unique_id)) == 0) { +		llerrs << "Failed to get an id; cannot uniquely identify this machine." << llendl;  	} -	hashed_mac.update( MACAddress, MAC_ADDRESS_BYTES ); -	hashed_mac.finalize(); -	hashed_mac.hex_digest(hashed_mac_string); +	hashed_unique_id.update(unique_id, MAC_ADDRESS_BYTES); +	hashed_unique_id.finalize(); +	hashed_unique_id.hex_digest(hashed_unique_id_string);  	request_params["start"] = construct_start_string();  	request_params["skipoptional"] = mSkipOptionalUpdate;  	request_params["agree_to_tos"] = false; // Always false here. Set true in   	request_params["read_critical"] = false; // handleTOSResponse  	request_params["last_exec_event"] = mLastExecEvent; -	request_params["mac"] = hashed_mac_string; +	request_params["mac"] = hashed_unique_id_string;  	request_params["version"] = gCurrentVersion; // Includes channel name  	request_params["channel"] = gSavedSettings.getString("VersionChannelName");  	request_params["id0"] = mSerialNumber; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 26e8a932aa..445cfe64f7 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1593,6 +1593,7 @@ void LLPanelGroupMembersSubTab::updateMembers()  	LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end(); +	LLUIString donated = getString("donation_area");  	S32 i = 0;  	for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME;  @@ -1614,9 +1615,7 @@ void LLPanelGroupMembersSubTab::updateMembers()  		if (add_member)  		{ -			// Build the donated tier string. -			std::ostringstream donated; -			donated << mMemberProgress->second->getContribution() << " sq. m."; +			donated.setArg("[AREA]", llformat("%d", mMemberProgress->second->getContribution()));  			LLSD row;  			row["id"] = (*mMemberProgress).first; @@ -1625,7 +1624,7 @@ void LLPanelGroupMembersSubTab::updateMembers()  			// value is filled in by name list control  			row["columns"][1]["column"] = "donated"; -			row["columns"][1]["value"] = donated.str(); +			row["columns"][1]["value"] = donated.getString();  			row["columns"][2]["column"] = "online";  			row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus(); diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 8c1f5d0915..99e48cca6d 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -60,7 +60,8 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()  	mScrollingPanelWidth(0),  	mInfoType(UNKNOWN),  	mScrollingPanel(NULL), -	mScrollContainer(NULL) +	mScrollContainer(NULL), +	mDescEditor(NULL)  {}  //virtual @@ -248,6 +249,16 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)  // virtual  void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)  { + +	// This if was added to force collapsing description textbox on Windows at the beginning of reshape +	// (the only case when reshape is skipped here is when it's caused by this textbox, so called_from_parent is FALSE) +	// This way it is consistent with Linux where topLost collapses textbox at the beginning of reshape. +	// On windows it collapsed only after reshape which caused EXT-8342. +	if(called_from_parent) +	{ +		if(mDescEditor) mDescEditor->onTopLost(); +	} +  	LLPanel::reshape(width, height, called_from_parent);  	if (!mScrollContainer || !mScrollingPanel) diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index f2d1b5d032..dc97c4b673 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -180,7 +180,7 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)  		if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.  		{ -			if (gAgentCamera.cameraCustomizeAvatar()) +			if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures())  			{  				upload_bake = FALSE;  			} diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index ceed90e210..dddfed097d 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -290,8 +290,8 @@ class HTTPGetResponder : public LLCurl::Responder  {  	LOG_CLASS(HTTPGetResponder);  public: -	HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset) -		: mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset) +	HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset, bool redir) +		: mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset), mFollowRedir(redir)  	{  	}  	~HTTPGetResponder() @@ -344,6 +344,11 @@ public:   			llwarns << "Worker not found: " << mID << llendl;  		}  	} + +	virtual bool followRedir() +	{ +		return mFollowRedir; +	}  private:  	LLTextureFetch* mFetcher; @@ -351,6 +356,7 @@ private:  	U64 mStartTime;  	S32 mRequestedSize;  	U32 mOffset; +	bool mFollowRedir;  };  ////////////////////////////////////////////////////////////////////////////// @@ -897,7 +903,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				std::vector<std::string> headers;  				headers.push_back("Accept: image/x-j2c");  				res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, -															  new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset)); +															  new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true));  			}  			if (!res)  			{ @@ -945,17 +951,6 @@ bool LLTextureFetchWorker::doWork(S32 param)  					max_attempts = mHTTPFailCount+1; // Keep retrying  					LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;  				} -				else if(mGetStatus >= HTTP_MULTIPLE_CHOICES && mGetStatus < HTTP_BAD_REQUEST) //http re-direct -				{ -					++mHTTPFailCount; -					max_attempts = 5 ; //try at most 5 times to avoid infinite redirection loop. - -					llwarns << "HTTP GET failed because of redirection: "  << mUrl -							<< " Status: " << mGetStatus << " Reason: '" << mGetReason << llendl ; - -					//assign to the new url -					mUrl = mGetReason ; -				}  				else  				{  					const S32 HTTP_MAX_RETRY_COUNT = 3; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 2d57c16889..3b56183dfe 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -935,7 +935,7 @@ void ModifiedCOFCallback::fire(const LLUUID& inv_item)  	gAgentWearables.editWearableIfRequested(inv_item);  	// TODO: camera mode may not be changed if a debug setting is tweaked -	if( gAgentCamera.cameraCustomizeAvatar() ) +	if(gAgentCamera.cameraCustomizeAvatar())  	{  		// If we're in appearance editing mode, the current tab may need to be refreshed  		LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); @@ -1172,6 +1172,14 @@ void move_inventory_item(  void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id)  { +	if (NULL == src) +	{ +		LL_WARNS("copy_inventory_from_notecard") << "Null pointer to item was passed for object_id " +												 << object_id << " and notecard_inv_id " +												 << notecard_inv_id << LL_ENDL; +		return; +	} +  	LLViewerRegion* viewer_region = NULL;      LLViewerObject* vo = NULL;  	if (object_id.notNull() && (vo = gObjectList.findObject(object_id)) != NULL) @@ -1194,6 +1202,16 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar          return;      } +	// check capability to prevent a crash while LL_ERRS in LLCapabilityListener::capListener. See EXT-8459. +	std::string url = viewer_region->getCapability("CopyInventoryFromNotecard"); +	if (url.empty()) +	{ +        LL_WARNS("copy_inventory_from_notecard") << "There is no 'CopyInventoryFromNotecard' capability" +												 << " for region: " << viewer_region->getName() +                                                 << LL_ENDL; +		return; +	} +      LLSD request, body;      body["notecard-id"] = notecard_inv_id;      body["object-id"] = object_id; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 04eb8164f8..fa0e860ae9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1138,10 +1138,26 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam  						}  						else if(from_name.empty())  						{ +							std::string folder_name; +							if (parent_folder) +							{ +								// Localize folder name. +								// *TODO: share this code? +								folder_name = parent_folder->getName(); +								if (LLFolderType::lookupIsProtectedType(parent_folder->getPreferredType())) +								{ +									LLTrans::findString(folder_name, "InvFolder " + folder_name); +								} +							} +							else +							{ +								 folder_name = LLTrans::getString("Unknown"); +							} +  							// we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.  							LLSD args;  							args["LANDMARK_NAME"] = item->getName(); -							args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); +							args["FOLDER_NAME"] = folder_name;  							LLNotificationsUtil::add("LandmarkCreated", args);  						}  					} diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 59efae4cb2..8bd43bb30c 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -90,7 +90,7 @@ public:  	}  	static void processForeignLandmark(LLLandmark* landmark,  			const LLUUID& object_id, const LLUUID& notecard_inventory_id, -			LLInventoryItem* item) +			LLPointer<LLInventoryItem> item_ptr)  	{  		LLVector3d global_pos;  		landmark->getGlobalPos(global_pos); @@ -103,8 +103,16 @@ public:  		}  		else  		{ -			LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); -			copy_inventory_from_notecard(object_id, notecard_inventory_id, item, gInventoryCallbacks.registerCB(cb)); +			if (item_ptr.isNull()) +			{ +				// check to prevent a crash. See EXT-8459. +				llwarns << "Passed handle contains a dead inventory item. Most likely notecard has been closed and embedded item was destroyed." << llendl; +			} +			else +			{ +				LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); +				copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb)); +			}  		}  	}  }; @@ -300,14 +308,14 @@ public:  	void	markSaved(); -	static LLInventoryItem* getEmbeddedItem(llwchar ext_char); // returns item from static list +	static LLPointer<LLInventoryItem> getEmbeddedItemPtr(llwchar ext_char); // returns pointer to item from static list  	static BOOL getEmbeddedItemSaved(llwchar ext_char); // returns whether item from static list is saved  private:  	struct embedded_info_t  	{ -		LLPointer<LLInventoryItem> mItem; +		LLPointer<LLInventoryItem> mItemPtr;  		BOOL mSaved;  	};  	typedef std::map<llwchar, embedded_info_t > item_map_t; @@ -378,7 +386,7 @@ BOOL LLEmbeddedItems::insertEmbeddedItem( LLInventoryItem* item, llwchar* ext_ch  		++wc_emb;  	} -	sEntries[wc_emb].mItem = item; +	sEntries[wc_emb].mItemPtr = item;  	sEntries[wc_emb].mSaved = is_new ? FALSE : TRUE;  	*ext_char = wc_emb;  	mEmbeddedUsedChars.insert(wc_emb); @@ -400,14 +408,14 @@ BOOL LLEmbeddedItems::removeEmbeddedItem( llwchar ext_char )  }  // static -LLInventoryItem* LLEmbeddedItems::getEmbeddedItem(llwchar ext_char) +LLPointer<LLInventoryItem> LLEmbeddedItems::getEmbeddedItemPtr(llwchar ext_char)  {  	if( ext_char >= LLTextEditor::FIRST_EMBEDDED_CHAR && ext_char <= LLTextEditor::LAST_EMBEDDED_CHAR )  	{  		item_map_t::iterator iter = sEntries.find(ext_char);  		if (iter != sEntries.end())  		{ -			return iter->second.mItem; +			return iter->second.mItemPtr;  		}  	}  	return NULL; @@ -505,7 +513,7 @@ BOOL LLEmbeddedItems::hasEmbeddedItem(llwchar ext_char)  LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const  { -	LLInventoryItem* item = getEmbeddedItem(ext_char); +	LLInventoryItem* item = getEmbeddedItemPtr(ext_char);  	if (item)  	{  		const char* img_name = ""; @@ -567,7 +575,7 @@ void LLEmbeddedItems::getEmbeddedItemList( std::vector<LLPointer<LLInventoryItem  	for (std::set<llwchar>::iterator iter = mEmbeddedUsedChars.begin(); iter != mEmbeddedUsedChars.end(); ++iter)  	{  		llwchar wc = *iter; -		LLPointer<LLInventoryItem> item = getEmbeddedItem(wc); +		LLPointer<LLInventoryItem> item = getEmbeddedItemPtr(wc);  		if (item)  		{  			items.push_back(item); @@ -698,7 +706,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)  			{  				wc = getWText()[mCursorPos];  			} -			LLInventoryItem* item_at_pos = LLEmbeddedItems::getEmbeddedItem(wc); +			LLPointer<LLInventoryItem> item_at_pos = LLEmbeddedItems::getEmbeddedItemPtr(wc);  			if (item_at_pos)  			{  				mDragItem = item_at_pos; @@ -1019,7 +1027,7 @@ llwchar LLViewerTextEditor::pasteEmbeddedItem(llwchar ext_char)  	{  		return ext_char; // already exists in my list  	} -	LLInventoryItem* item = LLEmbeddedItems::getEmbeddedItem(ext_char); +	LLInventoryItem* item = LLEmbeddedItems::getEmbeddedItemPtr(ext_char);  	if (item)  	{  		// Add item to my list and return new llwchar associated with it @@ -1053,7 +1061,7 @@ void LLViewerTextEditor::findEmbeddedItemSegments(S32 start, S32 end)  			&& embedded_char <= LAST_EMBEDDED_CHAR   			&& mEmbeddedItemList->hasEmbeddedItem(embedded_char) )  		{ -			LLInventoryItem* itemp = mEmbeddedItemList->getEmbeddedItem(embedded_char); +			LLInventoryItem* itemp = mEmbeddedItemList->getEmbeddedItemPtr(embedded_char);  			LLUIImagePtr image = mEmbeddedItemList->getItemImage(embedded_char);  			insertSegment(new LLEmbeddedItemSegment(idx, image, itemp, *this));  		} @@ -1065,7 +1073,7 @@ BOOL LLViewerTextEditor::openEmbeddedItemAtPos(S32 pos)  	if( pos < getLength())  	{  		llwchar wc = getWText()[pos]; -		LLInventoryItem* item = LLEmbeddedItems::getEmbeddedItem( wc ); +		LLPointer<LLInventoryItem> item = LLEmbeddedItems::getEmbeddedItemPtr( wc );  		if( item )  		{  			BOOL saved = LLEmbeddedItems::getEmbeddedItemSaved( wc ); @@ -1083,7 +1091,7 @@ BOOL LLViewerTextEditor::openEmbeddedItemAtPos(S32 pos)  } -BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item, llwchar wc) +BOOL LLViewerTextEditor::openEmbeddedItem(LLPointer<LLInventoryItem> item, llwchar wc)  {  	switch( item->getType() ) @@ -1151,17 +1159,17 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item, llwchar wc )  } -void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item, llwchar wc ) +void LLViewerTextEditor::openEmbeddedLandmark( LLPointer<LLInventoryItem> item_ptr, llwchar wc )  { -	if (!item) +	if (item_ptr.isNull())  		return; -	LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID(), -			boost::bind(&LLEmbeddedLandmarkCopied::processForeignLandmark, _1, mObjectID, mNotecardInventoryID, item)); +	LLLandmark* landmark = gLandmarkList.getAsset(item_ptr->getAssetUUID(), +			boost::bind(&LLEmbeddedLandmarkCopied::processForeignLandmark, _1, mObjectID, mNotecardInventoryID, item_ptr));  	if (landmark)  	{  		LLEmbeddedLandmarkCopied::processForeignLandmark(landmark, mObjectID, -				mNotecardInventoryID, item); +				mNotecardInventoryID, item_ptr);  	}  } @@ -1220,7 +1228,7 @@ bool LLViewerTextEditor::onCopyToInvDialog(const LLSD& notification, const LLSD&  	{  		LLUUID item_id = notification["payload"]["item_id"].asUUID();  		llwchar wc = llwchar(notification["payload"]["item_wc"].asInteger()); -		LLInventoryItem* itemp = LLEmbeddedItems::getEmbeddedItem(wc); +		LLInventoryItem* itemp = LLEmbeddedItems::getEmbeddedItemPtr(wc);  		if (itemp)  			copyInventory(itemp);  	} diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index ba0c40cb2e..74b6d70640 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -104,13 +104,16 @@ private:  	virtual llwchar	pasteEmbeddedItem(llwchar ext_char);  	BOOL			openEmbeddedItemAtPos( S32 pos ); -	BOOL			openEmbeddedItem(LLInventoryItem* item, llwchar wc); +	BOOL			openEmbeddedItem(LLPointer<LLInventoryItem> item, llwchar wc);  	S32				insertEmbeddedItem(S32 pos, LLInventoryItem* item); +	// *NOTE: most of openEmbeddedXXX methods except openEmbeddedLandmark take pointer to LLInventoryItem. +	// Be sure they don't bind it to callback function to avoid situation when it gets invalid when +	// callback is trigged after text editor is closed. See EXT-8459.  	void			openEmbeddedTexture( LLInventoryItem* item, llwchar wc );  	void			openEmbeddedSound( LLInventoryItem* item, llwchar wc ); -	void			openEmbeddedLandmark( LLInventoryItem* item, llwchar wc ); +	void			openEmbeddedLandmark( LLPointer<LLInventoryItem> item_ptr, llwchar wc );  	void			openEmbeddedNotecard( LLInventoryItem* item, llwchar wc);  	void			openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc);  	void			showCopyToInvDialog( LLInventoryItem* item, llwchar wc ); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6346ac320b..5f0fcb72f0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4524,7 +4524,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)  		gResizeScreenTexture = TRUE; -		if (gAgentCamera.cameraCustomizeAvatar()) +		if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures())  		{  			LLVisualParamHint::requestHintUpdates();  		} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 09a3b3b9ae..7079adbd14 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6220,7 +6220,7 @@ void LLVOAvatar::updateMeshTextures()  		}  	} -	const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures +	const BOOL self_customizing = isSelf() && !gAgentAvatarp->isUsingBakedTextures(); // During face edit mode, we don't use baked textures  	const BOOL other_culled = !isSelf() && mCulled;  	LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ;  	BOOL paused = FALSE; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 88896871b2..3a283e7aa6 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1148,11 +1148,11 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr  			discard_level < local_tex_obj->getDiscard())  		{  			local_tex_obj->setDiscard(discard_level); -			if (!gAgentCamera.cameraCustomizeAvatar()) +			if (isUsingBakedTextures())  			{  				requestLayerSetUpdate(index);  			} -			else if (gAgentCamera.cameraCustomizeAvatar()) +			else  			{  				LLVisualParamHint::requestHintUpdates();  			} @@ -1622,13 +1622,16 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  				if (tex_discard >= 0 && tex_discard <= desired_discard)  				{  					local_tex_obj->setDiscard(tex_discard); -					if (isSelf() && !gAgentCamera.cameraCustomizeAvatar()) -					{ -						requestLayerSetUpdate(type); -					} -					else if (isSelf() && gAgentCamera.cameraCustomizeAvatar()) +					if (isSelf())  					{ -						LLVisualParamHint::requestHintUpdates(); +						if (gAgentAvatarp->isUsingBakedTextures()) +						{ +							requestLayerSetUpdate(type); +						} +						else +						{ +							LLVisualParamHint::requestHintUpdates(); +						}  					}  				}  				else diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index dfa7ca7136..c5042ca016 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -698,7 +698,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake  		}  	} -	if( gAgentCamera.cameraCustomizeAvatar() ) +	if(gAgentCamera.cameraCustomizeAvatar())  	{  		LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));  	} diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 66cb02ce99..9bbe005de8 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -37,6 +37,7 @@  #include "llworldmapmessage.h"  #include "message.h"  #include "lltracker.h" +#include "lluistring.h"  #include "llviewertexturelist.h"  #include "lltrans.h" @@ -522,8 +523,12 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&  		case MAP_ITEM_LAND_FOR_SALE:		// land for sale  		case MAP_ITEM_LAND_FOR_SALE_ADULT:	// adult land for sale   		{ -			std::string tooltip = llformat("%d sq. m. L$%d", extra, extra2); -			new_item.setTooltip(tooltip); +			static LLUIString tooltip_fmt = LLTrans::getString("worldmap_item_tooltip_format"); + +			tooltip_fmt.setArg("[AREA]",  llformat("%d", extra)); +			tooltip_fmt.setArg("[PRICE]", llformat("%d", extra2)); +			new_item.setTooltip(tooltip_fmt.getString()); +  			if (type == MAP_ITEM_LAND_FOR_SALE)  			{  				siminfo->insertLandForSale(new_item); diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index e4e677eb64..b97e5249e1 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -52,7 +52,7 @@ public:  	LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id);  	// Setters -	void setTooltip(std::string& tooltip) { mToolTip = tooltip; } +	void setTooltip(const std::string& tooltip) { mToolTip = tooltip; }  	void setElevation(F64 z) { mPosGlobal.mdV[VZ] = z; }  	void setCount(S32 count) { mCount = count; }  //	void setSelected(bool selected) { mSelected = selected; } diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 0eb5c47f85..18a2f37ba2 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -50,6 +50,10 @@ Select multiple Members by holding the Ctrl key and  clicking on their names.              </panel.string>              <panel.string +             name="donation_area"> +                [AREA] m² +            </panel.string> +            <panel.string               name="power_folder_icon" translate="false">                  Inv_FolderClosed              </panel.string> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e5bd549036..3d8ceb9912 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -278,6 +278,7 @@  	<!-- world map -->  	<string name="texture_loading">Loading...</string>  	<string name="worldmap_offline">Offline</string> +	<string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE]</string>  	<string name="worldmap_results_none_found">None found.</string>  	<!-- animations uploading status codes --> diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml index 96723b0fe6..7d1e3cd65c 100644 --- a/indra/newview/skins/default/xui/fr/floater_water.xml +++ b/indra/newview/skins/default/xui/fr/floater_water.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="Water Floater" title="ÉDITEUR D'EAU AVANCÉ">  	<floater.string name="WLDefaultWaterNames"> -		Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez +		Valeur par défaut:Transparente:Bassin:Trouble:Première plaie:SERPENT !!!:Valdez  	</floater.string>  	<text name="KeyFramePresetsText" width="120">  		Préréglages : diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml index 74f1697449..657e5f5051 100644 --- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml @@ -184,6 +184,6 @@  		</panel>  	</tab_container>  	<string name="WLDefaultSkyNames"> -		A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor's Delight:Sheer Sensuality +		A-Minuit:A-Midi:A-3h:A-15h:A-16h30:A-6h:A-18h:A-9h:A-21h:Barcelone:Blizzard:Bleu mi-journée:Après-midi sur la côte:Coucher de soleil (côte):Valeur par défaut:Coucher de soleil (désert):Belle journée:Gros nuages floconneux:Brumeux:Funky Funky:Funky Funky Funky:Gelatto:Fantôme:Vérités incohérentes:Mi-journée 1:Mi-journée 2:Mi-journée 3:Mi-journée 4:Nuit:Pirate:Mauve:Rêve de navigateur:Sensualité pure  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml index 978ca86d62..1a6101830b 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml @@ -27,7 +27,7 @@  			Médias proches  		</text>  		<text name="show_text"> -			Afficher : +			Voir :  		</text>  		<combo_box name="show_combo">  			<combo_box.item label="Tout" name="All"/> diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index 2884231299..01c750487e 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -145,7 +145,7 @@ void LLCrashLoggerWindows::ProcessCaption(HWND hWnd)  	TCHAR header[MAX_STRING];  	std::string final;  	GetWindowText(hWnd, templateText, sizeof(templateText)); -	final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str()); +	final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str());  	ConvertLPCSTRToLPWSTR(final.c_str(), header);  	SetWindowText(hWnd, header);  } @@ -158,7 +158,7 @@ void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem)  	TCHAR header[MAX_STRING];  	std::string final;  	GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText)); -	final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str()); +	final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str());  	ConvertLPCSTRToLPWSTR(final.c_str(), header);  	SetDlgItemText(hWnd, nIDDlgItem, header);  } @@ -201,7 +201,7 @@ bool handle_button_click(WORD button_id)  						wbuffer, // pointer to buffer for text  						20000 // maximum size of string  						); -		std::string user_text(ll_convert_wide_to_string(wbuffer)); +		std::string user_text(ll_convert_wide_to_string(wbuffer, CP_ACP));  		// Activate and show the window.  		ShowWindow(gHwndProgress, SW_SHOW);   		// Try doing this second to make the progress window go frontmost. | 
