diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/lib/python/indra/util/llmanifest.py | 7 | ||||
| -rw-r--r-- | indra/llcommon/lluri.cpp | 69 | ||||
| -rw-r--r-- | indra/llcommon/lluri.h | 7 | ||||
| -rwxr-xr-x | indra/newview/linux_tools/handle_secondlifeprotocol.sh | 17 | ||||
| -rwxr-xr-x | indra/newview/linux_tools/register_secondlifeprotocol.sh | 46 | ||||
| -rwxr-xr-x | indra/newview/linux_tools/wrapper.sh | 4 | ||||
| -rw-r--r-- | indra/newview/llcommandhandler.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llcommandhandler.h | 9 | ||||
| -rw-r--r-- | indra/newview/llfloaterevent.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llfloaterparcel.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfloaterpreference.cpp | 46 | ||||
| -rw-r--r-- | indra/newview/llfloaterpreference.h | 1 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.cpp | 622 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.h | 47 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 192 | ||||
| -rw-r--r-- | indra/newview/lltoolpie.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llurldispatcher.cpp | 63 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 8 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 2 | 
21 files changed, 623 insertions, 551 deletions
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 2408fab96f..029b697e83 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -38,7 +38,6 @@ import re  import shutil  import sys  import tarfile -import errno  def path_ancestors(path):      path = os.path.normpath(path) @@ -464,12 +463,6 @@ class LLManifest(object):                  return              # only copy if it's not excluded              if(self.includes(src, dst)): -                try: -                    os.unlink(dst) -                except OSError, err: -                    if err.errno != errno.ENOENT: -                        raise -                  shutil.copy2(src, dst)      def ccopytree(self, src, dst): diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 5e4dec7f82..df790433df 100644 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -40,8 +40,6 @@  #include "../llmath/lluuid.h" -// system includes -#include <boost/tokenizer.hpp>  // static  std::string LLURI::escape(const std::string& str, const std::string & allowed) @@ -132,7 +130,7 @@ LLURI::LLURI()  LLURI::LLURI(const std::string& escaped_str)  { -	std::string::size_type delim_pos; +	std::string::size_type delim_pos, delim_pos2;  	delim_pos = escaped_str.find(':');  	std::string temp;  	if (delim_pos == std::string::npos) @@ -146,39 +144,13 @@ LLURI::LLURI(const std::string& escaped_str)  		mEscapedOpaque = escaped_str.substr(delim_pos+1);  	} -	parseAuthorityAndPathUsingOpaque(); - -	delim_pos = mEscapedPath.find('?'); -	if (delim_pos != std::string::npos) -	{ -		mEscapedQuery = mEscapedPath.substr(delim_pos+1); -		mEscapedPath = mEscapedPath.substr(0,delim_pos); -	} -} - -static BOOL isDefault(const std::string& scheme, U16 port) -{ -	if (scheme == "http") -		return port == 80; -	if (scheme == "https") -		return port == 443; -	if (scheme == "ftp") -		return port == 21; - -	return FALSE; -} - -void LLURI::parseAuthorityAndPathUsingOpaque() -{ -	if (mScheme == "http" || mScheme == "https" || -		mScheme == "ftp" || mScheme == "secondlife" ) +	if (mScheme == "http" || mScheme == "https" || mScheme == "ftp")  	{  		if (mEscapedOpaque.substr(0,2) != "//")  		{  			return;  		} - -		std::string::size_type delim_pos, delim_pos2; +		  		delim_pos = mEscapedOpaque.find('/', 2);  		delim_pos2 = mEscapedOpaque.find('?', 2);  		// no path, no query @@ -210,12 +182,27 @@ void LLURI::parseAuthorityAndPathUsingOpaque()  			mEscapedPath = mEscapedOpaque.substr(delim_pos);  		}  	} -	else if (mScheme == "about") + +	delim_pos = mEscapedPath.find('?'); +	if (delim_pos != std::string::npos)  	{ -		mEscapedPath = mEscapedOpaque; +		mEscapedQuery = mEscapedPath.substr(delim_pos+1); +		mEscapedPath = mEscapedPath.substr(0,delim_pos);  	}  } +static BOOL isDefault(const std::string& scheme, U16 port) +{ +	if (scheme == "http") +		return port == 80; +	if (scheme == "https") +		return port == 443; +	if (scheme == "ftp") +		return port == 21; + +	return FALSE; +} +  LLURI::LLURI(const std::string& scheme,  			 const std::string& userName,  			 const std::string& password, @@ -453,22 +440,6 @@ std::string LLURI::path() const  	return unescape(mEscapedPath);  } -LLSD LLURI::pathArray() const -{ -	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -	boost::char_separator<char> sep("/", "", boost::drop_empty_tokens); -	tokenizer tokens(mEscapedPath, sep); -	tokenizer::iterator it = tokens.begin(); -	tokenizer::iterator end = tokens.end(); - -	LLSD params; -	for ( ; it != end; ++it) -	{ -		params.append(*it); -	} -	return params; -} -  std::string LLURI::query() const  {  	return unescape(mEscapedQuery); diff --git a/indra/llcommon/lluri.h b/indra/llcommon/lluri.h index bfe673c2f7..3246dcd81f 100644 --- a/indra/llcommon/lluri.h +++ b/indra/llcommon/lluri.h @@ -107,7 +107,7 @@ public:    BOOL defaultPort() const;		// true if port is default for scheme    const std::string& escapedPath() const { return mEscapedPath; }    std::string path() const;		// ex.: "/abc/def", includes leading slash -  LLSD pathArray() const;			// above decoded into an array of strings +  //    LLSD pathArray() const;			// above decoded into an array of strings    std::string query() const;		// ex.: "x=34", section after "?"    const std::string& escapedQuery() const { return mEscapedQuery; }    LLSD queryMap() const;			// above decoded into a map @@ -135,11 +135,6 @@ public:  	//@}  private: -	 // only "http", "https", "ftp", and "secondlife" schemes are parsed -	 // secondlife scheme parses authority as "" and includes it as part of -	 // the path.  See lluri_tut.cpp -	 // i.e. secondlife://app/login has mAuthority = "" and mPath = "/app/login" -	void parseAuthorityAndPathUsingOpaque();  	std::string mScheme;  	std::string mEscapedOpaque;  	std::string mEscapedAuthority; diff --git a/indra/newview/linux_tools/handle_secondlifeprotocol.sh b/indra/newview/linux_tools/handle_secondlifeprotocol.sh deleted file mode 100755 index 7ff86d1b93..0000000000 --- a/indra/newview/linux_tools/handle_secondlifeprotocol.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Send a URL of the form secondlife://... to Second Life. -# - -URL="$1" - -if [ -z "$URL" ]; then -    echo Usage: $0 secondlife://... -    exit -fi - -RUN_PATH=`dirname "$0" || echo .` -cd "${RUN_PATH}" - -exec ./secondlife -url \'"${URL}"\' - diff --git a/indra/newview/linux_tools/register_secondlifeprotocol.sh b/indra/newview/linux_tools/register_secondlifeprotocol.sh deleted file mode 100755 index 4ab96f97d6..0000000000 --- a/indra/newview/linux_tools/register_secondlifeprotocol.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -# Register a protocol handler (default: handle_secondlifeprotocol.sh) for -# URLs of the form secondlife://... -# - -HANDLER="$1" - -RUN_PATH=`dirname "$0" || echo .` -cd "${RUN_PATH}" - -if [ -z "$HANDLER" ]; then -    HANDLER=`pwd`/handle_secondlifeprotocol.sh -fi - -# Register handler for GNOME-aware apps -LLGCONFTOOL2=gconftool-2 -if which ${LLGCONFTOOL2} >/dev/null; then -    (${LLGCONFTOOL2} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL2} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} failed. -else -    echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} not found. -fi - -# Register handler for KDE-aware apps -if [ -z "$KDEHOME" ]; then -    KDEHOME=~/.kde -fi -LLKDEPROTDIR=${KDEHOME}/share/services -if [ -d "$LLKDEPROTDIR" ]; then -    LLKDEPROTFILE=${LLKDEPROTDIR}/secondlife.protocol -    cat > ${LLKDEPROTFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTFILE} -[Protocol] -exec=${HANDLER} '%u' -protocol=secondlife -input=none -output=none -helper=true -listing= -reading=false -writing=false -makedir=false -deleting=false -EOF -else -    echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTDIR does not exist. -fi diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 638a0f0b76..10041ee255 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -61,10 +61,6 @@ fi  RUN_PATH=`dirname "$0" || echo .`  cd "${RUN_PATH}" - -# Re-register the secondlife:// protocol handler every launch, for now. -./register_secondlifeprotocol.sh -  if [ -n "$LL_TCMALLOC" ]; then      tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'      all=1 diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 95a30e8903..fd3aef9afc 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -46,7 +46,7 @@ class LLCommandHandlerRegistry  public:  	static LLCommandHandlerRegistry& instance();  	void add(const char* cmd, LLCommandHandler* handler); -	bool dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap); +	bool dispatch(const std::string& cmd, const std::vector<std::string>& params);  private:  	std::map<std::string, LLCommandHandler*> mMap; @@ -68,14 +68,13 @@ void LLCommandHandlerRegistry::add(const char* cmd, LLCommandHandler* handler)  }  bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, -										const LLSD& params, -										const LLSD& queryMap) +										const std::vector<std::string>& params)  {  	std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd);  	if (it == mMap.end()) return false;  	LLCommandHandler* handler = it->second;  	if (!handler) return false; -	return handler->handle(params, queryMap); +	return handler->handle(params);  }  //--------------------------------------------------------------------------- @@ -98,7 +97,7 @@ LLCommandHandler::~LLCommandHandler()  //---------------------------------------------------------------------------  // static -bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap) +bool LLCommandDispatcher::dispatch(const std::string& cmd, const std::vector<std::string>& params)  { -	return LLCommandHandlerRegistry::instance().dispatch(cmd, params, queryMap); +	return LLCommandHandlerRegistry::instance().dispatch(cmd, params);  } diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h index 0cb9d123fa..50928e210b 100644 --- a/indra/newview/llcommandhandler.h +++ b/indra/newview/llcommandhandler.h @@ -44,7 +44,7 @@ public:  	LLFooHandler() : LLCommandHandler("foo") { }      // Your code here -	bool handle(const LLSD& tokens, const LLSD& queryMap) +	bool handle(const std::vector<std::string>& tokens)  	{  		if (tokens.size() < 1) return false;  		LLUUID id( tokens[0] ); @@ -65,8 +65,7 @@ public:  	virtual ~LLCommandHandler(); -	virtual bool handle(const LLSD& params, -						const LLSD& queryMap) = 0; +	virtual bool handle(const std::vector<std::string>& params) = 0;  		// Execute the command with a provided (possibly empty)  		// list of parameters.  		// Return true if you did something, false if the parameters @@ -77,9 +76,7 @@ public:  class LLCommandDispatcher  {  public: -	static bool dispatch(const std::string& cmd, -						 const LLSD& params, -						 const LLSD& queryMap); +	static bool dispatch(const std::string& cmd, const std::vector<std::string>& params);  		// Execute a command registered via the above mechanism,  		// passing string parameters.  		// Returns true if command was found and executed correctly. diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp index 89f738203c..2b9d011e90 100644 --- a/indra/newview/llfloaterevent.cpp +++ b/indra/newview/llfloaterevent.cpp @@ -34,14 +34,14 @@ class LLEventHandler : public LLCommandHandler  {  public:  	LLEventHandler() : LLCommandHandler("event") { } -	bool handle(const LLSD& tokens, const LLSD& queryMap) +	bool handle(const std::vector<std::string>& tokens)  	{  		if (tokens.size() < 2)  		{  			return false;  		} -		U32 event_id = tokens[0].asInteger(); -		if (tokens[1].asString() == "about") +		U32 event_id = atoi(tokens[0].c_str()); +		if (tokens[1] == "about")  		{  			LLFloaterEventInfo::show(event_id);  			return true; diff --git a/indra/newview/llfloaterparcel.cpp b/indra/newview/llfloaterparcel.cpp index f737188b34..61b7176153 100644 --- a/indra/newview/llfloaterparcel.cpp +++ b/indra/newview/llfloaterparcel.cpp @@ -29,7 +29,7 @@ class LLParcelHandler : public LLCommandHandler  {  public:  	LLParcelHandler() : LLCommandHandler("parcel") { } -	bool handle(const LLSD& params, const LLSD& queryMap) +	bool handle(const std::vector<std::string>& params)  	{  		if (params.size() < 2)  		{ @@ -40,7 +40,7 @@ public:  		{  			return false;  		} -		if (params[1].asString() == "about") +		if (params[1] == "about")  		{  			LLFloaterParcelInfo::show(parcel_id);  			return true; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 25a88e6e7c..100ae0cfae 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -47,16 +47,13 @@  #include "llspinctrl.h"  #include "message.h" -#include "llcommandhandler.h"  #include "llfloaterabout.h" -#include "llfloaterpreference.h"  #include "llpanelnetwork.h"  #include "llpanelaudioprefs.h"  #include "llpaneldisplay.h"  #include "llpaneldebug.h"  #include "llpanelgeneral.h"  #include "llpanelinput.h" -#include "llpanellogin.h"  #include "llpanelLCD.h"  #include "llpanelmsgs.h"  #include "llpanelweb.h" @@ -74,13 +71,6 @@  #include "llkeyboard.h"  #include "llscrollcontainer.h" -#if LL_WINDOWS -// for Logitech LCD keyboards / speakers -#ifndef LL_LOGITECH_LCD_H -#include "lllogitechlcd.h" -#endif -extern llLCD	*gLcdScreen;  -#endif  const S32 PREF_BORDER = 4;  const S32 PREF_PAD = 5; @@ -91,20 +81,13 @@ const S32 PREF_FLOATER_MIN_HEIGHT = 2 * SCROLLBAR_SIZE + 2 * LLPANEL_BORDER_WIDT  LLFloaterPreference* LLFloaterPreference::sInstance = NULL; - -class LLPreferencesHandler : public LLCommandHandler -{ -public: -	LLPreferencesHandler() : LLCommandHandler("preferences") { } -	bool handle(const LLSD& tokens, const LLSD& queryMap) -	{ -		LLFloaterPreference::show(NULL); -		return true; -	} -}; - -LLPreferencesHandler gPreferencesHandler; - +#if LL_WINDOWS +// for Logitech LCD keyboards / speakers +#ifndef LL_LOGITECH_LCD_H +#include "lllogitechlcd.h" +#endif +extern llLCD	*gLcdScreen;  +#endif  // Must be done at run time, not compile time. JC  S32 pref_min_width() @@ -427,8 +410,6 @@ void LLFloaterPreference::show(void*)  		gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());  		gAgent.sendReliableMessage();  	} - -	LLPanelLogin::setAlwaysRefresh(true);  } @@ -442,9 +423,6 @@ void LLFloaterPreference::onClickAbout(void*)  // static   void LLFloaterPreference::onBtnOK( void* userdata )  { -	//refresh splash page if we're displaying it -	LLPanelLogin::loadLoginPage(); -  	LLFloaterPreference *fp =(LLFloaterPreference *)userdata;  	// commit any outstanding text entry  	if (fp->hasFocus()) @@ -488,16 +466,6 @@ void LLFloaterPreference::onBtnApply( void* userdata )  		}  	}  	fp->apply(); - -	//refresh splash page if we're displaying it -	LLPanelLogin::loadLoginPage(); -} - - -void LLFloaterPreference::onClose(bool app_quitting) -{ -	LLPanelLogin::setAlwaysRefresh(false); -	LLFloater::onClose(app_quitting);  } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index bf554766b7..a4c43fc8d6 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -117,7 +117,6 @@ protected:  	LLPreferenceCore		*mPreferenceCore;  	/*virtual*/ void		draw(); -	/*virtual*/ void		onClose(bool app_quitting);  	LLButton*	mAboutBtn;  	LLButton	*mOKBtn; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 8ebdb14e15..fe07175529 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -44,16 +44,13 @@  #include "llbutton.h"  #include "llcheckboxctrl.h" -#include "llcommandhandler.h"  #include "llcombobox.h" -#include "llcurl.h"  #include "llviewercontrol.h"  #include "llfloaterabout.h"  #include "llfloatertest.h"  #include "llfloaterpreference.h"  #include "llfocusmgr.h"  #include "lllineeditor.h" -#include "llstartup.h"  #include "lltextbox.h"  #include "llui.h"  #include "lluiconstants.h" @@ -77,145 +74,11 @@  #include "llglheaders.h" -LLString load_password_from_disk(void); -void save_password_to_disk(const char* hashed_password); -  const S32 BLACK_BORDER_HEIGHT = 160;  const S32 MAX_PASSWORD = 16;  LLPanelLogin *LLPanelLogin::sInstance = NULL; - - -//parses the input url and returns true if afterwards -//a web-login-key, firstname and lastname  is set -bool LLLoginHandler::parseDirectLogin(std::string url) -{ -	LLURI uri(url); -	parse(uri.queryMap()); - -	if (mWebLoginKey.isNull() || -		mFirstName.empty() || -		mLastName.empty()) -	{ -		return false; -	} -	else -	{ -		return true; -	} -} - - -void LLLoginHandler::parse(const LLSD& queryMap) -{ -	mWebLoginKey = queryMap["web_login_key"].asUUID(); -	mFirstName = queryMap["first_name"].asString(); -	mLastName = queryMap["last_name"].asString(); -	 -	if (queryMap["grid"].asString() == "aditi") -	{ -		gGridChoice = GRID_INFO_ADITI; -	} -	else if (queryMap["grid"].asString() == "agni") -	{ -		gGridChoice = GRID_INFO_AGNI; -	} -	else if (queryMap["grid"].asString() == "siva") -	{ -		gGridChoice = GRID_INFO_SIVA; -	} -	else if (queryMap["grid"].asString() == "durga") -	{ -		gGridChoice = GRID_INFO_DURGA; -	} -	else if (queryMap["grid"].asString() == "shakti") -	{ -		gGridChoice = GRID_INFO_SHAKTI; -	} -	else if (queryMap["grid"].asString() == "soma") -	{ -		gGridChoice = GRID_INFO_SOMA; -	} -	else if (queryMap["grid"].asString() == "ganga") -	{ -		gGridChoice = GRID_INFO_GANGA; -	} -	else if (queryMap["grid"].asString() == "vaak") -	{ -		gGridChoice = GRID_INFO_VAAK; -	} -	else if (queryMap["grid"].asString() == "uma") -	{ -		gGridChoice = GRID_INFO_UMA; -	} -	 -	snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		/* Flawfinder: ignore */ -	LLAppViewer::instance()->resetURIs(); -	 -	LLString startLocation = queryMap["location"].asString(); - -	if (startLocation == "specify") -	{ -		LLURLSimString::setString(queryMap["region"].asString()); -	} -	else if (startLocation == "home") -	{ -		gSavedSettings.setBOOL("LoginLastLocation", FALSE); -		LLURLSimString::setString(""); -	} -	else if (startLocation == "last") -	{ -		gSavedSettings.setBOOL("LoginLastLocation", TRUE); -		LLURLSimString::setString(""); -	} -} - -bool LLLoginHandler::handle(const LLSD& tokens, -						  const LLSD& queryMap) -{	 -	parse(queryMap); -	 -	//if we haven't initialized stuff yet, this is  -	//coming in from the GURL handler, just parse -	if (STATE_FIRST == LLStartUp::getStartupState()) -	{ -		return true; -	} -	 -	LLString password = queryMap["password"].asString(); - -	if (!password.empty()) -	{ -		gSavedSettings.setBOOL("RememberPassword", TRUE); - -		if (password.substr(0,3) != "$1$") -		{ -			LLMD5 pass((unsigned char*)password.c_str()); -			char md5pass[33];		/* Flawfinder: ignore */ -			pass.hex_digest(md5pass); -			password = md5pass; -			save_password_to_disk(password.c_str()); -		} -	} -	else -	{ -		save_password_to_disk(NULL); -		gSavedSettings.setBOOL("RememberPassword", FALSE); -	} -			 - -	if  (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)  //on splash page -	{ -		if (mWebLoginKey.isNull()) { -			LLPanelLogin::loadLoginPage(); -		} else { -			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); -		} -	} -	return true; -} - -LLLoginHandler gLoginHandler; +BOOL LLPanelLogin::sCapslockDidNotification = FALSE;  // helper class that trys to download a URL from a web site and calls a method   // on parent class indicating if the web server is working or not @@ -294,11 +157,92 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE);  	gUICtrlFactory->buildPanel(this, "panel_login.xml"); -	 -	//leave room for the login menu bar -	setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0));  +	//setRect(rect);  	reshape(rect.getWidth(), rect.getHeight()); + +	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace); +	childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace); + +	childSetCommitCallback("password_edit", mungePassword); +	childSetKeystrokeCallback("password_edit", onPassKey, this); +	childSetUserData("password_edit", this); + +	LLLineEditor* edit = LLUICtrlFactory::getLineEditorByName(this, "password_edit"); +	if (edit) edit->setDrawAsterixes(TRUE); + +	LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(this, "start_location_combo"); +	if (combo) +	{ +		combo->setAllowTextEntry(TRUE, 128, FALSE); + +		// The XML file loads the combo with the following labels: +		// 0 - "My Home" +		// 1 - "My Last Location" +		// 2 - "<Type region name>" + +		BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); +		LLString sim_string = LLURLSimString::sInstance.mSimString; +		if (!sim_string.empty()) +		{ +			// Replace "<Type region name>" with this region name +			combo->remove(2); +			combo->add( sim_string ); +			combo->setTextEntry(sim_string); +			combo->setCurrentByIndex( 2 ); +		} +		else if (login_last) +		{ +			combo->setCurrentByIndex( 1 ); +		} +		else +		{ +			combo->setCurrentByIndex( 0 ); +		} + +		combo->setCommitCallback( &LLPanelGeneral::set_start_location ); +	} +	// Specific servers added later. +	childSetVisible("server_combo", show_server); + +	childSetAction("new_account_btn", onClickNewAccount, this); +	childSetVisible("new_account_btn", !gHideLinks); + +	childSetAction("connect_btn", onClickConnect, this); + +	setDefaultBtn("connect_btn"); + +	childSetAction("preferences_btn", LLFloaterPreference::show, this); + +	childSetAction("quit_btn", onClickQuit, this); + +	LLTextBox* version_text = LLUICtrlFactory::getTextBoxByName(this, "version_text"); +	if (version_text) +	{ +		LLString version = llformat("%d.%d.%d (%d)", +			LL_VERSION_MAJOR, +			LL_VERSION_MINOR, +			LL_VERSION_PATCH, +			LL_VIEWER_BUILD ); +		version_text->setText(version); +		version_text->setClickedCallback(onClickVersion); +		version_text->setCallbackUserData(this); +	} + +	LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text"); +	if (channel_text) +	{ +		channel_text->setText(gChannelName); +		channel_text->setClickedCallback(onClickVersion); +		channel_text->setCallbackUserData(this); +	} + +	LLTextBox* forgot_password_text = LLUICtrlFactory::getTextBoxByName(this, "forgot_password_text"); +	if (forgot_password_text) +	{ +		forgot_password_text->setClickedCallback(onClickForgotPassword); +	} +      	// get the web browser control  	#if LL_LIBXUL_ENABLED  	LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html"); @@ -322,11 +266,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  		// force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through)  		LLRect htmlRect = mRect; -		htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY(), mRect.getWidth() + 6, mRect.getHeight()); +		htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY() + 40, mRect.getWidth() + 6, mRect.getHeight() - 78 );  		web_browser->setRect( htmlRect );  		web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE ); -		reshape( mRect.getWidth(), mRect.getHeight(), 1 );     -		 +		reshape( mRect.getWidth(), mRect.getHeight(), 1 ); +  		// kick off a request to grab the url manually  		gResponsePtr = LLIamHereLogin::build( this );  		LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr ); @@ -336,6 +280,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	#endif  	// Initialize visibility (and don't force visibility - use prefs) +	refreshLocation( false );  }  void LLPanelLogin::setSiteIsAlive( bool alive ) @@ -347,8 +292,9 @@ void LLPanelLogin::setSiteIsAlive( bool alive )  	{  		if ( web_browser )  		{ -			loadLoginPage(); -			 +			// navigate to the "real" page  +			web_browser->navigateTo( childGetValue( "real_url" ).asString() ); +  			// mark as available  			mHtmlAvailable = TRUE;  		}; @@ -370,6 +316,21 @@ void LLPanelLogin::setSiteIsAlive( bool alive )  #endif  } +void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data) +{ +	LLPanelLogin* self = (LLPanelLogin*)user_data; +	LLLineEditor* editor = (LLLineEditor*)caller; +	std::string password = editor->getText(); + +	// Re-md5 if we've changed at all +	if (password != self->mIncomingPassword) +	{ +		LLMD5 pass((unsigned char *)password.c_str()); +		char munged_password[MD5HEX_STR_SIZE]; +		pass.hex_digest(munged_password); +		self->mMungedPassword = munged_password; +	} +}  LLPanelLogin::~LLPanelLogin()  { @@ -405,6 +366,13 @@ void LLPanelLogin::draw()  			glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f);  			glScalef(image_aspect / view_aspect, 1.f, 1.f);  		} +		// Don't maintain aspect ratio if screen wider than image.  This results in the +		// hand being partially cut off.  JC +		//else +		//{ +		//	glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * (F32)BLACK_BORDER_HEIGHT, 0.f); +		//	glScalef(1.f, view_aspect / image_aspect, 1.f); +		//}  		S32 width = mRect.getWidth();  		S32 height = mRect.getHeight(); @@ -413,6 +381,9 @@ void LLPanelLogin::draw()  		{  			// draw a background box in black  			gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) ); + +			// draw the bottom part of the background image - just the blue background to the native client UI +			gl_draw_scaled_image(0, -264, width + 8, mLogoImage->getHeight(), mLogoImage);  		}  		else  		{ @@ -480,14 +451,54 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)  	return LLPanel::handleKeyHere(key, mask, called_from_parent);  } -	 + +// virtual  +void LLPanelLogin::setFocus(BOOL b) +{ +	if(b != hasFocus()) +	{ +		if(b) +		{ +			LLPanelLogin::giveFocus(); +		} +		else +		{ +			LLPanel::setFocus(b); +		} +	} +}  // static  void LLPanelLogin::giveFocus()  { +	if( sInstance ) +	{ +		// Grab focus and move cursor to first blank input field +		std::string first = sInstance->childGetText("first_name_edit"); +		std::string pass = sInstance->childGetText("password_edit"); -	if (sInstance) -		sInstance->setFocus(TRUE); +		BOOL have_first = !first.empty(); +		BOOL have_pass = !pass.empty(); + +		LLLineEditor* edit = NULL; +		if (have_first && !have_pass) +		{ +			// User saved his name but not his password.  Move +			// focus to password field. +			edit = LLUICtrlFactory::getLineEditorByName(sInstance, "password_edit"); +		} +		else +		{ +			// User doesn't have a name, so start there. +			edit = LLUICtrlFactory::getLineEditorByName(sInstance, "first_name_edit"); +		} + +		if (edit) +		{ +			edit->setFocus(TRUE); +			edit->selectAll(); +		} +	}  } @@ -499,156 +510,266 @@ void LLPanelLogin::show(const LLRect &rect,  {  	new LLPanelLogin(rect, show_server, callback, callback_data); -	LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); -	 -	if (!web_browser) return; -  	if( !gFocusMgr.getKeyboardFocus() )  	{  		// Grab focus and move cursor to first enabled control -		web_browser->setFocus(TRUE); +		sInstance->setFocus(TRUE);  	}  	// Make sure that focus always goes here (and use the latest sInstance that was just created) -	gFocusMgr.setDefaultKeyboardFocus(web_browser); +	gFocusMgr.setDefaultKeyboardFocus(sInstance);  } -  // static -void LLPanelLogin::close() +void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, +							 BOOL remember)  { -	if (sInstance) +	if (!sInstance)  	{ -		gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); -		 -		gFocusMgr.setDefaultKeyboardFocus(NULL); +		llwarns << "Attempted fillFields with no login view shown" << llendl; +		return; +	} -		delete sInstance; -		sInstance = NULL; +	sInstance->childSetText("first_name_edit", firstname); +	sInstance->childSetText("last_name_edit", lastname); + +	// Max "actual" password length is 16 characters. +	// Hex digests are always 32 characters. +	if (password.length() == 32) +	{ +		// This is a MD5 hex digest of a password. +		// We don't actually use the password input field,  +		// fill it with MAX_PASSWORD characters so we get a  +		// nice row of asterixes. +		const std::string filler("123456789!123456"); +		sInstance->childSetText("password_edit", filler); +		sInstance->mIncomingPassword = filler; +		sInstance->mMungedPassword = password; +	} +	else +	{ +		// this is a normal text password +		sInstance->childSetText("password_edit", password); +		sInstance->mIncomingPassword = password; +		LLMD5 pass((unsigned char *)password.c_str()); +		char munged_password[MD5HEX_STR_SIZE]; +		pass.hex_digest(munged_password); +		sInstance->mMungedPassword = munged_password;  	} + +	sInstance->childSetValue("remember_check", remember);  } +  // static -void LLPanelLogin::setAlwaysRefresh(bool refresh) +void LLPanelLogin::addServer(const char *server, S32 domain_name)  { -	if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return; - -	LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); +	if (!sInstance) +	{ +		llwarns << "Attempted addServer with no login view shown" << llendl; +		return; +	} -	if (web_browser) +	LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); +	if (combo)  	{ -		web_browser->setAlwaysRefresh(refresh); +		combo->add(server, LLSD(domain_name) ); +		combo->setCurrentByIndex(0);  	}  } - - -void LLPanelLogin::loadLoginPage() +// static +void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &password, +							BOOL &remember)  { -	if (!sInstance) return; +	if (!sInstance) +	{ +		llwarns << "Attempted getFields with no login view shown" << llendl; +		return; +	} + +	firstname = sInstance->childGetText("first_name_edit"); +	LLString::trim(firstname); -	LLURLSimString::sInstance.parse(); +	lastname = sInstance->childGetText("last_name_edit"); +	LLString::trim(lastname); -	LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); +	password = sInstance->mMungedPassword; +	remember = sInstance->childGetValue("remember_check"); +} -	std::ostringstream oStr; -	LLString location; -	LLString region; -	LLString password; -	 -	if (LLURLSimString::parse()) +// static.  Return TRUE if user made a choice from the popup +BOOL LLPanelLogin::getServer(LLString &server, S32 &domain_name) +{ +	BOOL user_picked = FALSE; +	if (!sInstance)  	{ -		std::ostringstream oRegionStr; -		location = "specify"; -		oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/" -			 << LLURLSimString::sInstance.mY << "/" -			 << LLURLSimString::sInstance.mZ; -		region = oRegionStr.str(); +		llwarns << "Attempted getServer with no login view shown" << llendl;  	}  	else  	{ -		if (gSavedSettings.getBOOL("LoginLastLocation")) -		{ -			location = "last"; -		} -		else +		LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); +		if (combo)  		{ -			location = "home"; +			LLSD combo_val = combo->getValue(); +			if (LLSD::TypeInteger == combo_val.type()) +			{ +				domain_name = combo->getValue().asInteger(); + +				if ((S32)GRID_INFO_OTHER == domain_name) +				{ +					server = gGridName; +				} +			} +			else +			{ +				// no valid selection, return other +				domain_name = (S32)GRID_INFO_OTHER; +				server = combo_val.asString(); +			} +			user_picked = combo->isDirty();  		}  	} -	 -	LLString firstname, lastname; -	 -	if (gCmdLineFirstName.empty()) + +	return user_picked; +} + +// static +void LLPanelLogin::getLocation(LLString &location) +{ +	if (!sInstance)  	{ -		firstname = gSavedSettings.getString("FirstName"); +		llwarns << "Attempted getLocation with no login view shown" << llendl; +		return;  	} -	else +	 +	LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo"); +	if (combo)  	{ -		firstname = gCmdLineFirstName; +		location = combo->getValue().asString();  	} -	 -	if (gCmdLineLastName.empty()) +} + +// static +void LLPanelLogin::refreshLocation( bool force_visible ) +{ +	if (!sInstance) return; + +	LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo"); +	if (!combo) return; + +	LLString sim_string = LLURLSimString::sInstance.mSimString; +	if (!sim_string.empty())  	{ -		lastname = gSavedSettings.getString("LastName"); +		combo->setCurrentByIndex( 3 );		// BUG?  Maybe 2? +		combo->setTextEntry(sim_string);  	}  	else  	{ -		lastname = gCmdLineLastName; +		BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); +		combo->setCurrentByIndex( login_last ? 1 : 0 );  	} -	 -	LLString version = llformat("%d.%d.%d (%d)", -						LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD); -	char* curl_region = curl_escape(region.c_str(), 0); -	char* curl_channel = curl_escape(gChannelName.c_str(), 0); -	char* curl_version = curl_escape(version.c_str(), 0); +	BOOL show_start = TRUE; -	 -	oStr << sInstance->childGetValue( "real_url" ).asString()  << "&firstname=" << firstname << -		"&lastname=" << lastname << "&location=" << location <<	"®ion=" << curl_region << -		"&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel << -		"&version=" << curl_version; +	if ( ! force_visible ) +		show_start = gSavedSettings.getBOOL("ShowStartLocation"); -	 -	curl_free(curl_region); -	curl_free(curl_channel); -	curl_free(curl_version); +	sInstance->childSetVisible("start_location_combo", show_start); +	sInstance->childSetVisible("start_location_text", show_start); +} + +// static +void LLPanelLogin::close() +{ +	if (sInstance) +	{ +		gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); +		 +		gFocusMgr.setDefaultKeyboardFocus(NULL); + +		delete sInstance; +		sInstance = NULL; +	} +} + + +//--------------------------------------------------------------------------- +// Protected methods +//--------------------------------------------------------------------------- -	if (!gCmdLinePassword.empty()) +// static +void LLPanelLogin::onClickConnect(void *) +{ +	if (sInstance && sInstance->mCallback)  	{ -		oStr << "&password=" << gCmdLinePassword; +		// tell the responder we're not here anymore +		if ( gResponsePtr ) +			gResponsePtr->setParent( 0 ); + +		// JC - Make sure the fields all get committed. +		sInstance->setFocus(FALSE); + +		LLString first = sInstance->childGetText("first_name_edit"); +		LLString last  = sInstance->childGetText("last_name_edit"); +		if (!first.empty() && !last.empty()) +		{ +			// has both first and last name typed + +			// store off custom server entry, if currently selected +			LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); +			if (combo) +			{ +				S32 selected_server = combo->getValue(); +				if (selected_server == GRID_INFO_NONE) +				{ +					LLString custom_server = combo->getValue().asString(); +					gSavedSettings.setString("CustomServer", custom_server); +				} +			} +			sInstance->mCallback(0, sInstance->mCallbackData); +		} +		else +		{ +			// empty first or last name +			// same as clicking new account +			onClickNewAccount(NULL); +		}  	} -	else if (!(password = load_password_from_disk()).empty()) +} + + +// static +void LLPanelLogin::newAccountAlertCallback(S32 option, void*) +{ +	if (0 == option)  	{ -		oStr << "&password=$1$" << password; +		llinfos << "Going to account creation URL" << llendl; +		LLWeb::loadURL( CREATE_ACCOUNT_URL );  	} -	if (gAutoLogin) +	else  	{ -		oStr << "&auto_login=TRUE"; +		sInstance->setFocus(TRUE);  	} -	if (gSavedSettings.getBOOL("ShowStartLocation")) +} + + +// static +void LLPanelLogin::onClickNewAccount(void*) +{ +	if (gHideLinks)  	{ -		oStr << "&show_start_location=TRUE"; -	}	 -	if (gSavedSettings.getBOOL("RememberPassword")) +		gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks"); +	} +	else  	{ -		oStr << "&remember_password=TRUE"; -	}	 -#ifndef	LL_RELEASE_FOR_DOWNLOAD -	oStr << "&show_grid=TRUE"; -#endif -	 -	// navigate to the "real" page  -	web_browser->navigateTo( oStr.str() ); +		gViewerWindow->alertXml("MustHaveAccountToLogIn", +								LLPanelLogin::newAccountAlertCallback); +	}  } -//--------------------------------------------------------------------------- -// Protected methods -//--------------------------------------------------------------------------- -  // static  void LLPanelLogin::onClickQuit(void*)  { @@ -668,3 +789,22 @@ void LLPanelLogin::onClickVersion(void*)  {  	LLFloaterAbout::show(NULL);  } + +void LLPanelLogin::onClickForgotPassword(void*) +{ +	if (sInstance ) +	{ +		LLWeb::loadURL(sInstance->childGetValue( "forgot_password_url" ).asString()); +	} +} + + +// static +void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data) +{ +	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE) +	{ +		LLNotifyBox::showXml("CapsKeyOn"); +		sCapslockDidNotification = TRUE; +	} +} diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 191e88c25b..447b9ea01c 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -33,7 +33,7 @@  #define LL_LLPANELLOGIN_H  #include "llpanel.h" -#include "llcommandhandler.h" +  #include "lldbstrings.h"  #include "llmemory.h"  #include "llviewerimage.h" @@ -46,22 +46,6 @@ class LLCheckBoxCtrl;  class LLButton;  class LLComboBox; - -class LLLoginHandler : public LLCommandHandler -{ - public: -	LLLoginHandler() : LLCommandHandler("login") { } -	bool handle(const LLSD& tokens, const LLSD& queryMap); -	bool parseDirectLogin(std::string url); -	void parse(const LLSD& queryMap); - -	LLUUID mWebLoginKey; -	LLString mFirstName; -	LLString mLastName; -}; - -extern LLLoginHandler gLoginHandler; -  class LLPanelLogin  :	public LLPanel  { @@ -73,22 +57,39 @@ public:  	virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);  	virtual void draw(); +	virtual void setFocus( BOOL b );  	static void show(const LLRect &rect, BOOL show_server,   		void (*callback)(S32 option, void* user_data),   		void* callback_data); +	static void setFields(const std::string& firstname, const std::string& lastname,  +		const std::string& password, BOOL remember); + +	static void addServer(const char *server, S32 domain_name); +	static void refreshLocation( bool force_visible ); + +	static void getFields(LLString &firstname, LLString &lastname, +		LLString &password, BOOL &remember); + +	static BOOL getServer(LLString &server, S32& domain_name); +	static void getLocation(LLString &location); +  	static void close();  	void setSiteIsAlive( bool alive ); -	static void loadLoginPage();	 -	static void giveFocus(); -	static void setAlwaysRefresh(bool refresh);  - +	static void	giveFocus(); +	static void mungePassword(LLUICtrl* caller, void* user_data); +	  private: +	static void onClickConnect(void*); +	static void onClickNewAccount(void*); +	static void newAccountAlertCallback(S32 option, void*);  	static void onClickQuit(void*);  	static void onClickVersion(void*); +	static void onClickForgotPassword(void*); +	static void onPassKey(LLLineEditor* caller, void* user_data);  private:  	LLPointer<LLViewerImage> mLogoImage; @@ -96,7 +97,11 @@ private:  	void			(*mCallback)(S32 option, void *userdata);  	void*			mCallbackData; +	std::string mIncomingPassword; +	std::string mMungedPassword; +  	static LLPanelLogin* sInstance; +	static BOOL		sCapslockDidNotification;  	BOOL			mHtmlAvailable;  }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 267b2340d0..d5af7243a0 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -329,7 +329,6 @@ BOOL idle_startup()  	static std::string auth_message;  	static LLString firstname;  	static LLString lastname; -	static LLUUID web_login_key;  	static LLString password;  	static std::vector<const char*> requested_options; @@ -349,6 +348,7 @@ BOOL idle_startup()  	static S32  location_which = START_LOCATION_ID_LAST;  	static BOOL show_connect_box = TRUE; +	static BOOL remember_password = TRUE;  	static BOOL stipend_since_login = FALSE; @@ -634,34 +634,28 @@ BOOL idle_startup()  		//  		// Log on to system  		// -		if ((!gLoginHandler.mFirstName.empty() && -			 !gLoginHandler.mLastName.empty() && -			 !gLoginHandler.mWebLoginKey.isNull())		 -			|| gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand) ) -		{ -			firstname = gLoginHandler.mFirstName; -			lastname = gLoginHandler.mLastName; -			web_login_key = gLoginHandler.mWebLoginKey; - -			show_connect_box = FALSE; -		} -		else if( !gCmdLineFirstName.empty()  +		if( !gCmdLineFirstName.empty()   			&& !gCmdLineLastName.empty()   			&& !gCmdLinePassword.empty())  		{  			firstname = gCmdLineFirstName;  			lastname = gCmdLineLastName; -			show_connect_box = TRUE; -			gAutoLogin = TRUE; +			LLMD5 pass((unsigned char*)gCmdLinePassword.c_str()); +			char md5pass[33];		/* Flawfinder: ignore */ +			pass.hex_digest(md5pass); +			password = md5pass; + +			remember_password = gSavedSettings.getBOOL("RememberPassword"); +			show_connect_box = FALSE;  		}  		else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin"))  		{  			firstname = gSavedSettings.getString("FirstName");  			lastname = gSavedSettings.getString("LastName");  			password = load_password_from_disk(); -			gSavedSettings.setBOOL("RememberPassword", TRUE); -			show_connect_box = TRUE; +			remember_password = TRUE; +			show_connect_box = FALSE;  		}  		else  		{ @@ -670,6 +664,7 @@ BOOL idle_startup()  			firstname = gSavedSettings.getString("FirstName");  			lastname = gSavedSettings.getString("LastName");  			password = load_password_from_disk(); +			remember_password = gSavedSettings.getBOOL("RememberPassword");  			show_connect_box = TRUE;  		} @@ -679,8 +674,7 @@ BOOL idle_startup()  	}  	if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) -	{		 - +	{  		llinfos << "Initializing Window" << llendl;  		gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); @@ -701,6 +695,8 @@ BOOL idle_startup()  			// Show the login dialog  			login_show(); +			// connect dialog is already shown, so fill in the names +			LLPanelLogin::setFields( firstname, lastname, password, remember_password );  			LLPanelLogin::giveFocus();  			gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); @@ -712,31 +708,6 @@ BOOL idle_startup()  			// skip directly to message template verification  			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );  		} -		 -		// Create selection manager -		// Must be done before menus created, because many enabled callbacks -		// require its existance. -		gSelectMgr = new LLSelectMgr(); -		gParcelMgr = new LLViewerParcelMgr(); -		gHUDManager = new LLHUDManager(); -		gMuteListp = new LLMuteList(); - -		// Initialize UI -		if (!gNoRender) -		{ -			// Initialize all our tools.  Must be done after saved settings loaded. -			if ( gToolMgr == NULL ) -			{ -				gToolMgr = new LLToolMgr(); -				gToolMgr->initTools(); -			} - -			// Quickly get something onscreen to look at. -			gViewerWindow->initWorldUI(); -		} -		 -		gViewerWindow->setNormalControlsVisible( FALSE );	 -		gLoginMenuBarView->setVisible( TRUE );  		timeout.reset();  		return do_normal_idle; @@ -754,16 +725,11 @@ BOOL idle_startup()  	if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())  	{ -		//reset the values that could have come in from a slurl -		if (!gLoginHandler.mWebLoginKey.isNull()) -		{ -			firstname = gLoginHandler.mFirstName; -			lastname = gLoginHandler.mLastName; -			web_login_key = gLoginHandler.mWebLoginKey; -		} -				  		if (show_connect_box)  		{ +			// Load all the name information out of the login view +			LLPanelLogin::getFields(firstname, lastname, password, remember_password); +  			// HACK: Try to make not jump on login  			gKeyboard->resetKeys();  		} @@ -823,6 +789,25 @@ BOOL idle_startup()  		if (show_connect_box)  		{ +			LLString server_label; +			S32 domain_name_index; +			BOOL user_picked_server = LLPanelLogin::getServer( server_label, domain_name_index ); +			gGridChoice = (EGridInfo) domain_name_index; +			gSavedSettings.setS32("ServerChoice", gGridChoice); +			if (gGridChoice == GRID_INFO_OTHER) +			{ +				snprintf(gGridName, MAX_STRING, "%s", server_label.c_str());			/* Flawfinder: ignore */ +			} + +			if ( user_picked_server ) +			{	// User picked a grid from the popup, so clear the stored urls and they will be re-generated from gGridChoice +				sAuthUris.clear(); +                LLAppViewer::instance()->resetURIs(); +			} + +			LLString location; +			LLPanelLogin::getLocation( location ); +			LLURLSimString::setString( location );  			LLPanelLogin::close();  		} @@ -955,12 +940,11 @@ BOOL idle_startup()  			// a startup URL was specified  			std::stringstream unescaped_start;  			unescaped_start << "uri:"  -							<< LLURLSimString::sInstance.mSimName << "&"  -							<< LLURLSimString::sInstance.mX << "&"  -							<< LLURLSimString::sInstance.mY << "&"  -							<< LLURLSimString::sInstance.mZ; +				<< LLURLSimString::sInstance.mSimName << "&"  +				<< LLURLSimString::sInstance.mX << "&"  +				<< LLURLSimString::sInstance.mY << "&"  +				<< LLURLSimString::sInstance.mZ;  			start << xml_escape_string(unescaped_start.str().c_str()); -			  		}  		else if (gSavedSettings.getBOOL("LoginLastLocation"))  		{ @@ -976,13 +960,13 @@ BOOL idle_startup()  		hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES );  		hashed_mac.finalize();  		hashed_mac.hex_digest(hashed_mac_string); - +		  		gUserAuthp->authenticate(  			sAuthUris[sAuthUriNum].c_str(),  			auth_method.c_str(),  			firstname.c_str(),  			lastname.c_str(), -			web_login_key, +			password.c_str(),  			start.str().c_str(),  			gSkipOptionalUpdate,  			gAcceptTOS, @@ -992,7 +976,6 @@ BOOL idle_startup()  			requested_options,  			hashed_mac_string,  			LLAppViewer::instance()->getSerialNumber()); -  		// reset globals  		gAcceptTOS = FALSE;  		gAcceptCriticalMessage = FALSE; @@ -1254,7 +1237,15 @@ BOOL idle_startup()  			if(text) lastname.assign(text);  			gSavedSettings.setString("FirstName", firstname);  			gSavedSettings.setString("LastName", lastname); -			 +			if (remember_password) +			{ +				save_password_to_disk(password.c_str()); +			} +			else +			{ +				save_password_to_disk(NULL); +			} +			gSavedSettings.setBOOL("RememberPassword", remember_password);  			gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation"));  			text = gUserAuthp->getResponse("agent_access"); @@ -1480,6 +1471,14 @@ BOOL idle_startup()  		// type the name/password again if we crash.  		gSavedSettings.saveToFile(gSettingsFileName, TRUE); +		// Create selection manager +		// Must be done before menus created, because many enabled callbacks +		// require its existance. +		gSelectMgr = new LLSelectMgr(); +		gParcelMgr = new LLViewerParcelMgr(); +		gHUDManager = new LLHUDManager(); +		gMuteListp = new LLMuteList(); +  		//  		// Initialize classes w/graphics stuff.  		// @@ -1548,11 +1547,21 @@ BOOL idle_startup()  		if ( gViewerWindow != NULL && gToolMgr != NULL )  		{	// This isn't the first logon attempt, so show the UI  			gViewerWindow->setNormalControlsVisible( TRUE ); -		}	 -		gLoginMenuBarView->setVisible( FALSE ); +		} +		// Initialize UI  		if (!gNoRender)  		{ +			// Initialize all our tools.  Must be done after saved settings loaded. +			if ( gToolMgr == NULL ) +			{ +				gToolMgr = new LLToolMgr(); +				gToolMgr->initTools(); +			} + +			// Quickly get something onscreen to look at. +			gViewerWindow->initWorldUI(); +  			// Move the progress view in front of the UI  			gViewerWindow->moveProgressViewToFront(); @@ -2335,12 +2344,68 @@ void login_show()  	// UI textures have been previously loaded in doPreloadImages()  	llinfos << "Setting Servers" << llendl; +	 +	if( GRID_INFO_OTHER == gGridChoice ) +	{ +		LLPanelLogin::addServer( gGridName, GRID_INFO_OTHER ); +	} +	else +	{ +		LLPanelLogin::addServer( gGridInfo[gGridChoice].mLabel, gGridChoice ); +	} + +	// Arg!  We hate loops! +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_DMZ].mLabel,	GRID_INFO_DMZ ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_LOCAL].mLabel,	GRID_INFO_LOCAL ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_AGNI].mLabel,	GRID_INFO_AGNI ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_ADITI].mLabel,	GRID_INFO_ADITI ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SIVA].mLabel,	GRID_INFO_SIVA ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_DURGA].mLabel,	GRID_INFO_DURGA ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SHAKTI].mLabel,	GRID_INFO_SHAKTI ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_GANGA].mLabel,	GRID_INFO_GANGA ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_UMA].mLabel,	GRID_INFO_UMA ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SOMA].mLabel,	GRID_INFO_SOMA ); +	LLPanelLogin::addServer( gGridInfo[GRID_INFO_VAAK].mLabel,	GRID_INFO_VAAK );  }  // Callback for when login screen is closed.  Option 0 = connect, option 1 = quit.  void login_callback(S32 option, void *userdata)  { +	const S32 CONNECT_OPTION = 0; +	const S32 QUIT_OPTION = 1; +	if (CONNECT_OPTION == option) +	{ +		LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); +		return; +	} +	else if (QUIT_OPTION == option) +	{ +		// Make sure we don't save the password if the user is trying to clear it. +		LLString first, last, password; +		BOOL remember = TRUE; +		LLPanelLogin::getFields(first, last, password, remember); +		if (!remember) +		{ +			// turn off the setting and write out to disk +			gSavedSettings.setBOOL("RememberPassword", FALSE); +			gSavedSettings.saveToFile(gSettingsFileName, TRUE); + +			// stomp the saved password on disk +			save_password_to_disk(NULL); +		} + +		LLPanelLogin::close(); + +		// Next iteration through main loop should shut down the app cleanly. +		LLAppViewer::instance()->userQuit(); // gQuit = TRUE; + +		return; +	} +	else +	{ +		llwarns << "Unknown login button clicked" << llendl; +	}  }  LLString load_password_from_disk() @@ -3580,7 +3645,6 @@ void reset_login()  	if ( gViewerWindow )  	{	// Hide menus and normal buttons  		gViewerWindow->setNormalControlsVisible( FALSE ); -		gLoginMenuBarView->setVisible( TRUE );  	}  	// Hide any other stuff diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index fa8213d662..166209d582 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -85,8 +85,6 @@ LLToolPie::LLToolPie()  BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)  { -	if (!gCamera) return FALSE; -  	//left mouse down always picks transparent  	gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback,   											  TRUE, TRUE); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 2a50a4d09b..5b8583d211 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -48,6 +48,9 @@  // library includes  #include "llsd.h" +// system includes +#include <boost/tokenizer.hpp> +  const std::string SLURL_SL_HELP_PREFIX		= "secondlife://app.";  const std::string SLURL_SL_PREFIX			= "sl://";  const std::string SLURL_SECONDLIFE_PREFIX	= "secondlife://"; @@ -108,9 +111,9 @@ bool LLURLDispatcherImpl::isSLURL(const std::string& url)  // static  bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url) -{  +{  	if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN) -		|| matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN) +		|| matchPrefix(url, SLURL_SECONDLIFE_PREFIX + SLURL_APP_TOKEN)  		|| matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) )  	{  		return true; @@ -125,11 +128,6 @@ bool LLURLDispatcherImpl::dispatchCore(const std::string& url, bool right_mouse)  	if (dispatchHelp(url, right_mouse)) return true;  	if (dispatchApp(url, right_mouse)) return true;  	if (dispatchRegion(url, right_mouse)) return true; -	 -	// Inform the user we can't handle this -	std::map<std::string, std::string> args; -	args["[SLURL]"] = url; -	gViewerWindow->alertXml("BadURL", args);  	return false;  } @@ -164,14 +162,41 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url, BOOL right_mouse)  	{  		return false;  	} +	std::string s = stripProtocol(url); + +	// At this point, "secondlife://app/foo/bar/baz/" should be left +	// as: 	"app/foo/bar/baz/" +	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; +	boost::char_separator<char> sep("/", "", boost::drop_empty_tokens); +	tokenizer tokens(s, sep); +	tokenizer::iterator it = tokens.begin(); +	tokenizer::iterator end = tokens.end(); + +	// Build parameter list suitable for LLDispatcher dispatch +	if (it == end) return false; +	if (*it != "app") return false; +	++it; + +	if (it == end) return false; +	std::string cmd = *it; +	++it; + +	std::vector<std::string> params; +	for ( ; it != end; ++it) +	{ +		params.push_back(*it); +	} + +	bool handled = LLCommandDispatcher::dispatch(cmd, params); +	if (handled) return true; -	LLURI uri(url); -	LLSD pathArray = uri.pathArray(); -	pathArray.erase(0); // erase "app" -	std::string cmd = pathArray.get(0); -	pathArray.erase(0); // erase "cmd" -	bool handled = LLCommandDispatcher::dispatch(cmd, pathArray, uri.queryMap()); -	return handled; +	// Inform the user we can't handle this +	std::map<std::string, std::string> args; +	args["[SLURL]"] = url; +	gViewerWindow->alertXml("BadURL", args); +	// This was a SLURL with a /app prefix, and we "handled" it by displaying an error dialog, +	// so return true.  It doesn't need to be parsed any further. +	return true;  }  // static @@ -184,14 +209,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous  	// Before we're logged in, need to update the startup screen  	// to tell the user where they are going. -	if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) +	if (LLStartUp::getStartupState() < STATE_CLEANUP)  	{  		// Parse it and stash in globals, it will be dispatched in  		// STATE_CLEANUP.  		LLURLSimString::setString(url);  		// We're at the login screen, so make sure user can see  		// the login location box to know where they are going. -		LLPanelLogin::loadLoginPage(); +		LLPanelLogin::refreshLocation( true );  		return true;  	} @@ -287,7 +312,7 @@ class LLTeleportHandler : public LLCommandHandler  {  public:  	LLTeleportHandler() : LLCommandHandler("teleport") { } -	bool handle(const LLSD& tokens, const LLSD& queryMap) +	bool handle(const std::vector<std::string>& tokens)  	{  		// construct a "normal" SLURL, resolve the region to  		// a global position, and teleport to it @@ -298,9 +323,9 @@ public:  		// build secondlife://De%20Haro/123/45/67 for use in callback  		std::string url = SLURL_SECONDLIFE_PREFIX; -		for (int i = 0; i < tokens.size(); ++i) +		for (size_t i = 0; i < tokens.size(); ++i)  		{ -			url += tokens[i].asString() + "/"; +			url += tokens[i] + "/";  		}  		gWorldMap->sendNamedRegionRequest(region_name,  			LLURLDispatcherImpl::regionHandleCallback, diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 688b2889c8..be595e616c 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -235,7 +235,6 @@ extern BOOL gAllowSelectAvatar;  LLMenuBarGL		*gMenuBarView = NULL;  LLViewerMenuHolderGL	*gMenuHolder = NULL;  LLMenuGL		*gPopupMenuView = NULL; -LLMenuBarGL		*gLoginMenuBarView = NULL;  // Pie menus  LLPieMenu	*gPieSelf	= NULL; @@ -751,15 +750,6 @@ void init_menus()  	// Debug menu visiblity  	//  	show_debug_menus(); - -	gLoginMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_login.xml", gMenuHolder); -	LLRect menuBarRect = gLoginMenuBarView->getRect(); -	gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft,  menuBarRect.mBottom)); - -	gLoginMenuBarView->setBackgroundColor( color ); - -	gMenuHolder->addChild(gLoginMenuBarView); -	  }  void init_landmark_menu(LLMenuGL* menu) diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 6814c31eb8..55fab86089 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -141,7 +141,6 @@ extern LLMenuBarGL*		gMenuBarView;  //extern LLView*			gMenuBarHolder;  extern LLMenuGL*		gPopupMenuView;  extern LLViewerMenuHolderGL*	gMenuHolder; -extern LLMenuBarGL*		gLoginMenuBarView;  // Pie menus  extern LLPieMenu	*gPieSelf; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bc41a88e27..74788f6f26 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -31,7 +31,6 @@  #include "llviewerprecompiledheaders.h" -#include "llpanellogin.h"  #include "llviewerwindow.h"  // system library includes @@ -106,7 +105,6 @@  #include "llfloatermap.h"  #include "llfloatermute.h"  #include "llfloaternamedesc.h" -#include "llfloaterpreference.h"  #include "llfloatersnapshot.h"  #include "llfloatertools.h"  #include "llfloaterworldmap.h" @@ -2844,7 +2842,7 @@ BOOL LLViewerWindow::handlePerFrameHover()  	// *NOTE: sometimes tools handle the mouse as a captor, so this  	// logic is a little confusing  	LLTool *tool = NULL; -	if (gToolMgr && gHoverView && gCamera) +	if (gToolMgr && gHoverView)  	{  		tool = gToolMgr->getCurrentTool(); @@ -2917,8 +2915,8 @@ BOOL LLViewerWindow::handlePerFrameHover()  			mToolTip->setVisible( TRUE );  		}  	}		 -	 -	if (tool && tool != gToolNull  && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime")) + +	if (tool != gToolNull  && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime"))  	{   		LLMouseHandler *captor = gFocusMgr.getMouseCapture();  		// With the null, inspect, or drag and drop tool, don't muck diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7bb12f7853..39d8c2e640 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -450,8 +450,6 @@ class LinuxManifest(ViewerManifest):                  if self.prefix("linux_tools", ""):                          self.path("client-readme.txt","README-linux.txt")                          self.path("wrapper.sh","secondlife") -                        self.path("handle_secondlifeprotocol.sh") -                        self.path("register_secondlifeprotocol.sh")                          self.path("unicode.ttf","unicode.ttf")                          self.end_prefix("linux_tools")  | 
