Merge branch 'DRTVWR-544-maint' of https://bitbucket.org/lindenlab/viewer

master
Ansariel 2022-01-11 15:04:11 +01:00
commit f46a15b3f3
76 changed files with 523 additions and 976 deletions

View File

@ -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>

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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();
}

View File

@ -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;

View File

@ -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");

View File

@ -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;

View File

@ -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);
}

View File

@ -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)

View File

@ -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.
*

View File

@ -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")
{

View File

@ -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]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;sid=[SESSION_ID]</string>
<string>https://search.[GRID]/?query_term=[QUERY]&amp;search_type=[TYPE][COLLECTION]&amp;maturity=[MATURITY]&amp;p=[AUTH_TOKEN]&amp;lang=[LANGUAGE]&amp;sid=[SESSION_ID]</string>
<key>Backup</key>
<integer>0</integer>
<!-- LL, possibly privacy leaking search string
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
<string>https://search.[GRID]/?query_term=[QUERY]&amp;search_type=[TYPE][COLLECTION]&amp;maturity=[MATURITY]&amp;p=[AUTH_TOKEN]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;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>

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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();
}

View File

@ -122,6 +122,7 @@ public:
static U32 getTextureCacheVersion() ;
static U32 getObjectCacheVersion() ;
static U32 getDiskCacheVersion() ;
const std::string& getSerialNumber() { return mSerialNumber; }

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;
};

View File

@ -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>
}

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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()

View File

@ -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 );

View File

@ -68,6 +68,7 @@ private:
// </FS:CR>
LLCheckBoxCtrl* mCheckAVSoundAny;
LLCheckBoxCtrl* mCheckAVSoundGroup;
LLCheckBoxCtrl* mCheckObscureMOAP;
LLSafeHandle<LLParcelSelection>& mParcel;

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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.

View File

@ -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.
*

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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.

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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())

View File

@ -667,14 +667,6 @@ public:
private:
BOOL mCulled;
//--------------------------------------------------------------------
// Freeze counter
//--------------------------------------------------------------------
public:
static void updateFreezeCounter(S32 counter = 0);
private:
static S32 sFreezeCounter;
//--------------------------------------------------------------------
// Constants
//--------------------------------------------------------------------

View File

@ -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);
}

View File

@ -210,6 +210,7 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
LLVoiceVersionInfo result;
result.serverVersion = std::string();
result.serverType = std::string();
result.mBuildVersion = std::string();
return result;
}
}

View File

@ -98,6 +98,7 @@ struct LLVoiceVersionInfo
{
std::string serverType;
std::string serverVersion;
std::string mBuildVersion;
};
//////////////////////////////////

View File

@ -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"))
{

View File

@ -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 &notificationType);
@ -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;

View File

@ -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

View File

@ -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" />

View File

@ -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>

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -633,9 +633,6 @@ support@secondlife.com にお問い合わせください。
<string name="GroupNameNone">
(なし)
</string>
<string name="AvalineCaller">
Avaline コール [ORDER]
</string>
<string name="AssetErrorNone">
エラーなし
</string>

View File

@ -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>

View File

@ -608,9 +608,6 @@ ser anexado às anotações.&quot;
<string name="GroupNameNone">
(nenhum)
</string>
<string name="AvalineCaller">
Interlocutor Avaline [ORDER]
</string>
<string name="AssetErrorNone">
Nenhum erro
</string>

View File

@ -801,9 +801,6 @@ support@secondlife.com.
<string name="GroupNameNone">
(нет)
</string>
<string name="AvalineCaller">
Avaline Caller [ORDER]
</string>
<string name="AssetErrorNone">
Ошибок нет
</string>

View File

@ -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>

View File

@ -648,9 +648,6 @@ http://secondlife.com/viewer-access-faq
<string name="GroupNameNone">
(無)
</string>
<string name="AvalineCaller">
Avaline 通話者 [ORDER]
</string>
<string name="AssetErrorNone">
無錯誤
</string>

View File

@ -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"

View File

@ -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"

View File

@ -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")