Merge branch 'DRTVWR-544-maint' of https://bitbucket.org/lindenlab/viewer
commit
f46a15b3f3
|
|
@ -3252,9 +3252,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6ce3cbaed968a69fb7a2cca80220874d</string>
|
||||
<string>1d4929e624f848ea7c3a1795306803ac</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/92887/837906/slvoice-4.10.0000.32327.5fc3fe7c.567273-darwin64-567273.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3276,9 +3276,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2eb38c5eff4d0f18fbb89d0c30c4f0a4</string>
|
||||
<string>70b4c2cab3224d832d1bf04eecfc044a</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/92890/837929/slvoice-4.10.0000.32327.5fc3fe7c.567273-windows-567273.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3288,16 +3288,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9ee8f3cbc5369c598a998c61961ed16d</string>
|
||||
<string>798290b0986b86913a5914946d8b24af</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/92889/837928/slvoice-4.10.0000.32327.5fc3fe7c.567273-windows64-567273.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>4.10.0000.32327.5fc3fe7c.558436</string>
|
||||
<string>4.10.0000.32327.5fc3fe7c.567273</string>
|
||||
</map>
|
||||
<key>threejs</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -854,7 +854,8 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
|
|||
addAudioSource(asp);
|
||||
if (pos_global.isExactlyZero())
|
||||
{
|
||||
asp->setAmbient(true);
|
||||
// For sound preview and UI
|
||||
asp->setForcedPriority(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1321,7 +1322,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32
|
|||
mPriority(0.f),
|
||||
mGain(gain),
|
||||
mSourceMuted(false),
|
||||
mAmbient(false),
|
||||
mForcedPriority(false),
|
||||
mLoop(false),
|
||||
mSyncMaster(false),
|
||||
mSyncSlave(false),
|
||||
|
|
@ -1470,7 +1471,7 @@ void LLAudioSource::update()
|
|||
|
||||
void LLAudioSource::updatePriority()
|
||||
{
|
||||
if (isAmbient())
|
||||
if (isForcedPriority())
|
||||
{
|
||||
mPriority = 1.f;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -310,8 +310,8 @@ public:
|
|||
|
||||
void addAudioData(LLAudioData *adp, bool set_current = TRUE);
|
||||
|
||||
void setAmbient(const bool ambient) { mAmbient = ambient; }
|
||||
bool isAmbient() const { return mAmbient; }
|
||||
void setForcedPriority(const bool ambient) { mForcedPriority = ambient; }
|
||||
bool isForcedPriority() const { return mForcedPriority; }
|
||||
|
||||
void setLoop(const bool loop) { mLoop = loop; }
|
||||
bool isLoop() const { return mLoop; }
|
||||
|
|
@ -373,7 +373,7 @@ protected:
|
|||
F32 mPriority;
|
||||
F32 mGain;
|
||||
bool mSourceMuted;
|
||||
bool mAmbient;
|
||||
bool mForcedPriority; // ignore mute, set high priority, researved for sound preview and UI
|
||||
bool mLoop;
|
||||
bool mSyncMaster;
|
||||
bool mSyncSlave;
|
||||
|
|
|
|||
|
|
@ -662,9 +662,9 @@ void LLAudioChannelFMODSTUDIO::update3DPosition()
|
|||
return;
|
||||
}
|
||||
|
||||
if (mCurrentSourcep->isAmbient())
|
||||
if (mCurrentSourcep->isForcedPriority())
|
||||
{
|
||||
// Ambient sound, don't need to do any positional updates.
|
||||
// Prioritized UI and preview sounds don't need to do any positional updates.
|
||||
set3DMode(false);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ void LLAudioChannelOpenAL::update3DPosition()
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (mCurrentSourcep->isAmbient())
|
||||
if (mCurrentSourcep->isForcedPriority())
|
||||
{
|
||||
alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);
|
||||
alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0);
|
||||
|
|
|
|||
|
|
@ -234,6 +234,8 @@ void LLParcel::init(const LLUUID &owner_id,
|
|||
|
||||
setRegionAllowEnvironmentOverride(FALSE);
|
||||
setParcelEnvironmentVersion(INVALID_PARCEL_ENVIRONMENT_VERSION);
|
||||
|
||||
setObscureMOAP(false);
|
||||
}
|
||||
|
||||
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
|
||||
|
|
@ -540,6 +542,7 @@ void LLParcel::packMessage(LLSD& msg)
|
|||
msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
|
||||
msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
|
||||
msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
|
||||
msg["obscure_moap"] = (LLSD::Boolean) getObscureMOAP();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ public:
|
|||
void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
|
||||
void setAllowGroupAVSounds(BOOL b) { mAllowGroupAVSounds = b; }
|
||||
void setAllowAnyAVSounds(BOOL b) { mAllowAnyAVSounds = b; }
|
||||
void setObscureMOAP(bool b) { mObscureMOAP = b; }
|
||||
|
||||
void setDrawDistance(F32 dist) { mDrawDistance = dist; }
|
||||
void setSalePrice(S32 price) { mSalePrice = price; }
|
||||
|
|
@ -517,6 +518,8 @@ public:
|
|||
|
||||
BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
|
||||
BOOL getAllowAnyAVSounds() const { return mAllowAnyAVSounds; }
|
||||
|
||||
bool getObscureMOAP() const { return mObscureMOAP; }
|
||||
|
||||
F32 getDrawDistance() const { return mDrawDistance; }
|
||||
S32 getSalePrice() const { return mSalePrice; }
|
||||
|
|
@ -670,6 +673,7 @@ protected:
|
|||
BOOL mRegionAllowEnvironmentOverride;
|
||||
BOOL mAllowGroupAVSounds;
|
||||
BOOL mAllowAnyAVSounds;
|
||||
bool mObscureMOAP;
|
||||
S32 mCurrentEnvironmentVersion;
|
||||
|
||||
bool mIsDefaultDayCycle;
|
||||
|
|
|
|||
|
|
@ -1386,6 +1386,7 @@ char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getIns
|
|||
char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride");
|
||||
char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock");
|
||||
char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion");
|
||||
char const* const _PREHASH_ParcelExtendedFlags = LLMessageStringTable::getInstance()->getString("ParcelExtendedFlags");
|
||||
char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");
|
||||
char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
|
||||
char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
|
||||
|
|
|
|||
|
|
@ -1386,6 +1386,7 @@ extern char const* const _PREHASH_RegionAllowAccessBlock;
|
|||
extern char const* const _PREHASH_RegionAllowAccessOverride;
|
||||
extern char const* const _PREHASH_ParcelEnvironmentBlock;
|
||||
extern char const* const _PREHASH_ParcelEnvironmentVersion;
|
||||
extern char const* const _PREHASH_ParcelExtendedFlags;
|
||||
extern char const* const _PREHASH_RegionAllowEnvironmentOverride;
|
||||
extern char const* const _PREHASH_UCoord;
|
||||
extern char const* const _PREHASH_VCoord;
|
||||
|
|
|
|||
|
|
@ -1563,6 +1563,7 @@ void LLPluginClassMedia::seek(float time)
|
|||
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
|
||||
|
||||
message.setValueReal("time", time);
|
||||
mCurrentTime = time; // assume that it worked and we will receive an update later
|
||||
|
||||
sendMessage(message);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,22 +76,6 @@ void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& n
|
|||
txtbox->appendText(text.substr(greyed_begin + greyed_len), false, normal_style);
|
||||
}
|
||||
|
||||
const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
|
||||
{
|
||||
static const std::string PHONE_SEPARATOR = LLUI::getInstance()->mSettingGroups["config"]->getString("AvalinePhoneSeparator");
|
||||
static const S32 PHONE_PART_LEN = 2;
|
||||
|
||||
static std::string formatted_phone_str;
|
||||
formatted_phone_str = phone_str;
|
||||
S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN;
|
||||
for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN)
|
||||
{
|
||||
formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR);
|
||||
}
|
||||
|
||||
return formatted_phone_str;
|
||||
}
|
||||
|
||||
bool LLTextUtil::processUrlMatch(LLUrlMatch* match,LLTextBase* text_base, bool is_content_trusted)
|
||||
{
|
||||
if (match == 0 || text_base == 0)
|
||||
|
|
|
|||
|
|
@ -58,18 +58,6 @@ namespace LLTextUtil
|
|||
const std::string& text,
|
||||
const std::string& greyed);
|
||||
|
||||
/**
|
||||
* Formats passed phone number to be more human readable.
|
||||
*
|
||||
* It just divides the number on parts by two digits from right to left. The first left part
|
||||
* can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in
|
||||
* application settings (AvalinePhoneSeparator)
|
||||
*
|
||||
* @param[in] phone_str string with original phone number
|
||||
* @return reference to string with formatted phone number
|
||||
*/
|
||||
const std::string& formatPhoneNumber(const std::string& phone_str);
|
||||
|
||||
/**
|
||||
* Adds icon before url if need.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -93,8 +93,8 @@ private:
|
|||
|
||||
bool mIsLooping;
|
||||
|
||||
float mCurTime;
|
||||
float mDuration;
|
||||
F64 mCurTime;
|
||||
F64 mDuration;
|
||||
EStatus mVlcStatus;
|
||||
};
|
||||
|
||||
|
|
@ -562,7 +562,24 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
|
|||
mTextureWidth = texture_width;
|
||||
mTextureHeight = texture_height;
|
||||
|
||||
libvlc_time_t time = 1000.0 * mCurTime;
|
||||
|
||||
playMedia();
|
||||
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
|
||||
time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
|
||||
if (time < 0)
|
||||
{
|
||||
// -1 if there is no media
|
||||
mCurTime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCurTime = (F64)time / 1000.0;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -606,11 +623,27 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
|
|||
}
|
||||
else if (message_name == "seek")
|
||||
{
|
||||
if (mDuration > 0)
|
||||
{
|
||||
F64 normalized_offset = message_in.getValueReal("time") / mDuration;
|
||||
libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset);
|
||||
}
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
libvlc_time_t time = 1000.0 * message_in.getValueReal("time");
|
||||
libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
|
||||
time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
|
||||
if (time < 0)
|
||||
{
|
||||
// -1 if there is no media
|
||||
mCurTime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCurTime = (F64)time / 1000.0;
|
||||
}
|
||||
|
||||
if (!libvlc_media_player_is_playing(mLibVLCMediaPlayer))
|
||||
{
|
||||
// if paused, won't trigger update, update now
|
||||
setDirty(0, 0, mWidth, mHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (message_name == "set_loop")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2100,17 +2100,6 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvalinePhoneSeparator</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>-</string>
|
||||
</map>
|
||||
<key>AvatarAxisDeadZone0</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -6940,11 +6929,11 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&sid=[SESSION_ID]</string>
|
||||
<string>https://search.[GRID]/?query_term=[QUERY]&search_type=[TYPE][COLLECTION]&maturity=[MATURITY]&p=[AUTH_TOKEN]&lang=[LANGUAGE]&sid=[SESSION_ID]</string>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
<!-- LL, possibly privacy leaking search string
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
<string>https://search.[GRID]/?query_term=[QUERY]&search_type=[TYPE][COLLECTION]&maturity=[MATURITY]&p=[AUTH_TOKEN]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
-->
|
||||
</map>
|
||||
<key>GuidebookURL</key>
|
||||
|
|
@ -8178,6 +8167,17 @@
|
|||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DiskCacheVersion</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Version number of disk cache</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LocalFileSystemBrowsingEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -407,9 +407,6 @@ void FSFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::str
|
|||
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!session) return;
|
||||
|
||||
// no need to spawn chiclets for participants in P2P calls called through Avaline
|
||||
if (session->isP2P() && session->isOtherParticipantAvaline()) return;
|
||||
|
||||
FSFloaterIM::onNewIMReceived(session_id);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,46 +59,6 @@
|
|||
#include "rlvcommon.h"
|
||||
|
||||
static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids);
|
||||
void reshape_floater(FSFloaterVoiceControls* floater, S32 delta_height);
|
||||
|
||||
class LLNonAvatarCaller : public LLAvatarListItem
|
||||
{
|
||||
public:
|
||||
LLNonAvatarCaller() : LLAvatarListItem(false)
|
||||
{
|
||||
|
||||
}
|
||||
BOOL postBuild()
|
||||
{
|
||||
BOOL rv = LLAvatarListItem::postBuild();
|
||||
|
||||
if (rv)
|
||||
{
|
||||
setOnline(true);
|
||||
showLastInteractionTime(false);
|
||||
setShowProfileBtn(false);
|
||||
setShowInfoBtn(false);
|
||||
mAvatarIcon->setValue("Avaline_Icon");
|
||||
mAvatarIcon->setToolTip(std::string(""));
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
void setName(const std::string& name)
|
||||
{
|
||||
const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
|
||||
LLAvatarListItem::setAvatarName(formatted_phone);
|
||||
LLAvatarListItem::setAvatarToolTip(formatted_phone);
|
||||
}
|
||||
|
||||
void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); }
|
||||
};
|
||||
|
||||
|
||||
static void* create_non_avatar_caller(void*)
|
||||
{
|
||||
return new LLNonAvatarCaller;
|
||||
}
|
||||
|
||||
LLVoiceChannel* FSFloaterVoiceControls::sCurrentVoiceChannel = NULL;
|
||||
|
||||
|
|
@ -107,7 +67,6 @@ FSFloaterVoiceControls::FSFloaterVoiceControls(const LLSD& key)
|
|||
, mSpeakerManager(NULL)
|
||||
, mParticipants(NULL)
|
||||
, mAvatarList(NULL)
|
||||
, mNonAvatarCaller(NULL)
|
||||
, mVoiceType(VC_LOCAL_CHAT)
|
||||
, mAgentPanel(NULL)
|
||||
, mSpeakingIndicator(NULL)
|
||||
|
|
@ -120,7 +79,6 @@ FSFloaterVoiceControls::FSFloaterVoiceControls(const LLSD& key)
|
|||
static LLUICachedControl<S32> voice_left_remove_delay ("VoiceParticipantLeftRemoveDelay", 10);
|
||||
mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&FSFloaterVoiceControls::removeVoiceLeftParticipant, this, _1), voice_left_remove_delay);
|
||||
|
||||
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
|
||||
LLVoiceClient::instance().addObserver(this);
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(this);
|
||||
|
||||
|
|
@ -156,9 +114,6 @@ BOOL FSFloaterVoiceControls::postBuild()
|
|||
|
||||
childSetAction("leave_call_btn", boost::bind(&FSFloaterVoiceControls::leaveCall, this));
|
||||
|
||||
mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");
|
||||
mNonAvatarCaller->setVisible(FALSE);
|
||||
|
||||
mVolumeSlider = findChild<LLSliderCtrl>("volume_slider");
|
||||
mMuteButton = findChild<LLButton>("mute_btn");
|
||||
|
||||
|
|
@ -283,11 +238,6 @@ void FSFloaterVoiceControls::updateSession()
|
|||
case IM_NOTHING_SPECIAL:
|
||||
case IM_SESSION_P2P_INVITE:
|
||||
mVoiceType = VC_PEER_TO_PEER;
|
||||
|
||||
if (!im_session->mOtherParticipantIsAvatar)
|
||||
{
|
||||
mVoiceType = VC_PEER_TO_PEER_AVALINE;
|
||||
}
|
||||
break;
|
||||
case IM_SESSION_CONFERENCE_START:
|
||||
case IM_SESSION_GROUP_START:
|
||||
|
|
@ -298,7 +248,7 @@ void FSFloaterVoiceControls::updateSession()
|
|||
}
|
||||
else
|
||||
{
|
||||
mVoiceType = VC_AD_HOC_CHAT;
|
||||
mVoiceType = VC_AD_HOC_CHAT;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -348,37 +298,24 @@ void FSFloaterVoiceControls::updateSession()
|
|||
|
||||
void FSFloaterVoiceControls::refreshParticipantList()
|
||||
{
|
||||
bool non_avatar_caller = VC_PEER_TO_PEER_AVALINE == mVoiceType;
|
||||
|
||||
if (non_avatar_caller)
|
||||
{
|
||||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSpeakerManager->getSessionID());
|
||||
mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID);
|
||||
mNonAvatarCaller->setName(session->mName);
|
||||
}
|
||||
|
||||
// Ansariel: Changed for RLVa @shownearby
|
||||
//mNonAvatarCaller->setVisible(non_avatar_caller);
|
||||
//mAvatarList->setVisible(!non_avatar_caller);
|
||||
updateListVisibility();
|
||||
|
||||
if (!non_avatar_caller)
|
||||
{
|
||||
llassert(mParticipants == NULL); // check for possible memory leak
|
||||
mParticipants = new FSParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);
|
||||
mParticipants->setValidateSpeakerCallback(boost::bind(&FSFloaterVoiceControls::validateSpeaker, this, _1));
|
||||
const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
|
||||
mParticipants->setSortOrder(FSParticipantList::EParticipantSortOrder(speaker_sort_order));
|
||||
llassert(mParticipants == NULL); // check for possible memory leak
|
||||
mParticipants = new FSParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);
|
||||
mParticipants->setValidateSpeakerCallback(boost::bind(&FSFloaterVoiceControls::validateSpeaker, this, _1));
|
||||
const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
|
||||
mParticipants->setSortOrder(FSParticipantList::EParticipantSortOrder(speaker_sort_order));
|
||||
|
||||
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
|
||||
{
|
||||
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
|
||||
}
|
||||
|
||||
// we have to made delayed initialization of voice state of participant list.
|
||||
// it will be performed after first LLAvatarList refreshing in the onAvatarListRefreshed().
|
||||
mInitParticipantsVoiceState = true;
|
||||
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
|
||||
{
|
||||
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
|
||||
}
|
||||
|
||||
// we have to made delayed initialization of voice state of participant list.
|
||||
// it will be performed after first LLAvatarList refreshing in the onAvatarListRefreshed().
|
||||
mInitParticipantsVoiceState = true;
|
||||
}
|
||||
|
||||
void FSFloaterVoiceControls::onAvatarListRefreshed()
|
||||
|
|
@ -494,15 +431,8 @@ void FSFloaterVoiceControls::updateTitle()
|
|||
title = getString("title_nearby");
|
||||
break;
|
||||
case VC_PEER_TO_PEER:
|
||||
case VC_PEER_TO_PEER_AVALINE:
|
||||
{
|
||||
title = voice_channel->getSessionName();
|
||||
|
||||
if (VC_PEER_TO_PEER_AVALINE == mVoiceType)
|
||||
{
|
||||
title = LLTextUtil::formatPhoneNumber(title);
|
||||
}
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = title;
|
||||
title = getString("title_peer_2_peer", args);
|
||||
|
|
@ -896,7 +826,6 @@ void FSFloaterVoiceControls::reset(const LLVoiceChannel::EState& new_state)
|
|||
|
||||
// Ansariel: Changed for RLVa @shownearby
|
||||
//mAvatarList->setVisible(TRUE);
|
||||
//mNonAvatarCaller->setVisible(FALSE);
|
||||
updateListVisibility();
|
||||
|
||||
mSpeakerManager = NULL;
|
||||
|
|
@ -913,26 +842,12 @@ void FSFloaterVoiceControls::updateListVisibility()
|
|||
if (mIsRlvShowNearbyRestricted && mVoiceType == VC_LOCAL_CHAT)
|
||||
{
|
||||
mAvatarList->setVisible(FALSE);
|
||||
mNonAvatarCaller->setVisible(FALSE);
|
||||
mRlvRestrictedText->setVisible(TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mAvatarList->setVisible(TRUE);
|
||||
mRlvRestrictedText->setVisible(FALSE);
|
||||
|
||||
if (mParticipants)
|
||||
{
|
||||
// Case coming from refreshParticipantList
|
||||
bool non_avatar_caller = VC_PEER_TO_PEER_AVALINE == mVoiceType;
|
||||
mNonAvatarCaller->setVisible(non_avatar_caller);
|
||||
mAvatarList->setVisible(!non_avatar_caller);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case coming from reset()
|
||||
mAvatarList->setVisible(TRUE);
|
||||
mNonAvatarCaller->setVisible(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
//EOF
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ class FSParticipantList;
|
|||
class LLAvatarList;
|
||||
class LLAvatarListItem;
|
||||
class LLAvatarName;
|
||||
class LLNonAvatarCaller;
|
||||
class LLOutputMonitorCtrl;
|
||||
class LLSpeakerMgr;
|
||||
class LLSpeakersDelayActionsStorage;
|
||||
|
|
@ -92,8 +91,7 @@ private:
|
|||
VC_GROUP_CHAT,
|
||||
VC_AD_HOC_CHAT,
|
||||
VC_PEER_TO_PEER,
|
||||
VC_PEER_TO_PEER_AVALINE
|
||||
}EVoiceControls;
|
||||
} EVoiceControls;
|
||||
|
||||
typedef enum e_speaker_state
|
||||
{
|
||||
|
|
@ -258,7 +256,6 @@ private:
|
|||
LLSpeakerMgr* mSpeakerManager;
|
||||
FSParticipantList* mParticipants;
|
||||
LLAvatarList* mAvatarList;
|
||||
LLNonAvatarCaller* mNonAvatarCaller;
|
||||
EVoiceControls mVoiceType;
|
||||
LLPanel* mAgentPanel;
|
||||
LLOutputMonitorCtrl* mSpeakingIndicator;
|
||||
|
|
|
|||
|
|
@ -59,146 +59,6 @@ static void update_speaker_indicator(const LLAvatarList* const avatar_list, cons
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// See EXT-4301.
|
||||
/**
|
||||
* class LLAvalineUpdater - observe the list of voice participants in session and check
|
||||
* presence of Avaline Callers among them.
|
||||
*
|
||||
* LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation:
|
||||
* - whether Avaline caller presence among participants;
|
||||
* - whether watched Avaline caller still exists in voice channel.
|
||||
* Both validations have callbacks which will notify subscriber if any of event occur.
|
||||
*
|
||||
* @see findAvalineCaller()
|
||||
* @see checkIfAvalineCallersExist()
|
||||
*/
|
||||
class LLAvalineUpdater : public LLVoiceClientParticipantObserver
|
||||
{
|
||||
public:
|
||||
typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t;
|
||||
|
||||
LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb)
|
||||
: mAvalineFoundCallback(found_cb)
|
||||
, mAvalineRemovedCallback(removed_cb)
|
||||
{
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
}
|
||||
~LLAvalineUpdater()
|
||||
{
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds UUID of Avaline caller to watch.
|
||||
*
|
||||
* @see checkIfAvalineCallersExist().
|
||||
*/
|
||||
void watchAvalineCaller(const LLUUID& avaline_caller_id)
|
||||
{
|
||||
mAvalineCallers.insert(avaline_caller_id);
|
||||
}
|
||||
|
||||
void onParticipantsChanged()
|
||||
{
|
||||
uuid_set_t participant_uuids;
|
||||
LLVoiceClient::getInstance()->getParticipantList(participant_uuids);
|
||||
|
||||
|
||||
// check whether Avaline caller exists among voice participants
|
||||
// and notify Participant List
|
||||
findAvalineCaller(participant_uuids);
|
||||
|
||||
// check whether watched Avaline callers still present among voice participant
|
||||
// and remove if absents.
|
||||
checkIfAvalineCallersExist(participant_uuids);
|
||||
}
|
||||
|
||||
private:
|
||||
typedef std::set<LLUUID> uuid_set_t;
|
||||
|
||||
/**
|
||||
* Finds Avaline callers among voice participants and calls mAvalineFoundCallback.
|
||||
*
|
||||
* When Avatar is in group call with Avaline caller and then ends call Avaline caller stays
|
||||
* in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again
|
||||
* Avaline caller is added to voice channel AFTER Avatar is connected to group call.
|
||||
* But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information
|
||||
* if a speaker is Avaline caller.
|
||||
*
|
||||
* In this case this speaker is created as avatar and will be recreated when it appears in
|
||||
* Avatar's Voice session.
|
||||
*
|
||||
* @see FSParticipantList::onAvalineCallerFound()
|
||||
*/
|
||||
void findAvalineCaller(const uuid_set_t& participant_uuids)
|
||||
{
|
||||
uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end();
|
||||
|
||||
for(; it != it_end; ++it)
|
||||
{
|
||||
const LLUUID& participant_id = *it;
|
||||
if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id))
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL;
|
||||
|
||||
if (mAvalineFoundCallback)
|
||||
{
|
||||
mAvalineFoundCallback(participant_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback.
|
||||
*
|
||||
* The problem is when Avaline caller ends a call it is removed from Voice Client session but
|
||||
* still exists in LLSpeakerMgr. Server does not send such information.
|
||||
* This method implements a HUCK to notify subscribers that watched Avaline callers by class
|
||||
* are not anymore in the call.
|
||||
*
|
||||
* @see FSParticipantList::onAvalineCallerRemoved()
|
||||
*/
|
||||
void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids)
|
||||
{
|
||||
uuid_set_t::iterator it = mAvalineCallers.begin();
|
||||
uuid_set_t::const_iterator participants_it_end = participant_uuids.end();
|
||||
|
||||
while (it != mAvalineCallers.end())
|
||||
{
|
||||
const LLUUID participant_id = *it;
|
||||
LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL;
|
||||
bool not_found = participant_uuids.find(participant_id) == participants_it_end;
|
||||
if (not_found)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL;
|
||||
|
||||
// notify Participant List
|
||||
if (mAvalineRemovedCallback)
|
||||
{
|
||||
mAvalineRemovedCallback(participant_id);
|
||||
}
|
||||
|
||||
// remove from the watch list
|
||||
mAvalineCallers.erase(it++);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
process_avaline_callback_t mAvalineFoundCallback;
|
||||
process_avaline_callback_t mAvalineRemovedCallback;
|
||||
|
||||
uuid_set_t mAvalineCallers;
|
||||
};
|
||||
|
||||
FSParticipantList::FSParticipantList(LLSpeakerMgr* data_source,
|
||||
LLAvatarList* avatar_list,
|
||||
bool use_context_menu/* = true*/,
|
||||
|
|
@ -211,10 +71,6 @@ FSParticipantList::FSParticipantList(LLSpeakerMgr* data_source,
|
|||
mValidateSpeakerCallback(NULL),
|
||||
mConvType(CONV_UNKNOWN)
|
||||
{
|
||||
|
||||
mAvalineUpdater = new LLAvalineUpdater(boost::bind(&FSParticipantList::onAvalineCallerFound, this, _1),
|
||||
boost::bind(&FSParticipantList::onAvalineCallerRemoved, this, _1));
|
||||
|
||||
mSpeakerAddListener = new SpeakerAddListener(*this);
|
||||
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
|
||||
mSpeakerClearListener = new SpeakerClearListener(*this);
|
||||
|
|
@ -316,8 +172,6 @@ FSParticipantList::~FSParticipantList()
|
|||
|
||||
mAvatarList->setContextMenu(NULL);
|
||||
mAvatarList->setComparator(NULL);
|
||||
|
||||
delete mAvalineUpdater;
|
||||
}
|
||||
|
||||
void FSParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
|
||||
|
|
@ -425,55 +279,6 @@ void FSParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Seems this method is not necessary after onAvalineCallerRemoved was implemented;
|
||||
|
||||
It does nothing because list item is always created with correct class type for Avaline caller.
|
||||
For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client
|
||||
session.
|
||||
This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call.
|
||||
|
||||
Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself.
|
||||
Asked in EXT-4301.
|
||||
*/
|
||||
void FSParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
|
||||
{
|
||||
LLPanel* item = mAvatarList->getItemByValue(participant_id);
|
||||
|
||||
if (NULL == item)
|
||||
{
|
||||
LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeid(*item) == typeid(LLAvalineListItem))
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
|
||||
// item representing an Avaline caller has a correct type already.
|
||||
return;
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
|
||||
|
||||
// remove UUID from LLAvatarList::mIDs to be able add it again.
|
||||
uuid_vec_t& ids = mAvatarList->getIDs();
|
||||
uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
|
||||
ids.erase(pos);
|
||||
|
||||
// remove item directly
|
||||
mAvatarList->removeItem(item);
|
||||
|
||||
// re-add avaline caller with a correct class instance.
|
||||
addAvatarIDExceptAgent(participant_id);
|
||||
}
|
||||
|
||||
void FSParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL;
|
||||
|
||||
mSpeakerMgr->removeAvalineSpeaker(participant_id);
|
||||
}
|
||||
|
||||
void FSParticipantList::setSortOrder(EParticipantSortOrder order)
|
||||
{
|
||||
const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
|
||||
|
|
@ -631,12 +436,7 @@ void FSParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
|
|||
mAvatarList->getIDs().push_back(avatar_id);
|
||||
mAvatarList->setDirty();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
|
||||
mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name);
|
||||
mAvalineUpdater->watchAvalineCaller(avatar_id);
|
||||
}
|
||||
|
||||
adjustParticipant(avatar_id);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
class LLSpeakerMgr;
|
||||
class LLAvatarList;
|
||||
class LLUICtrl;
|
||||
class LLAvalineUpdater;
|
||||
|
||||
class FSParticipantList
|
||||
{
|
||||
|
|
@ -260,9 +259,6 @@ private:
|
|||
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
|
||||
void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
|
||||
|
||||
void onAvalineCallerFound(const LLUUID& participant_id);
|
||||
void onAvalineCallerRemoved(const LLUUID& participant_id);
|
||||
|
||||
/**
|
||||
* Adjusts passed participant to work properly.
|
||||
*
|
||||
|
|
@ -301,7 +297,6 @@ private:
|
|||
|
||||
LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
|
||||
validate_speaker_callback_t mValidateSpeakerCallback;
|
||||
LLAvalineUpdater* mAvalineUpdater;
|
||||
|
||||
EConversationType mConvType;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3921,9 +3921,18 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";
|
||||
if(LLVoiceClient::getInstance()->voiceEnabled())
|
||||
{
|
||||
LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
|
||||
LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
|
||||
const std::string build_version = version.mBuildVersion;
|
||||
std::ostringstream version_string;
|
||||
version_string << version.serverType << " " << version.serverVersion << std::endl;
|
||||
if (std::equal(build_version.begin(), build_version.begin() + version.serverVersion.size(),
|
||||
version.serverVersion.begin()))
|
||||
{ // Normal case: Show type and build version.
|
||||
version_string << version.serverType << " " << build_version << std::endl;
|
||||
}
|
||||
else
|
||||
{ // Mismatch: Show both versions.
|
||||
version_string << version.serverVersion << "/" << build_version << std::endl;
|
||||
}
|
||||
info["VOICE_VERSION"] = version_string.str();
|
||||
}
|
||||
else
|
||||
|
|
@ -5012,6 +5021,15 @@ U32 LLAppViewer::getTextureCacheVersion()
|
|||
return TEXTURE_CACHE_VERSION ;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLAppViewer::getDiskCacheVersion()
|
||||
{
|
||||
// Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes.
|
||||
const U32 DISK_CACHE_VERSION = 1;
|
||||
|
||||
return DISK_CACHE_VERSION ;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLAppViewer::getObjectCacheVersion()
|
||||
{
|
||||
|
|
@ -5119,7 +5137,13 @@ bool LLAppViewer::initCache()
|
|||
|
||||
if (!read_only)
|
||||
{
|
||||
if (mPurgeCache)
|
||||
if (gSavedSettings.getS32("DiskCacheVersion") != LLAppViewer::getDiskCacheVersion())
|
||||
{
|
||||
LLDiskCache::getInstance()->clearCache();
|
||||
gSavedSettings.setS32("DiskCacheVersion", LLAppViewer::getDiskCacheVersion());
|
||||
}
|
||||
|
||||
if (mPurgeCache)
|
||||
{
|
||||
LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));
|
||||
purgeCache();
|
||||
|
|
@ -6379,10 +6403,7 @@ void LLAppViewer::disconnectViewer()
|
|||
}
|
||||
// <FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Wrong instance check
|
||||
//if (LLSelectMgr::getInstance())
|
||||
if (LLSelectMgr::instanceExists())
|
||||
// </FS:Ansariel
|
||||
{
|
||||
LLSelectMgr::getInstance()->deselectAll();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ public:
|
|||
|
||||
static U32 getTextureCacheVersion() ;
|
||||
static U32 getObjectCacheVersion() ;
|
||||
static U32 getDiskCacheVersion() ;
|
||||
|
||||
const std::string& getSerialNumber() { return mSerialNumber; }
|
||||
|
||||
|
|
|
|||
|
|
@ -358,21 +358,6 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
|
|||
}
|
||||
}
|
||||
|
||||
void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL;
|
||||
LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
|
||||
item->setAvatarId(item_id, session_id, true, false);
|
||||
item->setName(item_name);
|
||||
item->showLastInteractionTime(mShowLastInteractionTime);
|
||||
item->showSpeakingIndicator(mShowSpeakingIndicator);
|
||||
item->setOnline(false);
|
||||
|
||||
addItem(item, item_id);
|
||||
mIDs.push_back(item_id);
|
||||
sort();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// PROTECTED SECTION
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -416,24 +401,17 @@ void LLAvatarList::refresh()
|
|||
{
|
||||
// *NOTE: If you change the UI to show a different string,
|
||||
// be sure to change the filter code below.
|
||||
if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
|
||||
{
|
||||
const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
|
||||
addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
// <FS:AO> Always show usernames on avatar lists
|
||||
// <FS:Ansa> The passed name is not used as of 21-01-2014
|
||||
//std::string display_name = getAvatarName(av_name);
|
||||
//addNewItem(buddy_id,
|
||||
// display_name.empty() ? waiting_str : display_name,
|
||||
// LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
addNewItem(buddy_id,
|
||||
av_name.getCompleteName(),
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
// </FS:AO>
|
||||
}
|
||||
// <FS:AO> Always show usernames on avatar lists
|
||||
// <FS:Ansa> The passed name is not used as of 21-01-2014
|
||||
//std::string display_name = getAvatarName(av_name);
|
||||
//addNewItem(buddy_id,
|
||||
// display_name.empty() ? waiting_str : display_name,
|
||||
// LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
addNewItem(buddy_id,
|
||||
av_name.getCompleteName(),
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
// </FS:AO>
|
||||
|
||||
modified = true;
|
||||
nadded++;
|
||||
}
|
||||
|
|
@ -620,9 +598,9 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
|
|||
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
|
||||
// if ( mContextMenu && !isAvalineItemSelected())
|
||||
// if ( mContextMenu)
|
||||
// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a) | Modified: RLVa-1.2.0d
|
||||
if ( (mContextMenu && !isAvalineItemSelected()) && ((!mRlvCheckShowNames) || (!RlvActions::hasBehaviour(RLV_BHVR_SHOWNAMES))) )
|
||||
if (mContextMenu && ((!mRlvCheckShowNames) || (!RlvActions::hasBehaviour(RLV_BHVR_SHOWNAMES))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
uuid_vec_t selected_uuids;
|
||||
|
|
@ -683,21 +661,6 @@ BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
bool LLAvatarList::isAvalineItemSelected()
|
||||
{
|
||||
std::vector<LLPanel*> selected_items;
|
||||
getSelectedItems(selected_items);
|
||||
std::vector<LLPanel*>::iterator it = selected_items.begin();
|
||||
|
||||
for(; it != selected_items.end(); ++it)
|
||||
{
|
||||
if (dynamic_cast<LLAvalineListItem*>(*it))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLAvatarList::setVisible(BOOL visible)
|
||||
{
|
||||
if ( visible == FALSE && mContextMenu )
|
||||
|
|
@ -823,63 +786,3 @@ bool LLAvatarItemUserNameComparator::doCompare(const LLAvatarListItem* avatar_it
|
|||
return name1 < name2;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
/************************************************************************/
|
||||
/* class LLAvalineListItem */
|
||||
/************************************************************************/
|
||||
LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false)
|
||||
, mIsHideNumber(hide_number)
|
||||
{
|
||||
// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called.
|
||||
buildFromFile( "panel_avatar_list_item.xml");
|
||||
}
|
||||
|
||||
BOOL LLAvalineListItem::postBuild()
|
||||
{
|
||||
BOOL rv = LLAvatarListItem::postBuild();
|
||||
|
||||
if (rv)
|
||||
{
|
||||
setOnline(true);
|
||||
showLastInteractionTime(false);
|
||||
setShowProfileBtn(false);
|
||||
setShowInfoBtn(false);
|
||||
mAvatarIcon->setValue("Avaline_Icon");
|
||||
mAvatarIcon->setToolTip(std::string(""));
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number
|
||||
void LLAvalineListItem::setName(const std::string& name)
|
||||
{
|
||||
if (mIsHideNumber)
|
||||
{
|
||||
static U32 order = 0;
|
||||
typedef std::map<LLUUID, U32> avaline_callers_nums_t;
|
||||
static avaline_callers_nums_t mAvalineCallersNums;
|
||||
|
||||
llassert(getAvatarId() != LLUUID::null);
|
||||
|
||||
const LLUUID &uuid = getAvatarId();
|
||||
|
||||
if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end())
|
||||
{
|
||||
mAvalineCallersNums[uuid] = ++order;
|
||||
LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL;
|
||||
}
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]);
|
||||
std::string hidden_name = LLTrans::getString("AvalineCaller", args);
|
||||
|
||||
LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL;
|
||||
LLAvatarListItem::setAvatarName(hidden_name);
|
||||
LLAvatarListItem::setAvatarToolTip(hidden_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
|
||||
LLAvatarListItem::setAvatarName(formatted_phone);
|
||||
LLAvatarListItem::setAvatarToolTip(formatted_phone);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ public:
|
|||
|
||||
virtual S32 notifyParent(const LLSD& info);
|
||||
|
||||
void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
|
||||
void handleDisplayNamesOptionChanged();
|
||||
|
||||
void setShowCompleteName(bool show) { mShowCompleteName = show;};
|
||||
|
|
@ -142,8 +141,6 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
bool isAvalineItemSelected();
|
||||
|
||||
bool mIgnoreOnlineStatus;
|
||||
bool mShowLastInteractionTime;
|
||||
bool mDirty;
|
||||
|
|
@ -238,27 +235,4 @@ protected:
|
|||
};
|
||||
// </FS:Ansariel>
|
||||
|
||||
/**
|
||||
* Represents Avaline caller in Avatar list in Voice Control Panel and group chats.
|
||||
*/
|
||||
class LLAvalineListItem : public LLAvatarListItem
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param hide_number - flag indicating if number should be hidden.
|
||||
* In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc.
|
||||
*/
|
||||
LLAvalineListItem(bool hide_number = true);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void setName(const std::string& name);
|
||||
|
||||
private:
|
||||
bool mIsHideNumber;
|
||||
};
|
||||
|
||||
#endif // LL_LLAVATARLIST_H
|
||||
|
|
|
|||
|
|
@ -92,9 +92,6 @@ void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& nam
|
|||
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!session) return;
|
||||
|
||||
// no need to spawn chiclets for participants in P2P calls called through Avaline
|
||||
if (session->isP2P() && session->isOtherParticipantAvaline()) return;
|
||||
|
||||
if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
|
||||
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
|
|
|
|||
|
|
@ -86,8 +86,9 @@ public:
|
|||
LLSearchHandler gSearchHandler;
|
||||
|
||||
LLFloaterSearch::SearchQuery::SearchQuery()
|
||||
: category("category", ""),
|
||||
query("query")
|
||||
: category("category", ""),
|
||||
collection("collection", ""),
|
||||
query("query")
|
||||
{}
|
||||
|
||||
LLFloaterSearch::LLFloaterSearch(const Params& key) :
|
||||
|
|
@ -96,16 +97,16 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :
|
|||
{
|
||||
// declare a map that transforms a category name into
|
||||
// the URL suffix that is used to search that category
|
||||
mCategoryPaths = LLSD::emptyMap();
|
||||
mCategoryPaths["all"] = "search";
|
||||
mCategoryPaths["people"] = "search/people";
|
||||
mCategoryPaths["places"] = "search/places";
|
||||
mCategoryPaths["events"] = "search/events";
|
||||
mCategoryPaths["groups"] = "search/groups";
|
||||
mCategoryPaths["wiki"] = "search/wiki";
|
||||
mCategoryPaths["land"] = "land";
|
||||
mCategoryPaths["destinations"] = "destinations";
|
||||
mCategoryPaths["classifieds"] = "classifieds";
|
||||
|
||||
mSearchType.insert("standard");
|
||||
mSearchType.insert("land");
|
||||
mSearchType.insert("classified");
|
||||
|
||||
mCollectionType.insert("events");
|
||||
mCollectionType.insert("destinations");
|
||||
mCollectionType.insert("places");
|
||||
mCollectionType.insert("groups");
|
||||
mCollectionType.insert("people");
|
||||
}
|
||||
|
||||
BOOL LLFloaterSearch::postBuild()
|
||||
|
|
@ -173,18 +174,36 @@ void LLFloaterSearch::search(const SearchQuery &p)
|
|||
|
||||
// work out the subdir to use based on the requested category
|
||||
LLSD subs;
|
||||
if (mCategoryPaths.has(p.category))
|
||||
if (mSearchType.find(p.category) != mSearchType.end())
|
||||
{
|
||||
subs["CATEGORY"] = mCategoryPaths[p.category].asString();
|
||||
subs["TYPE"] = p.category;
|
||||
}
|
||||
else
|
||||
{
|
||||
subs["CATEGORY"] = mCategoryPaths["all"].asString();
|
||||
subs["TYPE"] = "standard";
|
||||
}
|
||||
|
||||
// add the search query string
|
||||
subs["QUERY"] = LLURI::escape(p.query);
|
||||
|
||||
subs["COLLECTION"] = "";
|
||||
if (subs["TYPE"] == "standard")
|
||||
{
|
||||
if (mCollectionType.find(p.collection) != mCollectionType.end())
|
||||
{
|
||||
subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string collection_args("");
|
||||
for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it)
|
||||
{
|
||||
collection_args += "&collection_chosen=" + std::string(*it);
|
||||
}
|
||||
subs["COLLECTION"] = collection_args;
|
||||
}
|
||||
}
|
||||
|
||||
// add the permissions token that login.cgi gave us
|
||||
// We use "search_token", and fallback to "auth_token" if not present.
|
||||
LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
|
||||
|
|
@ -198,15 +217,15 @@ void LLFloaterSearch::search(const SearchQuery &p)
|
|||
std::string maturity;
|
||||
if (gAgent.prefersAdult())
|
||||
{
|
||||
maturity = "42"; // PG,Mature,Adult
|
||||
maturity = "gma"; // PG,Mature,Adult
|
||||
}
|
||||
else if (gAgent.prefersMature())
|
||||
{
|
||||
maturity = "21"; // PG,Mature
|
||||
maturity = "gm"; // PG,Mature
|
||||
}
|
||||
else
|
||||
{
|
||||
maturity = "13"; // PG
|
||||
maturity = "g"; // PG
|
||||
}
|
||||
subs["MATURITY"] = maturity;
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ public:
|
|||
struct SearchQuery : public LLInitParam::Block<SearchQuery>
|
||||
{
|
||||
Optional<std::string> category;
|
||||
Optional<std::string> collection;
|
||||
Optional<std::string> query;
|
||||
|
||||
SearchQuery();
|
||||
|
|
@ -84,7 +85,8 @@ public:
|
|||
private:
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
LLSD mCategoryPaths;
|
||||
std::set<std::string> mSearchType;
|
||||
std::set<std::string> mCollectionType;
|
||||
U8 mSearchGodLevel;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
|
|||
void LLGroupActions::search()
|
||||
{
|
||||
// <FS:Ansariel> Open groups search panel instead of invoking presumed failed websearch
|
||||
//LLFloaterReg::showInstance("search", LLSD().with("category", "groups"));
|
||||
//LLFloaterReg::showInstance("search", LLSD().with("collection", "groups"));
|
||||
LLFloaterReg::showInstance("search", LLSD().with("tab", "groups"));
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -673,7 +673,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
mSessionInitialized(false),
|
||||
mCallBackEnabled(true),
|
||||
mTextIMPossible(true),
|
||||
mOtherParticipantIsAvatar(true),
|
||||
mStartCallOnInitialize(false),
|
||||
mStartedAsIMCall(voice),
|
||||
mIsDNDsend(false),
|
||||
|
|
@ -685,13 +684,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
|
||||
{
|
||||
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
|
||||
mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
|
||||
|
||||
// check if it was AVALINE call
|
||||
if (!mOtherParticipantIsAvatar)
|
||||
{
|
||||
mSessionType = AVALINE_SESSION;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -792,9 +784,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
|
|||
|
||||
switch(mSessionType)
|
||||
{
|
||||
case AVALINE_SESSION:
|
||||
// no text notifications
|
||||
break;
|
||||
case P2P_SESSION:
|
||||
LLAvatarNameCache::get(mOtherParticipantID, &av_name);
|
||||
other_avatar_name = av_name.getUserName();
|
||||
|
|
@ -1054,11 +1043,6 @@ bool LLIMModel::LLIMSession::isGroupChat()
|
|||
return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID));
|
||||
}
|
||||
|
||||
bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
|
||||
{
|
||||
return !mOtherParticipantIsAvatar;
|
||||
}
|
||||
|
||||
LLUUID LLIMModel::LLIMSession::generateOutgoingAdHocHash() const
|
||||
{
|
||||
LLUUID hash = LLUUID::null;
|
||||
|
|
@ -2078,7 +2062,6 @@ LLIMMgr::onConfirmForceCloseError(
|
|||
|
||||
LLCallDialogManager::LLCallDialogManager():
|
||||
mPreviousSessionlName(""),
|
||||
mPreviousSessionType(LLIMModel::LLIMSession::P2P_SESSION),
|
||||
mCurrentSessionlName(""),
|
||||
mSession(NULL),
|
||||
mOldState(LLVoiceChannel::STATE_READY)
|
||||
|
|
@ -2109,12 +2092,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
|
|||
mCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSession)
|
||||
{
|
||||
// store previous session type to process Avaline calls in dialogs
|
||||
mPreviousSessionType = mSession->mSessionType;
|
||||
}
|
||||
|
||||
mSession = session;
|
||||
|
||||
|
|
@ -2140,7 +2117,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
|
|||
mCallDialogPayload["session_name"] = mSession->mName;
|
||||
mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
|
||||
mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
|
||||
mCallDialogPayload["old_session_type"] = mPreviousSessionType;
|
||||
mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
|
||||
mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
|
||||
mCallDialogPayload["session_type"] = mSession->mSessionType;
|
||||
|
|
@ -2176,7 +2152,6 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
|
|||
mCallDialogPayload["session_name"] = mSession->mName;
|
||||
mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
|
||||
mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
|
||||
mCallDialogPayload["old_session_type"] = mPreviousSessionType;
|
||||
mCallDialogPayload["state"] = new_state;
|
||||
mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
|
||||
mCallDialogPayload["session_type"] = mSession->mSessionType;
|
||||
|
|
@ -2193,8 +2168,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
|
|||
break;
|
||||
|
||||
case LLVoiceChannel::STATE_HUNG_UP:
|
||||
// this state is coming before session is changed, so, put it into payload map
|
||||
mCallDialogPayload["old_session_type"] = mSession->mSessionType;
|
||||
// this state is coming before session is changed
|
||||
break;
|
||||
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
|
|
@ -2314,7 +2288,6 @@ void LLCallDialog::onOpen(const LLSD& key)
|
|||
|
||||
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
|
||||
{
|
||||
// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
|
||||
bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
|
||||
bool is_group = participant_is_avatar && gAgent.isInGroup(session_id);
|
||||
|
|
@ -2335,8 +2308,8 @@ void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
|
|||
}
|
||||
else
|
||||
{
|
||||
avatar_icon->setValue("Avaline_Icon");
|
||||
avatar_icon->setToolTip(std::string(""));
|
||||
LL_WARNS() << "Participant neither avatar nor group" << LL_ENDL;
|
||||
group_icon->setValue(session_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2380,13 +2353,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
// tell the user which voice channel they are leaving
|
||||
if (!mPayload["old_channel_name"].asString().empty())
|
||||
{
|
||||
bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger();
|
||||
|
||||
std::string old_caller_name = mPayload["old_channel_name"].asString();
|
||||
if (was_avaline_call)
|
||||
{
|
||||
old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name);
|
||||
}
|
||||
|
||||
getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", old_caller_name);
|
||||
show_oldchannel = true;
|
||||
|
|
@ -2399,10 +2366,6 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
if (!mPayload["disconnected_channel_name"].asString().empty())
|
||||
{
|
||||
std::string channel_name = mPayload["disconnected_channel_name"].asString();
|
||||
if (LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["session_type"].asInteger())
|
||||
{
|
||||
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
|
||||
}
|
||||
getChild<LLUICtrl>("nearby")->setTextArg("[VOICE_CHANNEL_NAME]", channel_name);
|
||||
|
||||
// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
|
||||
|
|
@ -2418,16 +2381,11 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
std::string callee_name = mPayload["session_name"].asString();
|
||||
|
||||
LLUUID session_id = mPayload["session_id"].asUUID();
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
|
||||
if (callee_name == "anonymous")
|
||||
if (callee_name == "anonymous") // obsolete? Likely was part of avaline support
|
||||
{
|
||||
callee_name = getString("anonymous");
|
||||
}
|
||||
else if (!is_avatar)
|
||||
{
|
||||
callee_name = LLTextUtil::formatPhoneNumber(callee_name);
|
||||
}
|
||||
|
||||
LLSD callee_id = mPayload["other_user_id"];
|
||||
// Beautification: Since you know who you called, just show display name
|
||||
|
|
@ -2627,18 +2585,11 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
call_type = getString(notify_box_type);
|
||||
}
|
||||
|
||||
// check to see if this is an Avaline call
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
if (caller_name == "anonymous")
|
||||
if (caller_name == "anonymous") // obsolete? Likely was part of avaline support
|
||||
{
|
||||
caller_name = getString("anonymous");
|
||||
setCallerName(caller_name, caller_name, call_type);
|
||||
}
|
||||
else if (!is_avatar)
|
||||
{
|
||||
caller_name = LLTextUtil::formatPhoneNumber(caller_name);
|
||||
setCallerName(caller_name, caller_name, call_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get the full name information
|
||||
|
|
@ -2658,7 +2609,7 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
|
||||
if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc")
|
||||
{
|
||||
// starting notification's timer for P2P and AVALINE invitations
|
||||
// starting notification's timer for P2P invitations
|
||||
mLifetimeTimer.start();
|
||||
}
|
||||
else
|
||||
|
|
@ -2667,7 +2618,7 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
}
|
||||
|
||||
//it's not possible to connect to existing Ad-Hoc/Group chat through incoming ad-hoc call
|
||||
//and no IM for avaline
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
getChildView("Start IM")->setVisible( is_avatar && notify_box_type != "VoiceInviteAdHoc" && notify_box_type != "VoiceInviteGroup");
|
||||
|
||||
setCanDrag(FALSE);
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@ public:
|
|||
P2P_SESSION,
|
||||
GROUP_SESSION,
|
||||
ADHOC_SESSION,
|
||||
AVALINE_SESSION,
|
||||
NONE_SESSION,
|
||||
} SType;
|
||||
|
||||
|
|
@ -101,12 +100,10 @@ public:
|
|||
bool isAdHoc();
|
||||
bool isP2P();
|
||||
bool isGroupChat();
|
||||
bool isOtherParticipantAvaline();
|
||||
|
||||
bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
|
||||
bool isAdHocSessionType() const { return mSessionType == ADHOC_SESSION;}
|
||||
bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
|
||||
bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
|
||||
|
||||
LLUUID generateOutgoingAdHocHash() const;
|
||||
|
||||
|
|
@ -151,7 +148,6 @@ public:
|
|||
bool mCallBackEnabled;
|
||||
|
||||
bool mTextIMPossible;
|
||||
bool mOtherParticipantIsAvatar;
|
||||
bool mStartCallOnInitialize;
|
||||
|
||||
//if IM session is created for a voice call
|
||||
|
|
@ -569,7 +565,6 @@ private:
|
|||
|
||||
protected:
|
||||
std::string mPreviousSessionlName;
|
||||
LLIMModel::LLIMSession::SType mPreviousSessionType;
|
||||
std::string mCurrentSessionlName;
|
||||
LLIMModel::LLIMSession* mSession;
|
||||
LLVoiceChannel::EState mOldState;
|
||||
|
|
|
|||
|
|
@ -370,7 +370,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
|
|||
void LLMuteList::updateAdd(const LLMute& mute, bool show_message /* = true */)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
// External mutes (e.g. Avaline callers) are local only, don't send them to the server.
|
||||
// External mutes are local only, don't send them to the server.
|
||||
if (mute.mType == LLMute::EXTERNAL)
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -870,7 +870,7 @@ void LLNavigationBar::resizeLayoutPanel()
|
|||
}
|
||||
void LLNavigationBar::invokeSearch(std::string search_text)
|
||||
{
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "standard").with("query", LLSD(search_text)));
|
||||
}
|
||||
|
||||
void LLNavigationBar::clearHistoryCache()
|
||||
|
|
|
|||
|
|
@ -113,6 +113,9 @@ BOOL LLPanelLandAudio::postBuild()
|
|||
mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
|
||||
childSetCommitCallback("group av sound check", onCommitAny, this);
|
||||
|
||||
mCheckObscureMOAP = getChild<LLCheckBoxCtrl>("obscure_moap");
|
||||
childSetCommitCallback("obscure_moap", onCommitAny, this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -210,6 +213,9 @@ void LLPanelLandAudio::refresh()
|
|||
|
||||
mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds()); // On if "Everyone" is on
|
||||
mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds()); // Enabled if "Everyone" is off
|
||||
|
||||
mCheckObscureMOAP->set(parcel->getObscureMOAP());
|
||||
mCheckObscureMOAP->setEnabled(can_change_media);
|
||||
}
|
||||
}
|
||||
// static
|
||||
|
|
@ -240,6 +246,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
group_av_sound = self->mCheckAVSoundGroup->get();
|
||||
}
|
||||
|
||||
bool obscure_moap = self->mCheckObscureMOAP->get();
|
||||
|
||||
// Remove leading/trailing whitespace (common when copying/pasting)
|
||||
LLStringUtil::trim(music_url);
|
||||
|
||||
|
|
@ -261,6 +269,7 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
parcel->setMusicURL(music_url);
|
||||
parcel->setAllowAnyAVSounds(any_av_sound);
|
||||
parcel->setAllowGroupAVSounds(group_av_sound);
|
||||
parcel->setObscureMOAP(obscure_moap);
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ private:
|
|||
// </FS:CR>
|
||||
LLCheckBoxCtrl* mCheckAVSoundAny;
|
||||
LLCheckBoxCtrl* mCheckAVSoundGroup;
|
||||
LLCheckBoxCtrl* mCheckObscureMOAP;
|
||||
|
||||
LLSafeHandle<LLParcelSelection>& mParcel;
|
||||
|
||||
|
|
|
|||
|
|
@ -146,13 +146,11 @@ public:
|
|||
// </FS:Ansariel>
|
||||
|
||||
// open the new pick panel on the Picks floater
|
||||
LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
|
||||
LLSD params;
|
||||
params["open_tab_name"] = "panel_picks";
|
||||
params["show_tab_panel"] = "create_classified";
|
||||
|
||||
LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
|
||||
if (picks)
|
||||
{
|
||||
picks->createNewPick();
|
||||
}
|
||||
LLFloaterSidePanelContainer::showPanel("picks", params);
|
||||
}
|
||||
|
||||
void editPick(LLPickData* pick_info)
|
||||
|
|
@ -271,13 +269,11 @@ public:
|
|||
void createClassified()
|
||||
{
|
||||
// open the new classified panel on the Picks floater
|
||||
LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
|
||||
LLSD params;
|
||||
params["open_tab_name"] = "panel_picks";
|
||||
params["show_tab_panel"] = "create_pick";
|
||||
|
||||
LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
|
||||
if (picks)
|
||||
{
|
||||
picks->createNewClassified();
|
||||
}
|
||||
LLFloaterSidePanelContainer::showPanel("picks", params);
|
||||
}
|
||||
|
||||
void openClassified(LLAvatarClassifiedInfo* c_info)
|
||||
|
|
|
|||
|
|
@ -43,154 +43,11 @@
|
|||
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
|
||||
#endif
|
||||
|
||||
// See EXT-4301.
|
||||
/**
|
||||
* class LLAvalineUpdater - observe the list of voice participants in session and check
|
||||
* presence of Avaline Callers among them.
|
||||
*
|
||||
* LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation:
|
||||
* - whether Avaline caller presence among participants;
|
||||
* - whether watched Avaline caller still exists in voice channel.
|
||||
* Both validations have callbacks which will notify subscriber if any of event occur.
|
||||
*
|
||||
* @see findAvalineCaller()
|
||||
* @see checkIfAvalineCallersExist()
|
||||
*/
|
||||
class LLAvalineUpdater : public LLVoiceClientParticipantObserver
|
||||
{
|
||||
public:
|
||||
typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t;
|
||||
|
||||
LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb)
|
||||
: mAvalineFoundCallback(found_cb)
|
||||
, mAvalineRemovedCallback(removed_cb)
|
||||
{
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
}
|
||||
~LLAvalineUpdater()
|
||||
{
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds UUID of Avaline caller to watch.
|
||||
*
|
||||
* @see checkIfAvalineCallersExist().
|
||||
*/
|
||||
void watchAvalineCaller(const LLUUID& avaline_caller_id)
|
||||
{
|
||||
mAvalineCallers.insert(avaline_caller_id);
|
||||
}
|
||||
|
||||
void onParticipantsChanged()
|
||||
{
|
||||
uuid_set_t participant_uuids;
|
||||
LLVoiceClient::getInstance()->getParticipantList(participant_uuids);
|
||||
|
||||
|
||||
// check whether Avaline caller exists among voice participants
|
||||
// and notify Participant List
|
||||
findAvalineCaller(participant_uuids);
|
||||
|
||||
// check whether watched Avaline callers still present among voice participant
|
||||
// and remove if absents.
|
||||
checkIfAvalineCallersExist(participant_uuids);
|
||||
}
|
||||
|
||||
private:
|
||||
typedef std::set<LLUUID> uuid_set_t;
|
||||
|
||||
/**
|
||||
* Finds Avaline callers among voice participants and calls mAvalineFoundCallback.
|
||||
*
|
||||
* When Avatar is in group call with Avaline caller and then ends call Avaline caller stays
|
||||
* in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again
|
||||
* Avaline caller is added to voice channel AFTER Avatar is connected to group call.
|
||||
* But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information
|
||||
* if a speaker is Avaline caller.
|
||||
*
|
||||
* In this case this speaker is created as avatar and will be recreated when it appears in
|
||||
* Avatar's Voice session.
|
||||
*
|
||||
* @see LLParticipantList::onAvalineCallerFound()
|
||||
*/
|
||||
void findAvalineCaller(const uuid_set_t& participant_uuids)
|
||||
{
|
||||
uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end();
|
||||
|
||||
for(; it != it_end; ++it)
|
||||
{
|
||||
const LLUUID& participant_id = *it;
|
||||
if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id))
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL;
|
||||
|
||||
if (mAvalineFoundCallback)
|
||||
{
|
||||
mAvalineFoundCallback(participant_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback.
|
||||
*
|
||||
* The problem is when Avaline caller ends a call it is removed from Voice Client session but
|
||||
* still exists in LLSpeakerMgr. Server does not send such information.
|
||||
* This method implements a HUCK to notify subscribers that watched Avaline callers by class
|
||||
* are not anymore in the call.
|
||||
*
|
||||
* @see LLParticipantList::onAvalineCallerRemoved()
|
||||
*/
|
||||
void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids)
|
||||
{
|
||||
uuid_set_t::iterator it = mAvalineCallers.begin();
|
||||
uuid_set_t::const_iterator participants_it_end = participant_uuids.end();
|
||||
|
||||
while (it != mAvalineCallers.end())
|
||||
{
|
||||
const LLUUID participant_id = *it;
|
||||
LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL;
|
||||
bool not_found = participant_uuids.find(participant_id) == participants_it_end;
|
||||
if (not_found)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL;
|
||||
|
||||
// notify Participant List
|
||||
if (mAvalineRemovedCallback)
|
||||
{
|
||||
mAvalineRemovedCallback(participant_id);
|
||||
}
|
||||
|
||||
// remove from the watch list
|
||||
mAvalineCallers.erase(it++);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
process_avaline_callback_t mAvalineFoundCallback;
|
||||
process_avaline_callback_t mAvalineRemovedCallback;
|
||||
|
||||
uuid_set_t mAvalineCallers;
|
||||
};
|
||||
|
||||
LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewModelInterface& root_view_model) :
|
||||
LLConversationItemSession(data_source->getSessionID(), root_view_model),
|
||||
mSpeakerMgr(data_source),
|
||||
mValidateSpeakerCallback(NULL)
|
||||
{
|
||||
|
||||
mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1),
|
||||
boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1));
|
||||
|
||||
mSpeakerAddListener = new SpeakerAddListener(*this);
|
||||
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
|
||||
mSpeakerClearListener = new SpeakerClearListener(*this);
|
||||
|
|
@ -250,32 +107,6 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLFolderViewMode
|
|||
|
||||
LLParticipantList::~LLParticipantList()
|
||||
{
|
||||
delete mAvalineUpdater;
|
||||
}
|
||||
|
||||
/*
|
||||
Seems this method is not necessary after onAvalineCallerRemoved was implemented;
|
||||
|
||||
It does nothing because list item is always created with correct class type for Avaline caller.
|
||||
For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client
|
||||
session.
|
||||
This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call.
|
||||
|
||||
Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself.
|
||||
Asked in EXT-4301.
|
||||
*/
|
||||
void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
|
||||
{
|
||||
removeParticipant(participant_id);
|
||||
// re-add avaline caller with a correct class instance.
|
||||
addAvatarIDExceptAgent(participant_id);
|
||||
}
|
||||
|
||||
void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL;
|
||||
|
||||
mSpeakerMgr->removeAvalineSpeaker(participant_id);
|
||||
}
|
||||
|
||||
void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb)
|
||||
|
|
@ -393,7 +224,6 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
|
|||
std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
|
||||
// Create a participant view model instance
|
||||
participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel);
|
||||
mAvalineUpdater->watchAvalineCaller(avatar_id);
|
||||
}
|
||||
|
||||
// *TODO : Need to update the online/offline status of the participant
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
class LLSpeakerMgr;
|
||||
class LLUICtrl;
|
||||
class LLAvalineUpdater;
|
||||
|
||||
class LLParticipantList : public LLConversationItemSession
|
||||
{
|
||||
|
|
@ -135,8 +134,6 @@ protected:
|
|||
};
|
||||
|
||||
private:
|
||||
void onAvalineCallerFound(const LLUUID& participant_id);
|
||||
void onAvalineCallerRemoved(const LLUUID& participant_id);
|
||||
|
||||
/**
|
||||
* Adjusts passed participant to work properly.
|
||||
|
|
@ -158,7 +155,6 @@ private:
|
|||
LLPointer<SpeakerMuteListener> mSpeakerMuteListener;
|
||||
|
||||
validate_speaker_callback_t mValidateSpeakerCallback;
|
||||
LLAvalineUpdater* mAvalineUpdater;
|
||||
};
|
||||
|
||||
#endif // 0
|
||||
|
|
|
|||
|
|
@ -42,14 +42,6 @@ bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)
|
|||
|
||||
if (is_not_group_id)
|
||||
{
|
||||
// For each avaline call the id of caller is different even if
|
||||
// the phone number is the same.
|
||||
// To avoid duplication of avaline list items in the recent list
|
||||
// of panel People, deleting id's with similar phone number.
|
||||
const LLUUID& caller_id = getIDByPhoneNumber(userdata);
|
||||
if (caller_id.notNull())
|
||||
mPeople.erase(caller_id);
|
||||
|
||||
//[] instead of insert to replace existing id->llsd["date"] with new date value
|
||||
mPeople[id] = userdata;
|
||||
mChangedSignal();
|
||||
|
|
@ -90,35 +82,6 @@ const LLSD& LLRecentPeople::getData(const LLUUID& id) const
|
|||
return no_data;
|
||||
}
|
||||
|
||||
bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const
|
||||
{
|
||||
recent_people_t::const_iterator it = mPeople.find(id);
|
||||
|
||||
if (it != mPeople.end())
|
||||
{
|
||||
const LLSD& user = it->second;
|
||||
return user["avaline_call"].asBoolean();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata)
|
||||
{
|
||||
if (!userdata["avaline_call"].asBoolean())
|
||||
return LLUUID::null;
|
||||
|
||||
for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it)
|
||||
{
|
||||
const LLSD& user_info = it->second;
|
||||
|
||||
if (user_info["call_number"].asString() == userdata["call_number"].asString())
|
||||
return it->first;
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -62,9 +62,7 @@ public:
|
|||
* @param id avatar to add.
|
||||
*
|
||||
* @param userdata additional information about last interaction party.
|
||||
* For example when last interaction party is not an avatar
|
||||
* but an avaline caller, additional info (such as phone
|
||||
* number, session id and etc.) should be added.
|
||||
* For example session id can be added.
|
||||
*
|
||||
* @return false if the avatar is in the list already, true otherwise
|
||||
*/
|
||||
|
|
@ -96,13 +94,6 @@ public:
|
|||
*/
|
||||
const LLSD& getData(const LLUUID& id) const;
|
||||
|
||||
/**
|
||||
* Checks whether specific participant is an avaline caller
|
||||
*
|
||||
* @param id identifier of specific participant
|
||||
*/
|
||||
bool isAvalineCaller(const LLUUID& id) const;
|
||||
|
||||
/**
|
||||
* Set callback to be called when the list changed.
|
||||
*
|
||||
|
|
@ -122,8 +113,6 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
|
||||
|
||||
typedef std::map<LLUUID, LLSD> recent_people_t;
|
||||
recent_people_t mPeople;
|
||||
signal_t mChangedSignal;
|
||||
|
|
|
|||
|
|
@ -334,14 +334,29 @@ void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)
|
|||
{
|
||||
struct f : public LLSelectedNodeFunctor
|
||||
{
|
||||
f(bool a, LLSelectMgr* p) : mAvatarOverridesPersist(a), mManager(p) {}
|
||||
bool mAvatarOverridesPersist;
|
||||
LLSelectMgr* mManager;
|
||||
virtual bool apply(LLSelectNode* node)
|
||||
{
|
||||
if (mAvatarOverridesPersist)
|
||||
{
|
||||
LLViewerObject* object = node->getObject();
|
||||
if (object && !object->getParent())
|
||||
{
|
||||
LLVOAvatar* avatar = object->asAvatar();
|
||||
if (avatar)
|
||||
{
|
||||
mManager->mAvatarOverridesMap.emplace(avatar->getID(), AvatarPositionOverride(node->mLastPositionLocal, node->mLastRotation, object));
|
||||
}
|
||||
}
|
||||
}
|
||||
node->mLastPositionLocal.setVec(0, 0, 0);
|
||||
node->mLastRotation = LLQuaternion();
|
||||
node->mLastScale.setVec(0, 0, 0);
|
||||
return true;
|
||||
}
|
||||
} func;
|
||||
} func(mAllowSelectAvatar, this);
|
||||
|
||||
selected_handle->applyToNodes(&func);
|
||||
}
|
||||
|
|
@ -375,6 +390,93 @@ void LLSelectMgr::overrideObjectUpdates()
|
|||
getSelection()->applyToNodes(&func);
|
||||
}
|
||||
|
||||
void LLSelectMgr::resetAvatarOverrides()
|
||||
{
|
||||
mAvatarOverridesMap.clear();
|
||||
}
|
||||
|
||||
void LLSelectMgr::overrideAvatarUpdates()
|
||||
{
|
||||
if (mAvatarOverridesMap.size() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mAllowSelectAvatar || !gFloaterTools)
|
||||
{
|
||||
resetAvatarOverrides();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!gFloaterTools->getVisible() && getSelection()->isEmpty())
|
||||
{
|
||||
// when user switches selection, floater is invisible and selection is empty
|
||||
LLToolset *toolset = LLToolMgr::getInstance()->getCurrentToolset();
|
||||
if (toolset->isShowFloaterTools()
|
||||
&& toolset->isToolSelected(0)) // Pie tool
|
||||
{
|
||||
resetAvatarOverrides();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// remove selected avatars from this list,
|
||||
// but set object overrides to make sure avatar won't snap back
|
||||
struct f : public LLSelectedNodeFunctor
|
||||
{
|
||||
f(LLSelectMgr* p) : mManager(p) {}
|
||||
LLSelectMgr* mManager;
|
||||
virtual bool apply(LLSelectNode* selectNode)
|
||||
{
|
||||
LLViewerObject* object = selectNode->getObject();
|
||||
if (object && !object->getParent())
|
||||
{
|
||||
LLVOAvatar* avatar = object->asAvatar();
|
||||
if (avatar)
|
||||
{
|
||||
uuid_av_override_map_t::iterator iter = mManager->mAvatarOverridesMap.find(avatar->getID());
|
||||
if (iter != mManager->mAvatarOverridesMap.end())
|
||||
{
|
||||
if (selectNode->mLastPositionLocal.isExactlyZero())
|
||||
{
|
||||
selectNode->mLastPositionLocal = iter->second.mLastPositionLocal;
|
||||
}
|
||||
if (selectNode->mLastRotation == LLQuaternion())
|
||||
{
|
||||
selectNode->mLastRotation = iter->second.mLastRotation;
|
||||
}
|
||||
mManager->mAvatarOverridesMap.erase(iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} func(this);
|
||||
getSelection()->applyToNodes(&func);
|
||||
|
||||
// Override avatar positions
|
||||
uuid_av_override_map_t::iterator it = mAvatarOverridesMap.begin();
|
||||
while (it != mAvatarOverridesMap.end())
|
||||
{
|
||||
if (it->second.mObject->isDead())
|
||||
{
|
||||
it = mAvatarOverridesMap.erase(it);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!it->second.mLastPositionLocal.isExactlyZero())
|
||||
{
|
||||
it->second.mObject->setPosition(it->second.mLastPositionLocal);
|
||||
}
|
||||
if (it->second.mLastRotation != LLQuaternion())
|
||||
{
|
||||
it->second.mObject->setRotation(it->second.mLastRotation);
|
||||
}
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Select just the object, not any other group members.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -958,7 +1060,7 @@ void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to
|
|||
|
||||
// Can't select yourself
|
||||
if (objectp->mID == gAgentID
|
||||
&& !LLSelectMgr::getInstance()->mAllowSelectAvatar)
|
||||
&& !mAllowSelectAvatar)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
@ -6491,6 +6593,24 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
|
|||
|
||||
LLSelectNode::~LLSelectNode()
|
||||
{
|
||||
LLSelectMgr *manager = LLSelectMgr::getInstance();
|
||||
if (manager->mAllowSelectAvatar
|
||||
&& (!mLastPositionLocal.isExactlyZero()
|
||||
|| mLastRotation != LLQuaternion()))
|
||||
{
|
||||
LLViewerObject* object = getObject(); //isDead() check
|
||||
if (object && !object->getParent())
|
||||
{
|
||||
LLVOAvatar* avatar = object->asAvatar();
|
||||
if (avatar)
|
||||
{
|
||||
// Avatar was moved and needs to stay that way
|
||||
manager->mAvatarOverridesMap.emplace(avatar->getID(), LLSelectMgr::AvatarPositionOverride(mLastPositionLocal, mLastRotation, object));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
delete mPermissions;
|
||||
mPermissions = NULL;
|
||||
}
|
||||
|
|
@ -7009,6 +7129,10 @@ void LLSelectMgr::updateSelectionCenter()
|
|||
const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection
|
||||
// center (tractor beam)
|
||||
|
||||
// override any avatar updates received
|
||||
// Works only if avatar was repositioned
|
||||
// and edit floater is visible
|
||||
overrideAvatarUpdates();
|
||||
//override any object updates received
|
||||
//for selected objects
|
||||
overrideObjectUpdates();
|
||||
|
|
|
|||
|
|
@ -535,6 +535,30 @@ public:
|
|||
void resetObjectOverrides(LLObjectSelectionHandle selected_handle);
|
||||
void overrideObjectUpdates();
|
||||
|
||||
void resetAvatarOverrides();
|
||||
void overrideAvatarUpdates();
|
||||
|
||||
struct AvatarPositionOverride
|
||||
{
|
||||
AvatarPositionOverride();
|
||||
AvatarPositionOverride(LLVector3 &vec, LLQuaternion &quat, LLViewerObject *obj) :
|
||||
mLastPositionLocal(vec),
|
||||
mLastRotation(quat),
|
||||
mObject(obj)
|
||||
{
|
||||
}
|
||||
LLVector3 mLastPositionLocal;
|
||||
LLQuaternion mLastRotation;
|
||||
LLPointer<LLViewerObject> mObject;
|
||||
};
|
||||
|
||||
// Avatar overrides should persist even after selection
|
||||
// was removed as long as edit floater is up
|
||||
typedef std::map<LLUUID, AvatarPositionOverride> uuid_av_override_map_t;
|
||||
uuid_av_override_map_t mAvatarOverridesMap;
|
||||
public:
|
||||
|
||||
|
||||
// Returns the previous value of mForceSelection
|
||||
BOOL setForceSelection(BOOL force);
|
||||
|
||||
|
|
|
|||
|
|
@ -540,7 +540,7 @@ void LLSpeakerMgr::updateSpeakerList()
|
|||
}
|
||||
else if (mSpeakers.size() == 0)
|
||||
{
|
||||
// For all other session type (ad-hoc, P2P, avaline), we use the initial participants targets list
|
||||
// For all other session type (ad-hoc, P2P), we use the initial participants targets list
|
||||
for (uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();it!=session->mInitialTargetIDs.end();++it)
|
||||
{
|
||||
// Add buddies if they are on line, add any other avatar.
|
||||
|
|
|
|||
|
|
@ -244,14 +244,6 @@ public:
|
|||
const LLUUID getSessionID();
|
||||
bool isSpeakerToBeRemoved(const LLUUID& speaker_id);
|
||||
|
||||
/**
|
||||
* Removes avaline speaker.
|
||||
*
|
||||
* This is a HACK due to server does not send information that Avaline caller ends call.
|
||||
* It can be removed when server is updated. See EXT-4301 for details
|
||||
*/
|
||||
bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); }
|
||||
|
||||
/**
|
||||
* Initializes mVoiceModerated depend on LLSpeaker::mModeratorMutedVoice of agent's participant.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -297,6 +297,7 @@ static bool mLoginStatePastUI = false;
|
|||
static bool mBenefitsSuccessfullyInit = false;
|
||||
|
||||
const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds
|
||||
const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; // Give region 3 chances
|
||||
|
||||
boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
|
||||
boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
|
||||
|
|
@ -2019,10 +2020,21 @@ bool idle_startup()
|
|||
{
|
||||
LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
|
||||
}
|
||||
else if (regionp->capabilitiesError())
|
||||
{
|
||||
// Try to connect despite capabilities' error state
|
||||
LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
|
||||
}
|
||||
else
|
||||
{
|
||||
U32 num_retries = regionp->getNumSeedCapRetries();
|
||||
if (num_retries > 0)
|
||||
if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN)
|
||||
{
|
||||
// Region will keep trying to get capabilities,
|
||||
// but for now continue as if caps were granted
|
||||
LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
|
||||
}
|
||||
else if (num_retries > 0)
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NUMBER]"] = llformat("%d", num_retries + 1);
|
||||
|
|
|
|||
|
|
@ -704,9 +704,6 @@ void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
|
|||
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!session) return;
|
||||
|
||||
// no need to spawn chiclets for participants in P2P calls called through Avaline
|
||||
if (session->isP2P() && session->isOtherParticipantAvaline()) return;
|
||||
|
||||
if (mMessageList->getItemByValue(session_id)) return;
|
||||
|
||||
addIMRow(session_id, 0, name, other_participant_id);
|
||||
|
|
|
|||
|
|
@ -867,7 +867,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
|
|||
glh::matrix4f proj = get_current_projection();
|
||||
glh::matrix4f mod = get_current_modelview();
|
||||
glViewport(0,0,512,512);
|
||||
LLVOAvatar::updateFreezeCounter() ;
|
||||
|
||||
LLVOAvatar::updateImpostors();
|
||||
|
||||
|
|
|
|||
|
|
@ -2529,11 +2529,19 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
needs_refresh = needs_refresh || child->mUserSelected;
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> allow_select_avatar(gSavedSettings, "AllowSelectAvatar", FALSE);
|
||||
if (needs_refresh)
|
||||
{
|
||||
LLSelectMgr::getInstance()->updateSelectionCenter();
|
||||
dialog_refresh_all();
|
||||
}
|
||||
}
|
||||
else if (allow_select_avatar && asAvatar())
|
||||
{
|
||||
// Override any avatar position updates received
|
||||
// Works only if avatar was repositioned using build
|
||||
// tools and build floater is visible
|
||||
LLSelectMgr::getInstance()->overrideAvatarUpdates();
|
||||
}
|
||||
|
||||
|
||||
// Mark update time as approx. now, with the ping delay.
|
||||
|
|
|
|||
|
|
@ -1611,6 +1611,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
BOOL region_allow_environment_override = true;
|
||||
S32 parcel_environment_version = 0;
|
||||
BOOL agent_parcel_update = false; // updating previous(existing) agent parcel
|
||||
U32 extended_flags = 0; //obscure MOAP
|
||||
|
||||
S32 other_clean_time = 0;
|
||||
|
||||
|
|
@ -1715,6 +1716,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
msg->getBOOLFast(_PREHASH_RegionAllowAccessBlock, _PREHASH_RegionAllowAccessOverride, region_allow_access_override);
|
||||
}
|
||||
|
||||
if (msg->getNumberOfBlocks(_PREHASH_ParcelExtendedFlags))
|
||||
{
|
||||
msg->getU32Fast(_PREHASH_ParcelExtendedFlags, _PREHASH_Flags, extended_flags);
|
||||
}
|
||||
|
||||
if (msg->getNumberOfBlocks(_PREHASH_ParcelEnvironmentBlock))
|
||||
{
|
||||
msg->getS32Fast(_PREHASH_ParcelEnvironmentBlock, _PREHASH_ParcelEnvironmentVersion, parcel_environment_version);
|
||||
|
|
@ -1771,6 +1777,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
parcel->setParcelEnvironmentVersion(cur_parcel_environment_version);
|
||||
parcel->setRegionAllowEnvironmentOverride(region_allow_environment_override);
|
||||
|
||||
parcel->setObscureMOAP((bool)extended_flags);
|
||||
|
||||
parcel->unpackMessage(msg);
|
||||
|
||||
if (parcel == parcel_mgr.mAgentParcel)
|
||||
|
|
|
|||
|
|
@ -102,8 +102,6 @@
|
|||
|
||||
// The server only keeps our pending agent info for 60 seconds.
|
||||
// We want to allow for seed cap retry, but its not useful after that 60 seconds.
|
||||
// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up.
|
||||
const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;
|
||||
// Even though we gave up on login, keep trying for caps after we are logged in:
|
||||
const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
|
||||
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
|
||||
|
|
@ -185,7 +183,6 @@ public:
|
|||
mCompositionp(NULL),
|
||||
mEventPoll(NULL),
|
||||
mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS),
|
||||
mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),
|
||||
mSeedCapAttempts(0),
|
||||
mHttpResponderID(0),
|
||||
mLastCameraUpdate(0),
|
||||
|
|
@ -238,7 +235,6 @@ public:
|
|||
LLEventPoll* mEventPoll;
|
||||
|
||||
S32 mSeedCapMaxAttempts;
|
||||
S32 mSeedCapMaxAttemptsBeforeLogin;
|
||||
S32 mSeedCapAttempts;
|
||||
|
||||
S32 mHttpResponderID;
|
||||
|
|
@ -286,23 +282,17 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
|
|||
if (url.empty())
|
||||
{
|
||||
LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL;
|
||||
regionp->setCapabilitiesError();
|
||||
return; // this error condition is not recoverable.
|
||||
}
|
||||
|
||||
// record that we just entered a new region
|
||||
newRegionEntry(*regionp);
|
||||
|
||||
// After a few attempts, continue login. But keep trying to get the caps:
|
||||
if (mSeedCapAttempts >= mSeedCapMaxAttemptsBeforeLogin &&
|
||||
STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
|
||||
{
|
||||
LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
|
||||
}
|
||||
|
||||
if (mSeedCapAttempts > mSeedCapMaxAttempts)
|
||||
{
|
||||
// *TODO: Give a user pop-up about this error?
|
||||
LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities from '" << url << "' after " << mSeedCapAttempts << " attempts. Giving up!" << LL_ENDL;
|
||||
regionp->setCapabilitiesError();
|
||||
return; // this error condition is not recoverable.
|
||||
}
|
||||
|
||||
|
|
@ -388,11 +378,6 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
|
|||
<< " region name " << regionp->getName() << LL_ENDL;
|
||||
regionp->setCapabilitiesReceived(true);
|
||||
|
||||
if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
|
||||
{
|
||||
LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
while (true);
|
||||
|
|
@ -430,6 +415,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)
|
|||
if (url.empty())
|
||||
{
|
||||
LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL;
|
||||
if (regionp->getCapability("Seed").empty())
|
||||
{
|
||||
// initial attempt failed to get this cap as well
|
||||
regionp->setCapabilitiesError();
|
||||
}
|
||||
break; // this error condition is not recoverable.
|
||||
}
|
||||
|
||||
|
|
@ -613,7 +603,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
|
|||
mCacheLoaded(FALSE),
|
||||
mCacheDirty(FALSE),
|
||||
mReleaseNotesRequested(FALSE),
|
||||
mCapabilitiesReceived(false),
|
||||
mCapabilitiesState(CAPABILITIES_STATE_INIT),
|
||||
mSimulatorFeaturesReceived(false),
|
||||
mBitsReceived(0.f),
|
||||
mPacketsReceived(0.f),
|
||||
|
|
@ -3433,12 +3423,17 @@ bool LLViewerRegion::isCapabilityAvailable(const std::string& name) const
|
|||
|
||||
bool LLViewerRegion::capabilitiesReceived() const
|
||||
{
|
||||
return mCapabilitiesReceived;
|
||||
return mCapabilitiesState == CAPABILITIES_STATE_RECEIVED;
|
||||
}
|
||||
|
||||
bool LLViewerRegion::capabilitiesError() const
|
||||
{
|
||||
return mCapabilitiesState == CAPABILITIES_STATE_ERROR;
|
||||
}
|
||||
|
||||
void LLViewerRegion::setCapabilitiesReceived(bool received)
|
||||
{
|
||||
mCapabilitiesReceived = received;
|
||||
mCapabilitiesState = received ? CAPABILITIES_STATE_RECEIVED : CAPABILITIES_STATE_INIT;
|
||||
|
||||
// Tell interested parties that we've received capabilities,
|
||||
// so that they can safely use getCapability().
|
||||
|
|
@ -3453,6 +3448,11 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
|
|||
}
|
||||
}
|
||||
|
||||
void LLViewerRegion::setCapabilitiesError()
|
||||
{
|
||||
mCapabilitiesState = CAPABILITIES_STATE_ERROR;
|
||||
}
|
||||
|
||||
boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)
|
||||
{
|
||||
return mCapabilitiesReceivedSignal.connect(cb);
|
||||
|
|
|
|||
|
|
@ -284,7 +284,9 @@ public:
|
|||
|
||||
// has region received its final (not seed) capability list?
|
||||
bool capabilitiesReceived() const;
|
||||
bool capabilitiesError() const;
|
||||
void setCapabilitiesReceived(bool received);
|
||||
void setCapabilitiesError();
|
||||
boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);
|
||||
|
||||
static bool isSpecialCapabilityName(const std::string &name);
|
||||
|
|
@ -561,12 +563,20 @@ private:
|
|||
BOOL mCacheLoaded;
|
||||
BOOL mCacheDirty;
|
||||
BOOL mAlive; // can become false if circuit disconnects
|
||||
BOOL mCapabilitiesReceived;
|
||||
BOOL mSimulatorFeaturesReceived;
|
||||
BOOL mReleaseNotesRequested;
|
||||
BOOL mDead; //if true, this region is in the process of deleting.
|
||||
BOOL mPaused; //pause processing the objects in the region
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CAPABILITIES_STATE_INIT = 0,
|
||||
CAPABILITIES_STATE_ERROR,
|
||||
CAPABILITIES_STATE_RECEIVED
|
||||
} eCababilitiesState;
|
||||
|
||||
eCababilitiesState mCapabilitiesState;
|
||||
|
||||
typedef std::map<U32, std::vector<U32> > orphan_list_t;
|
||||
orphan_list_t mOrphanMap;
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
#include "sound_ids.h"
|
||||
#include "raytrace.h"
|
||||
|
||||
#include "aoengine.h" // ## Zi: Animation Overrider
|
||||
#include "aoengine.h" // <FS:Zi> Animation Overrider
|
||||
#include "llagent.h" // Get state values from here
|
||||
#include "llagentbenefits.h"
|
||||
#include "llagentcamera.h"
|
||||
|
|
@ -596,7 +596,6 @@ private:
|
|||
//-----------------------------------------------------------------------------
|
||||
// Static Data
|
||||
//-----------------------------------------------------------------------------
|
||||
S32 LLVOAvatar::sFreezeCounter = 0;
|
||||
U32 LLVOAvatar::sMaxNonImpostors = 12; // Set from RenderAvatarMaxNonImpostors
|
||||
bool LLVOAvatar::sLimitNonImpostors = false; // True unless RenderAvatarMaxNonImpostors is 0 (unlimited)
|
||||
F32 LLVOAvatar::sRenderDistance = 256.f;
|
||||
|
|
@ -4708,8 +4707,7 @@ void LLVOAvatar::computeUpdatePeriod()
|
|||
&& (!isSelf() || visually_muted)
|
||||
&& !isUIAvatar()
|
||||
&& (sLimitNonImpostors || visually_muted || slow) // <FS:Beq/> imposter slow avatars irrespective of nonimposter setting.
|
||||
&& !mNeedsAnimUpdate
|
||||
&& !sFreezeCounter)
|
||||
&& !mNeedsAnimUpdate)
|
||||
{
|
||||
const LLVector4a* ext = mDrawable->getSpatialExtents();
|
||||
LLVector4a size;
|
||||
|
|
@ -11269,23 +11267,6 @@ LLHost LLVOAvatar::getObjectHost() const
|
|||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLVOAvatar::updateFreezeCounter(S32 counter)
|
||||
{
|
||||
if(counter)
|
||||
{
|
||||
sFreezeCounter = counter;
|
||||
}
|
||||
else if(sFreezeCounter > 0)
|
||||
{
|
||||
sFreezeCounter--;
|
||||
}
|
||||
else
|
||||
{
|
||||
sFreezeCounter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLVOAvatar::updateLOD()
|
||||
{
|
||||
if (mDrawable.isNull())
|
||||
|
|
|
|||
|
|
@ -667,14 +667,6 @@ public:
|
|||
private:
|
||||
BOOL mCulled;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Freeze counter
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
static void updateFreezeCounter(S32 counter = 0);
|
||||
private:
|
||||
static S32 sFreezeCounter;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Constants
|
||||
//--------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -770,8 +770,6 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
|
|||
mReceivedCall(FALSE)
|
||||
{
|
||||
// make sure URI reflects encoded version of other user's agent id
|
||||
// *NOTE: in case of Avaline call generated SIP URL will be incorrect.
|
||||
// But it will be overridden in LLVoiceChannelP2P::setSessionHandle() called when agent accepts call
|
||||
setURI(LLVoiceClient::getInstance()->sipURIFromID(other_user_id));
|
||||
}
|
||||
|
||||
|
|
@ -911,8 +909,6 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
|
|||
else
|
||||
{
|
||||
LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL;
|
||||
// In the case of an incoming AvaLine call, the generated URI will be different from the
|
||||
// original one. This is because the P2P URI is based on avatar UUID but Avaline is not.
|
||||
// See LLVoiceClient::sessionAddedEvent()
|
||||
setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));
|
||||
}
|
||||
|
|
@ -947,22 +943,5 @@ void LLVoiceChannelP2P::setState(EState state)
|
|||
|
||||
void LLVoiceChannelP2P::addToTheRecentPeopleList()
|
||||
{
|
||||
bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType();
|
||||
|
||||
if (avaline_call)
|
||||
{
|
||||
LLSD call_data;
|
||||
std::string call_number = LLVoiceChannel::getSessionName();
|
||||
|
||||
call_data["avaline_call"] = true;
|
||||
call_data["session_id"] = mSessionID;
|
||||
call_data["call_number"] = call_number;
|
||||
call_data["date"] = LLDate::now();
|
||||
|
||||
LLRecentPeople::instance().add(mOtherUserID, call_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLRecentPeople::instance().add(mOtherUserID);
|
||||
}
|
||||
LLRecentPeople::instance().add(mOtherUserID);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,6 +210,7 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
|
|||
LLVoiceVersionInfo result;
|
||||
result.serverVersion = std::string();
|
||||
result.serverType = std::string();
|
||||
result.mBuildVersion = std::string();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ struct LLVoiceVersionInfo
|
|||
{
|
||||
std::string serverType;
|
||||
std::string serverVersion;
|
||||
std::string mBuildVersion;
|
||||
};
|
||||
|
||||
//////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -4691,6 +4691,23 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id)
|
||||
{
|
||||
// We don't generally need to process this. However, one occurence is when we first connect, and so it is the
|
||||
// earliest opportunity to learn what we're connected to.
|
||||
if (statusCode)
|
||||
{
|
||||
LL_WARNS("Voice") << "VoiceServiceConnectionStateChangedEvent statusCode: " << statusCode <<
|
||||
"statusString: " << statusString << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
if (build_id.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
mVoiceVersion.mBuildVersion = build_id;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
|
||||
{
|
||||
LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL;
|
||||
|
|
@ -7693,6 +7710,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
|
|||
connectorHandle = string;
|
||||
else if (!stricmp("VersionID", tag))
|
||||
versionID = string;
|
||||
else if (!stricmp("Version", tag))
|
||||
mBuildID = string;
|
||||
else if (!stricmp("AccountHandle", tag))
|
||||
accountHandle = string;
|
||||
else if (!stricmp("State", tag))
|
||||
|
|
@ -7995,7 +8014,8 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
|
|||
// We don't need to process this, but we also shouldn't warn on it, since that confuses people.
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent"))
|
||||
{ // Yet another ignored event
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->voiceServiceConnectionStateChangedEvent(statusCode, statusString, mBuildID);
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "AudioDeviceHotSwapEvent"))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -475,6 +475,7 @@ protected:
|
|||
void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);
|
||||
void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
|
||||
void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
|
||||
void voiceServiceConnectionStateChangedEvent(int statusCode, std::string &statusString, std::string &build_id);
|
||||
void auxAudioPropertiesEvent(F32 energy);
|
||||
void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
|
||||
void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string ¬ificationType);
|
||||
|
|
@ -982,6 +983,7 @@ protected:
|
|||
std::string actionString;
|
||||
std::string connectorHandle;
|
||||
std::string versionID;
|
||||
std::string mBuildID;
|
||||
std::string accountHandle;
|
||||
std::string sessionHandle;
|
||||
std::string sessionGroupHandle;
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#include "httpoptions.h"
|
||||
#include "httpheaders.h"
|
||||
#include "bufferarray.h"
|
||||
#include "llversioninfo.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
// Have to include these last to avoid queue redefinition!
|
||||
|
|
@ -393,6 +394,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
|
|||
|
||||
httpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_TEXT_XML);
|
||||
|
||||
std::string user_agent = llformat("%s %d.%d.%d (%d)",
|
||||
LLVersionInfo::instance().getChannel().c_str(),
|
||||
LLVersionInfo::instance().getMajor(),
|
||||
LLVersionInfo::instance().getMinor(),
|
||||
LLVersionInfo::instance().getPatch(),
|
||||
LLVersionInfo::instance().getBuild());
|
||||
|
||||
httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
|
||||
|
||||
///* Setting the DNS cache timeout to -1 disables it completely.
|
||||
//This might help with bug #503 */
|
||||
//httpOpts->setDNSCacheTimeout(-1);
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 KiB |
|
|
@ -68,8 +68,6 @@ with the same filename but different name
|
|||
<texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
|
||||
<texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
|
||||
|
||||
<texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" />
|
||||
|
||||
<texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
|
||||
|
||||
<texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
|
||||
|
|
|
|||
|
|
@ -442,9 +442,6 @@ Prøv venligst om lidt igen.
|
|||
<string name="GroupNameNone">
|
||||
(ingen)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline opkalder [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Ingen fejl
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -831,9 +831,6 @@ nächsten Eigentümer angehängt werden.
|
|||
<string name="GroupNameNone">
|
||||
(keiner)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline-Anfrufer [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Kein Fehler
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -2001,6 +2001,28 @@ Only large parcels can be listed in search.
|
|||
left="110"
|
||||
name="parcel_enable_voice_channel_local"
|
||||
width="300" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
mouse_opaque="false"
|
||||
name="media"
|
||||
top_pad="10"
|
||||
width="100">
|
||||
Media:
|
||||
</text>
|
||||
<check_box
|
||||
height="16"
|
||||
label="Obscure MOAP"
|
||||
layout="topleft"
|
||||
left="110"
|
||||
left_pad="0"
|
||||
name="obscure_moap"
|
||||
tool_tip="Media on a prim located outside the parcel should not play automatically for an agent within this parcel and vice versa."
|
||||
width="300" />
|
||||
</panel>
|
||||
<panel
|
||||
border="true"
|
||||
|
|
|
|||
|
|
@ -143,15 +143,6 @@
|
|||
name="speakers_list"
|
||||
show_voice_volume="true"
|
||||
width="280" />
|
||||
<panel
|
||||
filename="panel_avatar_list_item.xml"
|
||||
follows="left|right|top"
|
||||
height="24"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="non_avatar_caller"
|
||||
top="10"
|
||||
width="276" />
|
||||
<text
|
||||
follows="all"
|
||||
font="SansSerif"
|
||||
|
|
|
|||
|
|
@ -412,8 +412,6 @@ can be attached to notecards.
|
|||
<!-- Group name: text shown for LLUUID::null -->
|
||||
<string name="GroupNameNone">(none)</string>
|
||||
|
||||
<string name="AvalineCaller">Avaline Caller [ORDER]</string>
|
||||
|
||||
<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
|
||||
<string name="AssetErrorNone">No error</string>
|
||||
<string name="AssetErrorRequestFailed">Asset request: failed</string>
|
||||
|
|
|
|||
|
|
@ -686,9 +686,6 @@ pueden adjuntarse a las notas.
|
|||
<string name="GroupNameNone">
|
||||
(ninguno)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline: [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
No hay ningún error
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -655,9 +655,6 @@ peuvent être joints aux notes.
|
|||
<string name="GroupNameNone">
|
||||
(aucun)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Appelant Avaline [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Aucune erreur
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -769,9 +769,6 @@ Provare ad accedere nuovamente tra un minuto.
|
|||
<string name="GroupNameNone">
|
||||
(nessuno)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Chiamante Avaline [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Nessun errore
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -633,9 +633,6 @@ support@secondlife.com にお問い合わせください。
|
|||
<string name="GroupNameNone">
|
||||
(なし)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline コール [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
エラーなし
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -761,9 +761,6 @@ mogą być dołączane do notek.
|
|||
<string name="GroupNameNone">
|
||||
(brak danych)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Brak błędu
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -608,9 +608,6 @@ ser anexado às anotações."
|
|||
<string name="GroupNameNone">
|
||||
(nenhum)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Interlocutor Avaline [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Nenhum erro
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -801,9 +801,6 @@ support@secondlife.com.
|
|||
<string name="GroupNameNone">
|
||||
(нет)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline Caller [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Ошибок нет
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -665,9 +665,6 @@ kartlarına eklenebilir.
|
|||
<string name="GroupNameNone">
|
||||
(hiçbiri)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline Arayanı [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
Hata yok
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -648,9 +648,6 @@ http://secondlife.com/viewer-access-faq
|
|||
<string name="GroupNameNone">
|
||||
(無)
|
||||
</string>
|
||||
<string name="AvalineCaller">
|
||||
Avaline 通話者 [ORDER]
|
||||
</string>
|
||||
<string name="AssetErrorNone">
|
||||
無錯誤
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -1954,6 +1954,28 @@ Only large parcels can be listed in search.
|
|||
left="110"
|
||||
name="parcel_enable_voice_channel_local"
|
||||
width="300" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
mouse_opaque="false"
|
||||
name="media"
|
||||
top_pad="10"
|
||||
width="100">
|
||||
Media:
|
||||
</text>
|
||||
<check_box
|
||||
height="16"
|
||||
label="Obscure MOAP"
|
||||
layout="topleft"
|
||||
left="110"
|
||||
left_pad="0"
|
||||
name="obscure_moap"
|
||||
tool_tip="Media on a prim located outside the parcel should not play automatically for an agent within this parcel and vice versa."
|
||||
width="300" />
|
||||
</panel>
|
||||
<panel
|
||||
border="true"
|
||||
|
|
|
|||
|
|
@ -1955,6 +1955,28 @@ Only large parcels can be listed in search.
|
|||
left="110"
|
||||
name="parcel_enable_voice_channel_local"
|
||||
width="300" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
mouse_opaque="false"
|
||||
name="media"
|
||||
top_pad="10"
|
||||
width="100">
|
||||
Media:
|
||||
</text>
|
||||
<check_box
|
||||
height="16"
|
||||
label="Obscure MOAP"
|
||||
layout="topleft"
|
||||
left="110"
|
||||
left_pad="0"
|
||||
name="obscure_moap"
|
||||
tool_tip="Media on a prim located outside the parcel should not play automatically for an agent within this parcel and vice versa."
|
||||
width="300" />
|
||||
</panel>
|
||||
<panel
|
||||
border="true"
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
|||
# include the entire textures directory recursively
|
||||
with self.prefix(src_dst="*/textures"):
|
||||
self.path("*/*.tga") # <FS:Ansariel> Needed for legacy icons
|
||||
self.path("*/*.jpg")
|
||||
self.path("*/*.jpg") # <FS:Ansariel> Needed for skin previews
|
||||
self.path("*/*.png")
|
||||
self.path("*.tga")
|
||||
self.path("*.j2c")
|
||||
|
|
|
|||
Loading…
Reference in New Issue