diff options
| -rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/linux_tools/client-readme-voice.txt | 51 | ||||
| -rw-r--r-- | indra/newview/linux_tools/client-readme.txt | 5 | ||||
| -rw-r--r-- | indra/newview/llavataractions.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.cpp | 58 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.h | 2 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 115 | ||||
| -rw-r--r-- | indra/newview/llimview.h | 22 | ||||
| -rw-r--r-- | indra/newview/llnavigationbar.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llpanelpicks.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llpanelpicks.h | 5 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_aaa.xml | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_im_session.xml | 12 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_picks.xml | 7 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/strings.xml | 8 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 6 | ||||
| -rw-r--r-- | install.xml | 4 | 
18 files changed, 213 insertions, 142 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3ecc35cc8e..8953682fae 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1436,6 +1436,7 @@ if (WINDOWS)        ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll @@ -1449,6 +1450,7 @@ if (WINDOWS)        ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll +      ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll        ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt index 23a42f484b..bfefdf3471 100644 --- a/indra/newview/linux_tools/client-readme-voice.txt +++ b/indra/newview/linux_tools/client-readme-voice.txt @@ -4,36 +4,31 @@ Second Life - Linux Voice Support README  WHAT IS IT?  -=-=-=-=-=- -Linux Voice Support is a new feature in testing which allows users -of the Linux Second Life client to participate in voice-chat with other -residents and groups inside Second Life, with an appropriate -headset/microphone. - -Linux Voice Support is currently EXPERIMENTAL and is known to still -have some compatibility issues. +Linux Voice Support is a feature in testing which allows users of the Linux +Second Life client to participate in voice-chat with other residents and +groups inside Second Life, with an appropriate headset/microphone.  REQUIREMENTS  -=-=-=-=-=-=  * A headset/microphone supported by your chosen version of Linux -* The ALSA sound system (you probably already have this - -  i.e. the alsa-base and alsa-utils packages on Ubuntu) +* At this time, the PulseAudio audio system is recommended; this software +  is already part of most modern (2009+) Linux desktop systems.  Alternatively, +  the ALSA audio system may be used on systems installed from around +  2007 onwards (again this is likely already installed on your system). + +TESTING YOUR SETTINGS +-=-=-=-=-=-=-=-=-=-=- -Success with Linux Voice support has been reported on the following -systems: -* Ubuntu 6.06 (Dapper) with Intel ICH5/CMI9761A+ audio chipset -* Ubuntu 6.06 (Dapper) with SigmaTel STAC2997 audio chipset -* Ubuntu 6.06 (Dapper) with Creative EMU10K1 audio chipset -* Ubuntu 7.04 (Feisty) with USB Plantronics headset -* Ubuntu 7.04 (Feisty) with Intel HDA audio chipset -* Fedora Core 6 with (unknown) audio chipset -* Ubuntu 8.04 (Hardy) with (unknown) audio chipset +* The Second Life region 'Voice Echo Canyon' is a great place for testing +your hardware settings and quality - it will 'echo' your voice back to you +when you speak.  KNOWN PROBLEMS  -=-=-=-=-=-=-= -* The 'Input Level' meter in the Voice Chat Device Settings dialog -  does not respond to audio input. +* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper +  from 2006) is poor.  TROUBLESHOOTING  -=-=-=-=-=-=-=- @@ -41,12 +36,11 @@ TROUBLESHOOTING  PROBLEM 1: I don't see a white dot over the head of my avatar or other    Voice-using avatars.  SOLUTION: -a. Ensure that 'Enable voice chat' is enabled in the Voice Chat -  preferences window and that you are in a voice-enabled area (you -  will see a blue headphone icon in the SL menu-bar). +a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the +  Preferences window, and that you are in a voice-enabled area.  b. If the above does not help, exit Second Life and ensure that any    remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar) -  are killed. +  are killed before restarting.  PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone    except myself listed in the Active Speakers dialog when I'm sure that other @@ -65,12 +59,13 @@ c. Update to the latest version of ALSA manually.  For a guide, see the  PROBLEM 3: I can hear other people, but they cannot hear me.  SOLUTION: -a. Ensure that you have the 'Talk' button activated while you are trying to -  speak. +a. Ensure that you have the 'Speak' button (at the bottom of the Second Life +   window) activated while you are trying to speak.  b. Ensure that your microphone jack is inserted into the correct socket of your    sound card, where appropriate. -c. Use your system mixer-setting program or the 'alsamixer' program to ensure -  that microphone input is set as the active input source and is not muted. +c. Use your system mixer-setting program (such as the PulseAudio 'volume +  control' applet or the ALSA 'alsamixer' program) to ensure that microphone +  input is set as the active input source and is not muted.  d. Verify that audio input works in other applications, i.e. Audacity  PROBLEM 4: Other people just hear bursts of loud noise when I speak. diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index 07a8f951ee..92d321d8c0 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -55,10 +55,13 @@ Minimum requirements:            is required.  If you are running a 64-bit Linux distribution then            you will need its 32-bit compatibility environment installed, but            this configuration is not currently supported. +    * PulseAudio or ALSA Linux system sound software.  A recent PulseAudio +      is the recommended configuration; see README-linux-voice.txt for more +      information.      * Video/Graphics Card:            o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the              following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600, -            8800, Go 7400, Go 7600, Go 7800, Go 7900) +            8800, Go 7400, Go 7600, Go 7800, Go 7900, +)            o OR ATI Radeon 8500, 9250, or better            (nVidia cards are recommended for the Linux client) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 33dc7ee2c8..636b1de4d4 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -211,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id)  	std::string name;  	gCacheName->getFullName(id, name); -	LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); +	LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);  	if (session_id != LLUUID::null)  	{ -		// always open IM window when connecting to voice -		LLIMFloater::show(session_id);  		gIMMgr->startCall(session_id);  	}  	make_ui_sound("UISndStartIM"); @@ -239,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)  	// create the new ad hoc voice session  	const std::string title = LLTrans::getString("conference-title");  	LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START, -										   ids[0], id_array); +										   ids[0], id_array, true);  	if (session_id == LLUUID::null)  	{  		return;  	} -	// always open IM window when connecting to voice -	LLIMFloater::show(session_id); -  	// start the call once the session has fully initialized  	gIMMgr->autoStartCallOnStartup(session_id); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 8c793873f4..8389895479 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -78,6 +78,9 @@ LLBottomTray::LLBottomTray(const LLSD&)  	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));  	LLIMMgr::getInstance()->addSessionObserver(this); +	//managing chiclets for voice calls +	LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1)); +  	//this is to fix a crash that occurs because LLBottomTray is a singleton  	//and thus is deleted at the end of the viewers lifetime, but to be cleanly  	//destroyed LLBottomTray requires some subsystems that are long gone @@ -143,25 +146,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)  //virtual  void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)  { -	if(getChicletPanel()) -	{ -		if(getChicletPanel()->findChiclet<LLChiclet>(session_id)) -		{ +	if (!getChicletPanel()) return; -		} -		else -		{ -			LLIMChiclet* chiclet = createIMChiclet(session_id); -			if(chiclet) -			{ -				chiclet->setIMSessionName(name); -				chiclet->setOtherParticipantId(other_participant_id); -			} -			else -			{ -				llerrs << "Could not create chiclet" << llendl; -			} -		} +	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + +	// For im sessions started as voice call chiclet gets created on the first incoming message +	if (gIMMgr->isVoiceCall(session_id)) return; + +	LLIMChiclet* chiclet = createIMChiclet(session_id); +	if(chiclet) +	{ +		chiclet->setIMSessionName(name); +		chiclet->setOtherParticipantId(other_participant_id); +	} +	else +	{ +		llerrs << "Could not create chiclet" << llendl;  	}  } @@ -194,6 +194,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&  	}  } +void LLBottomTray::onNewIM(const LLSD& data) +{ +	LLUUID from_id = data["from_id"]; +	if (from_id.isNull() || gAgentID == from_id) return; + +	LLUUID session_id = data["session_id"]; +	if (session_id.isNull()) return; + +	if (!gIMMgr->isVoiceCall(session_id)) return; + +	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + +	//first real message, time to create chiclet +	LLIMChiclet* chiclet = createIMChiclet(session_id); +	if(chiclet) +	{ +		chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id)); +		chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id)); +	} +} + +  // virtual  void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)  { diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index fa204ee9ea..1adea24ee4 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -75,6 +75,8 @@ public:  	virtual void sessionRemoved(const LLUUID& session_id);  	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); +	void onNewIM(const LLSD& data); +  	virtual void reshape(S32 width, S32 height, BOOL called_from_parent);  	virtual void onFocusLost(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index b50d4674f7..1d56fc0cab 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -153,7 +153,7 @@ LLIMModel::LLIMModel()  	addNewMsgCallback(toast_callback);  } -LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids) +LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)  :	mSessionID(session_id),  	mName(name),  	mType(type), @@ -167,7 +167,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	mCallBackEnabled(true),  	mTextIMPossible(true),  	mOtherParticipantIsAvatar(true), -	mStartCallOnInitialize(false) +	mStartCallOnInitialize(false), +	mStartedAsIMCall(voice)  {  	// set P2P type by default  	mSessionType = P2P_SESSION; @@ -236,24 +237,25 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)  { -	// *TODO: remove hardcoded string!!!!!!!!!!! -  	bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);  	std::string other_avatar_name;  	if(is_p2p_session)  	{  		gCacheName->getFullName(mOtherParticipantID, other_avatar_name); +		std::string you = LLTrans::getString("You"); +		std::string started_call = LLTrans::getString("started_call"); +		std::string joined_call = LLTrans::getString("joined_call");  		if(direction == LLVoiceChannel::INCOMING_CALL)  		{  			switch(new_state)  			{  			case LLVoiceChannel::STATE_CALL_STARTED : -				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call"); +				LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call);  				break;  			case LLVoiceChannel::STATE_CONNECTED : -				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call"); +				LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call);  			default:  				break;  			} @@ -263,10 +265,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  			switch(new_state)  			{  			case LLVoiceChannel::STATE_CALL_STARTED : -				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call"); +				LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call);  				break;  			case LLVoiceChannel::STATE_CONNECTED : -				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call"); +				LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, joined_call);  			default:  				break;  			} @@ -452,7 +454,7 @@ void LLIMModel::testMessages()  //session name should not be empty  bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,  -						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids) +						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)  {  	if (name.empty())  	{ @@ -466,7 +468,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co  		return false;  	} -	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids); +	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);  	mId2SessionMap[session_id] = session;  	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id); @@ -475,6 +477,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co  } +bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice) +{ +	std::vector<LLUUID> no_ids; +	return newSession(session_id, name, type, other_participant_id, no_ids, voice); +} +  bool LLIMModel::clearSession(const LLUUID& session_id)  {  	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false; @@ -574,12 +582,33 @@ bool LLIMModel::proccessOnlineOfflineNotification(  bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,   						   const std::string& utf8_text, bool log2file /* = true */) {  + +	LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file); +	if (!session) return false; + +	// notify listeners +	LLSD arg; +	arg["session_id"] = session_id; +	arg["num_unread"] = session->mNumUnread; +	arg["participant_unread"] = session->mParticipantUnreadMessageCount; +	arg["message"] = utf8_text; +	arg["from"] = from; +	arg["from_id"] = from_id; +	arg["time"] = LLLogChat::timestamp(false); +	mNewMsgSignal(arg); + +	return true; +} + +LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  +													 const std::string& utf8_text, bool log2file /* = true */) +{  	LLIMSession* session = findIMSession(session_id);  	if (!session)  	{  		llwarns << "session " << session_id << "does not exist " << llendl; -		return false; +		return NULL;  	}  	addToHistory(session_id, from, from_id, utf8_text); @@ -593,19 +622,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co  		++(session->mParticipantUnreadMessageCount);  	} - -	// notify listeners -	LLSD arg; -	arg["session_id"] = session_id; -	arg["num_unread"] = session->mNumUnread; -	arg["participant_unread"] = session->mParticipantUnreadMessageCount; -	arg["message"] = utf8_text; -	arg["from"] = from; -	arg["from_id"] = from_id; -	arg["time"] = LLLogChat::timestamp(false); -	mNewMsgSignal(arg); - -	return true; +	return session;  } @@ -1056,8 +1073,8 @@ public:  				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)  				&& LLIMModel::getInstance()->findIMSession(mSessionID))  			{ -				// always open IM window when connecting to voice -				LLIMFloater::show(mSessionID); +				// TODO remove in 2010, for voice calls we do not open an IM window +				//LLIMFloater::show(mSessionID);  			}  			gIMMgr->clearPendingAgentListUpdates(mSessionID); @@ -1582,11 +1599,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)  			if (voice)  			{ -				if (gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL)) -				{ -					// always open IM window when connecting to voice -					LLIMFloater::show(session_id); -				} +				gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);  			}  			gIMMgr->clearPendingAgentListUpdates(session_id); @@ -1625,11 +1638,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)  				}  			} -			LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id); -			if (new_session_id != LLUUID::null) -			{ -				LLIMFloater::show(new_session_id); -			} +			LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);  			std::string url = gAgent.getRegion()->getCapability(  				"ChatSessionRequest"); @@ -1705,11 +1714,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)  					payload["session_handle"].asString(),  					payload["session_uri"].asString()); -				if (gIMMgr->startCall(session_id)) -				{ -					// always open IM window when connecting to voice -					LLIMFloater::show(session_id); -				} +				gIMMgr->startCall(session_id);  				gIMMgr->clearPendingAgentListUpdates(session_id);  				gIMMgr->clearPendingInvitation(session_id); @@ -1719,11 +1724,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)  				LLUUID new_session_id = gIMMgr->addSession(  					payload["session_name"].asString(),  					type, -					session_id); -				if (new_session_id != LLUUID::null) -				{ -					LLIMFloater::show(new_session_id); -				} +					session_id, true);  				std::string url = gAgent.getRegion()->getCapability(  					"ChatSessionRequest"); @@ -2018,11 +2019,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,  							const std::string& voice_session_handle,  							const std::string& caller_uri)  { -	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id); -	if (session_id != LLUUID::null) -	{ -		LLIMFloater::show(session_id); -	} +	LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);  	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);  	if (speaker_mgr) @@ -2043,11 +2040,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,  LLUUID LLIMMgr::addSession(  	const std::string& name,  	EInstantMessage dialog, -	const LLUUID& other_participant_id) +	const LLUUID& other_participant_id, bool voice)  {  	LLDynamicArray<LLUUID> ids;  	ids.put(other_participant_id); -	return addSession(name, dialog, other_participant_id, ids); +	return addSession(name, dialog, other_participant_id, ids, voice);  }  // Adds a session using the given session_id.  If the session already exists  @@ -2056,7 +2053,7 @@ LLUUID LLIMMgr::addSession(  	const std::string& name,  	EInstantMessage dialog,  	const LLUUID& other_participant_id, -	const LLDynamicArray<LLUUID>& ids) +	const LLDynamicArray<LLUUID>& ids, bool voice)  {  	if (0 == ids.getLength())  	{ @@ -2075,7 +2072,7 @@ LLUUID LLIMMgr::addSession(  	if (new_session)  	{ -		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids); +		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);  	} @@ -2454,6 +2451,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id)  	return true;  } +bool LLIMMgr::isVoiceCall(const LLUUID& session_id) +{ +	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); +	if (!im_session) return false; + +	return im_session->mStartedAsIMCall; +} +  // create a floater and update internal representation for  // consistency. Returns the pointer, caller (the class instance since  // it is a private method) is not responsible for deleting the diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index e2fcd63e28..6eb3f3d07f 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -65,7 +65,7 @@ public:  		} SType;  		LLIMSession(const LLUUID& session_id, const std::string& name,  -			const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids); +			const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);  		virtual ~LLIMSession();  		void sessionInitReplyReceived(const LLUUID& new_session_id); @@ -104,6 +104,9 @@ public:  		bool mTextIMPossible;  		bool mOtherParticipantIsAvatar;  		bool mStartCallOnInitialize; + +		//if IM session is created for a voice call +		bool mStartedAsIMCall;  	}; @@ -143,7 +146,10 @@ public:  	 * @param name session name should not be empty, will return false if empty  	 */  	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,  -		const std::vector<LLUUID>& ids = std::vector<LLUUID>()); +		const std::vector<LLUUID>& ids, bool voice = false); + +	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, +		const LLUUID& other_participant_id, bool voice = false);  	/**  	 * Remove all session data associated with a session specified by session_id @@ -163,6 +169,12 @@ public:  	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);  	/** +	 * Similar to addMessage(...) above but won't send a signal about a new message added +	 */ +	LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,  +		const std::string& utf8_text, bool log2file = true); + +	/**  	 * Add a system message to an IM Model  	 */  	bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); @@ -284,14 +296,14 @@ public:  	// session.  	LLUUID addSession(const std::string& name,  					  EInstantMessage dialog, -					  const LLUUID& other_participant_id); +					  const LLUUID& other_participant_id, bool voice = false);  	// Adds a session using a specific group of starting agents  	// the dialog type is assumed correct. Returns the uuid of the session.  	LLUUID addSession(const std::string& name,  					  EInstantMessage dialog,  					  const LLUUID& other_participant_id, -					  const LLDynamicArray<LLUUID>& ids); +					  const LLDynamicArray<LLUUID>& ids, bool voice = false);  	/**  	 * Creates a P2P session with the requisite handle for responding to voice calls. @@ -391,6 +403,8 @@ public:  	 **/  	bool endCall(const LLUUID& session_id); +	bool isVoiceCall(const LLUUID& session_id); +  private:  	/** diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index cdab3b2310..6210151d1b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -261,9 +261,14 @@ BOOL LLNavigationBar::postBuild()  void LLNavigationBar::setVisible(BOOL visible)  {  	// change visibility of grandparent layout_panel to animate in and out -	if (getParent() && getParent()->getParent())  +	if (getParent())   	{ -		getParent()->getParent()->setVisible(visible);	 +		//to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping  about a problem.  +		if(getParent()->getName() != "nav_bar_container") +		{ +			LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL; +		} +		getParent()->setVisible(visible);	  	}  } diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 0a13180c73..4d22d96072 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -45,6 +45,7 @@  #include "llnotificationsutil.h"  #include "lltexturectrl.h"  #include "lltoggleablemenu.h" +#include "lltrans.h"  #include "llviewergenericmessage.h"	// send_generic_message  #include "llmenugl.h"  #include "llviewermenu.h" @@ -216,7 +217,9 @@ LLPanelPicks::LLPanelPicks()  	mClassifiedsAccTab(NULL),  	mPanelClassifiedInfo(NULL),  	mPanelClassifiedEdit(NULL), -	mClickThroughDisp(NULL) +	mClickThroughDisp(NULL), +	mNoClassifieds(false), +	mNoPicks(false)  {  	mClickThroughDisp = new LLClassifiedClickThrough();  	gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp); @@ -242,6 +245,11 @@ void LLPanelPicks::updateData()  	// Send Picks request only when we need to, not on every onOpen(during tab switch).  	if(isDirty())  	{ +		mNoPicks = false; +		mNoClassifieds = false; + +		childSetValue("picks_panel_text", LLTrans::getString("PicksClassifiedsLoadingText")); +  		mPicksList->clear();  		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId()); @@ -302,6 +310,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  			resetDirty();  			updateButtons();  		} +		 +		mNoPicks = !mPicksList->size();  	}  	else if(APT_CLASSIFIEDS == type)  	{ @@ -335,9 +345,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)  			resetDirty();  			updateButtons();  		} +		 +		mNoClassifieds = !mClassifiedsList->size(); +	} + +	if (mNoPicks && mNoClassifieds) +	{ +		childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));  	} -	if(!mPicksList->size() && !mClassifiedsList->size()) -		childSetVisible("empty_picks_panel_text", true);  }  LLPickItem* LLPanelPicks::getSelectedPickItem() diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 0ebf9e26dd..fd8a9e6938 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -157,6 +157,11 @@ private:  	LLAccordionCtrlTab* mClassifiedsAccTab;  	LLClassifiedClickThrough* mClickThroughDisp; +	 +	//true if picks list is empty after processing picks +	bool mNoPicks; +	//true if classifieds list is empty after processing classifieds +	bool mNoClassifieds;  };  class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index ea49f9c32e..f49e7ef0da 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -709,15 +709,15 @@ BOOL LLIMWellWindow::postBuild()  void LLIMWellWindow::sessionAdded(const LLUUID& session_id,  								   const std::string& name, const LLUUID& other_participant_id)  { -	if (mMessageList->getItemByValue(session_id) == NULL) -	{ -		S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id); -		if (chicletCounter > -1) -		{ -			addIMRow(session_id, chicletCounter, name, other_participant_id);	 -			reshapeWindow(); -		} -	} +	if (!mMessageList->getItemByValue(session_id)) return; +	 +	// For im sessions started as voice call chiclet gets created on the first incoming message +	if (gIMMgr->isVoiceCall(session_id)) return; + +	if (!gIMMgr->hasSession(session_id)) return; + +	addIMRow(session_id, 0, name, other_participant_id);	 +	reshapeWindow();  }  //virtual diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index f89ad2f997..6956b73371 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -18,6 +18,7 @@   single_instance="true"   width="320">    <string name="nudge_parabuild">Nudge 1</string> +  <string name="test_the_vlt">This string is extracted.</string>    <chat_history     allow_html="true"     bg_readonly_color="ChatHistoryBgColor" diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 645c2973d8..a4ade9d0df 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,14 +12,14 @@   can_dock="false"   can_minimize="false"   visible="true" - width="300" + width="360"   can_resize="true" - min_width="300" + min_width="360"   min_height="350">    <layout_stack    follows="all"    height="320" -  width="300" +  width="360"    layout="topleft"    orientation="horizontal"    name="im_panels" @@ -36,7 +36,7 @@         left="0"         top="0"         height="200" -	     width="185" +	     width="245"         user_resize="false">          <button            height="20" @@ -63,7 +63,7 @@           parse_highlights="true"           allow_html="true"          left="1" -         width="180"> +         width="240">          </chat_history>          <line_editor           bottom="0"  @@ -73,7 +73,7 @@           label="To"           layout="bottomleft"           name="chat_editor" -         width="180"> +         width="240">          </line_editor>      </layout_panel>    </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 4facedc7ea..2230229b14 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -20,12 +20,9 @@    height="535"    layout="topleft"    left="6" -  name="empty_picks_panel_text" +  name="picks_panel_text"    top="10" -  visible="false"  -  width="313"> -   There are no picks/classifieds here - </text> +  width="313"/>   <accordion    fit_parent="true"     follows="all" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 2f50c5ee6c..ec4723bd55 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2074,6 +2074,10 @@ this texture in your inventory  	<!-- panel classified -->  	<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>  	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string> +   +  <!-- panel picks --> +  <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string> +  <string name="PicksClassifiedsLoadingText">Loading...</string>  	<!-- Multi Preview Floater -->  	<string name="MultiPreviewTitle">Preview</string> @@ -2842,6 +2846,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	<string name="IM_to_label">To</string>  	<string name="IM_moderator_label">(Moderator)</string> +	<!-- voice calls --> +	<string name="started_call">Started a voice call</string> +	<string name="joined_call">Joined the voice call</string> +    <string name="ringing-im">      Joining Voice Chat...    </string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index db2100b6bb..d69a771bbb 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -341,10 +341,11 @@ class WindowsManifest(ViewerManifest):                  self.path("qtnetworkd4.dll")                  self.path("qtopengld4.dll")                  self.path("qtwebkitd4.dll") +                self.path("qtxmlpatternsd4.dll")                  self.path("ssleay32.dll")                  # For WebKit/Qt plugin runtimes (image format plugins) -                if self.prefix(src="imageformats", dst="llplugin/imageformats"):                 +                if self.prefix(src="imageformats", dst="llplugin/imageformats"):                      self.path("qgifd4.dll")                      self.path("qicod4.dll")                      self.path("qjpegd4.dll") @@ -866,6 +867,7 @@ class Linux_i686Manifest(LinuxManifest):              self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")              self.path("libalut.so")              self.path("libopenal.so", "libopenal.so.1") +            self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname              try:                      self.path("libkdu_v42R.so", "libkdu.so")                      pass @@ -887,7 +889,7 @@ class Linux_i686Manifest(LinuxManifest):              if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):                      self.path("libortp.so")                      self.path("libsndfile.so.1") -                    self.path("libvivoxoal.so.1") +                    #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OAL lib                      self.path("libvivoxsdk.so")                      self.path("libvivoxplatform.so")                      self.end_prefix("lib") diff --git a/install.xml b/install.xml index 2e317755da..fafbe816ba 100644 --- a/install.xml +++ b/install.xml @@ -1159,9 +1159,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>linux</key>            <map>              <key>md5sum</key> -            <string>f0d9a8d1318b519cffe6c40c9cac4e21</string> +            <string>c8223e9454223e3d519fe40d71c3ddd2</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20081010c-59a71b14-plughw.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-linux-20091216-56cc0386.tar.bz2</uri>            </map>            <key>linux64</key>            <map> | 
