summaryrefslogtreecommitdiff
path: root/indra/newview/llimfloater.cpp
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2012-07-03 18:12:48 -0700
committerMerov Linden <merov@lindenlab.com>2012-07-03 18:12:48 -0700
commitc63be504e48cfbfd45689694f69c79da008c4c1f (patch)
tree7493f3480d17808fa5704839308cfea6ecee904c /indra/newview/llimfloater.cpp
parent52bf9e20454181d8acb0ac419a882cc1a0e3af9e (diff)
parentac0243a006fa28e872e4ee88f7c1588eaefeaecf (diff)
Pull merge from richard/viewer-chui
Diffstat (limited to 'indra/newview/llimfloater.cpp')
-rw-r--r--indra/newview/llimfloater.cpp137
1 files changed, 82 insertions, 55 deletions
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 9d3c0f98ce..a506f0f9f3 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -322,7 +322,7 @@ BOOL LLIMFloater::postBuild()
void LLIMFloater::onAddButtonClicked()
{
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::onAvatarPicked, this, _1, _2), TRUE, TRUE);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::addSessionParticipants, this, _1), TRUE, TRUE);
if (!picker)
{
return;
@@ -337,55 +337,94 @@ void LLIMFloater::onAddButtonClicked()
}
}
-void LLIMFloater::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
+bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
{
- if (mIsP2PChat)
- {
- mStartConferenceInSameFloater = true;
- onClose(false);
+ if (!mSession
+ || mDialog == IM_SESSION_GROUP_START
+ || mDialog == IM_SESSION_INVITE && gAgent.isInGroup(mSessionID))
+ {
+ return false;
+ }
- uuid_vec_t temp_ids;
- temp_ids.push_back(mOtherParticipantUUID);
- temp_ids.insert(temp_ids.end(), ids.begin(), ids.end());
+ if (mIsP2PChat)
+ {
+ // For a P2P session just check if we are not adding the other participant.
- LLAvatarActions::startConference(temp_ids, mSessionID);
- }
- else
- {
- inviteToSession(ids);
- }
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ if (*id == mOtherParticipantUUID)
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ // For a conference session we need to check against the list from LLSpeakerMgr,
+ // because this list may change when participants join or leave the session.
+
+ LLSpeakerMgr::speaker_list_t speaker_list;
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->getSpeakerList(&speaker_list, true);
+ }
+
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ for (LLSpeakerMgr::speaker_list_t::const_iterator it = speaker_list.begin();
+ it != speaker_list.end(); ++it)
+ {
+ const LLPointer<LLSpeaker>& speaker = *it;
+ if (*id == speaker->mID)
+ {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
}
-bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
+void LLIMFloater::addSessionParticipants(const uuid_vec_t& uuids)
{
- if (!mSession
- || mDialog == IM_SESSION_GROUP_START
- || mDialog == IM_SESSION_INVITE && gAgent.isInGroup(mSessionID))
- {
- return false;
- }
+ if (mIsP2PChat)
+ {
+ mStartConferenceInSameFloater = true;
- for (uuid_vec_t::const_iterator id = uuids.begin();
- id != uuids.end(); ++id)
- {
- // Skip this check for ad hoc conferences,
- // conference participants should be listed in mSession->mInitialTargetIDs.
- if (mIsP2PChat && *id == mOtherParticipantUUID)
- {
- return false;
- }
-
- for (uuid_vec_t::const_iterator target_id = mSession->mInitialTargetIDs.begin();
- target_id != mSession->mInitialTargetIDs.end(); ++target_id)
- {
- if (*id == *target_id)
- {
- return false;
- }
- }
- }
+ uuid_vec_t temp_ids;
+
+ // Add the initial participant of a P2P session
+ temp_ids.push_back(mOtherParticipantUUID);
+ temp_ids.insert(temp_ids.end(), uuids.begin(), uuids.end());
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ // first check whether this is a voice session
+ bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
- return true;
+ // then we can close the current session
+ gIMMgr->leaveSession(mSessionID);
+ LLIMConversation::onClose(false);
+
+ // Start a new ad hoc voice call if we invite new participants to a P2P call,
+ // or start a text chat otherwise.
+ if (is_voice_call)
+ {
+ LLAvatarActions::startAdhocCall(temp_ids, mSessionID);
+ }
+ else
+ {
+ LLAvatarActions::startConference(temp_ids, mSessionID);
+ }
+ }
+ else
+ {
+ inviteToSession(uuids);
+ }
}
void LLIMFloater::boundVoiceChannel()
@@ -1096,19 +1135,7 @@ bool LLIMFloater::dropPerson(LLUUID* person_id, bool drop)
res = canAddSelectedToChat(ids);
if(res && drop)
{
- if (mIsP2PChat)
- {
- mStartConferenceInSameFloater = true;
- onClose(false);
-
- ids.push_back(mOtherParticipantUUID);
-
- LLAvatarActions::startConference(ids, mSessionID);
- }
- else
- {
- inviteToSession(ids);
- }
+ addSessionParticipants(ids);
}
}