Pull merge from lindenlab/viewer-release
commit
74e3fb7b33
1
.hgtags
1
.hgtags
|
|
@ -462,3 +462,4 @@ fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
|
|||
69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
|
||||
0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
|
||||
75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
|
||||
f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
|
||||
|
|
|
|||
|
|
@ -522,9 +522,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>91752db72202807cffb33c1ec3fd90fc</string>
|
||||
<string>91752db72202807cffb33c1ec3fd90fc</string>
|
||||
<key>url</key>
|
||||
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
|
||||
<string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -761,9 +761,9 @@
|
|||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>aff5566e04003de0383941981198e04e</string>
|
||||
<key>url</key>
|
||||
<key>hash</key>
|
||||
<string>aff5566e04003de0383941981198e04e</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/Darwin/installer/google_breakpad-0.0.0-rev1099-darwin-20130329.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
@ -773,9 +773,9 @@
|
|||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>52257e5eb166a0b69c9c0c38f6e1920e</string>
|
||||
<key>url</key>
|
||||
<key>hash</key>
|
||||
<string>52257e5eb166a0b69c9c0c38f6e1920e</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273079/arch/Linux/installer/google_breakpad-0.0.0-rev1099-linux-20130329.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
@ -786,7 +786,7 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d812a6dfcabe6528198a3191068dac09</string>
|
||||
<string>d812a6dfcabe6528198a3191068dac09</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/CYGWIN/installer/google_breakpad-0.0.0-rev1099-windows-20130329.tar.bz2</string>
|
||||
</map>
|
||||
|
|
@ -879,42 +879,6 @@
|
|||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>gperftools</key>
|
||||
<map>
|
||||
<key>license</key>
|
||||
<string>bsd</string>
|
||||
<key>license_file</key>
|
||||
<string>LICENSES/gperftools.txt</string>
|
||||
<key>name</key>
|
||||
<string>gperftools</string>
|
||||
<key>platforms</key>
|
||||
<map>
|
||||
<key>linux</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8aedfdcf670348c18a9991ae1b384a61</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
</map>
|
||||
<key>windows</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>f62841804acb91e1309603a84f3f0ce8</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>gstreamer</key>
|
||||
<map>
|
||||
<key>license</key>
|
||||
|
|
@ -1844,9 +1808,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>24e735ae005f3ce7a21a09cc02cece17</string>
|
||||
<string>2994f1e028fb200c454c12b5f7ca9108</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Darwin/installer/slvoice-3.2.0002.10426-darwin-20110601.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/Darwin/installer/slvoice-4.5.0009.17865-darwin-20130215.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
|
|
@ -1856,9 +1820,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8a0bc982367d6fdc20a28b391cd40566</string>
|
||||
<string>957773fff7148ffaca42b1ea4a18d192</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Linux/installer/slvoice-3.2.0002.10426-linux-20110601.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270512/arch/Linux/installer/slvoice-4.5.0009.17865-linux-20130216.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
|
|
@ -1868,9 +1832,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>1e821cc7d25eabad013b7f3db260dd6b</string>
|
||||
<string>24710eda136bfd42d6333e5609c2c74f</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/CYGWIN/installer/slvoice-3.2.0002.10426-windows-20110601.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/CYGWIN/installer/slvoice-4.5.0009.17865-windows-20130214.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2567,7 +2531,7 @@
|
|||
<string>"Visual Studio 10"</string>
|
||||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
</array>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>DebugOS</string>
|
||||
|
|
@ -2655,7 +2619,7 @@
|
|||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
</array>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>RelWithDebInfoOS</string>
|
||||
|
|
@ -2742,7 +2706,7 @@
|
|||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
</array>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>ReleaseOS</string>
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ if(WINDOWS)
|
|||
set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
|
||||
set(vivox_files
|
||||
SLVoice.exe
|
||||
ca-bundle.crt
|
||||
libsndfile-1.dll
|
||||
vivoxplatform.dll
|
||||
vivoxsdk.dll
|
||||
|
|
@ -195,6 +196,7 @@ elseif(DARWIN)
|
|||
set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
|
||||
set(vivox_files
|
||||
SLVoice
|
||||
ca-bundle.crt
|
||||
libsndfile.dylib
|
||||
libvivoxoal.dylib
|
||||
libortp.dylib
|
||||
|
|
@ -241,6 +243,7 @@ elseif(LINUX)
|
|||
libvivoxplatform.so
|
||||
libvivoxsdk.so
|
||||
SLVoice
|
||||
# ca-bundle.crt #No cert for linux. It is actually still 3.2SDK.
|
||||
)
|
||||
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
|
||||
# or ARCH_PREBUILT_DIRS
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ void LLCocoaPlugin::setupGroup()
|
|||
|
||||
}
|
||||
|
||||
void LLCocoaPlugin::updateWindows() //SPATTERS give this a better name.
|
||||
void LLCocoaPlugin::updateWindows()
|
||||
{
|
||||
// NSArray* window_list = [NSApp orderedWindows];
|
||||
// NSWindow* current_window = [window_list objectAtIndex:0];
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ LLDir_Mac::LLDir_Mac()
|
|||
|
||||
{
|
||||
mOSCacheDir = *cachedir;
|
||||
//SPATTERS TODO: This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife. Last dir level could go away.
|
||||
//Aura TODO: This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife. Last dir level could go away.
|
||||
CreateDirectory(mOSCacheDir, secondLifeString, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory,
|
|||
if ([paths count])
|
||||
{
|
||||
path = [paths objectAtIndex:0];
|
||||
//SPATTERS HACK: Always attempt to create directory, ignore errors.
|
||||
//HACK: Always attempt to create directory, ignore errors.
|
||||
NSError *error = nil;
|
||||
|
||||
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
|
||||
|
|
|
|||
|
|
@ -1676,6 +1676,7 @@ if (WINDOWS)
|
|||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt
|
||||
${GOOGLE_PERF_TOOLS_SOURCE}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.6.2
|
||||
3.6.3
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ void LLGestureMgr::activateGestures(LLViewerInventoryItem::item_array_t& items)
|
|||
continue;
|
||||
}
|
||||
else
|
||||
{ // Make gesture active and persistent through login sessions. -spatters 07-12-06
|
||||
{ // Make gesture active and persistent through login sessions. -Aura 07-12-06
|
||||
activateGesture(item->getUUID());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3444,7 +3444,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
|||
}
|
||||
}
|
||||
|
||||
//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
|
||||
//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
|
||||
mCallingCards = mWearables = FALSE;
|
||||
|
||||
LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
|
||||
|
|
|
|||
|
|
@ -714,14 +714,7 @@ BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id)
|
|||
|
||||
BOOL LLVoiceClient::isOnlineSIP(const LLUUID& id)
|
||||
{
|
||||
if (mVoiceModule)
|
||||
{
|
||||
return mVoiceModule->isOnlineSIP(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id)
|
||||
|
|
|
|||
|
|
@ -199,7 +199,6 @@ public:
|
|||
//@{
|
||||
virtual BOOL getVoiceEnabled(const LLUUID& id)=0; // true if we've received data for this avatar
|
||||
virtual std::string getDisplayName(const LLUUID& id)=0;
|
||||
virtual BOOL isOnlineSIP(const LLUUID &id)=0;
|
||||
virtual BOOL isParticipantAvatar(const LLUUID &id)=0;
|
||||
virtual BOOL getIsSpeaking(const LLUUID& id)=0;
|
||||
virtual BOOL getIsModeratorMuted(const LLUUID& id)=0;
|
||||
|
|
|
|||
|
|
@ -182,17 +182,10 @@ class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver
|
|||
/* virtual */ void onChange() { LLVivoxVoiceClient::getInstance()->muteListChanged();}
|
||||
};
|
||||
|
||||
class LLVivoxVoiceClientFriendsObserver : public LLFriendObserver
|
||||
{
|
||||
public:
|
||||
/* virtual */ void changed(U32 mask) { LLVivoxVoiceClient::getInstance()->updateFriends(mask);}
|
||||
};
|
||||
|
||||
static LLVivoxVoiceClientMuteListObserver mutelist_listener;
|
||||
static bool sMuteListListener_listening = false;
|
||||
|
||||
static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
|
||||
|
|
@ -390,7 +383,6 @@ void LLVivoxVoiceClient::terminate()
|
|||
void LLVivoxVoiceClient::cleanUp()
|
||||
{
|
||||
deleteAllSessions();
|
||||
deleteAllBuddies();
|
||||
deleteAllVoiceFonts();
|
||||
deleteVoiceFontTemplates();
|
||||
}
|
||||
|
|
@ -476,10 +468,10 @@ void LLVivoxVoiceClient::connectorCreate()
|
|||
|
||||
std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel");
|
||||
|
||||
if(savedLogLevel != "-1")
|
||||
if(savedLogLevel != "-0")
|
||||
{
|
||||
LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL;
|
||||
loglevel = "10";
|
||||
loglevel = "0";
|
||||
}
|
||||
|
||||
stream
|
||||
|
|
@ -792,9 +784,9 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");
|
||||
if(loglevel.empty())
|
||||
{
|
||||
loglevel = "-1"; // turn logging off completely
|
||||
loglevel = "0"; // turn logging off completely
|
||||
}
|
||||
|
||||
loglevel = "0"; // turn logging off completely
|
||||
params.args.add("-ll");
|
||||
params.args.add(loglevel);
|
||||
params.cwd = gDirUtilp->getAppRODataDir();
|
||||
|
|
@ -1202,25 +1194,12 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
setState(stateVoiceFontsReceived);
|
||||
}
|
||||
|
||||
// request the current set of block rules (we'll need them when updating the friends list)
|
||||
accountListBlockRulesSendMessage();
|
||||
|
||||
// request the current set of auto-accept rules
|
||||
accountListAutoAcceptRulesSendMessage();
|
||||
|
||||
// Set up the mute list observer if it hasn't been set up already.
|
||||
if((!sMuteListListener_listening))
|
||||
{
|
||||
LLMuteList::getInstance()->addObserver(&mutelist_listener);
|
||||
sMuteListListener_listening = true;
|
||||
}
|
||||
|
||||
// Set up the friends list observer if it hasn't been set up already.
|
||||
if(friendslist_listener == NULL)
|
||||
{
|
||||
friendslist_listener = new LLVivoxVoiceClientFriendsObserver;
|
||||
LLAvatarTracker::instance().addObserver(friendslist_listener);
|
||||
}
|
||||
|
||||
// Set the initial state of mic mute, local speaker volume, etc.
|
||||
{
|
||||
|
|
@ -1291,9 +1270,7 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
case stateNoChannel:
|
||||
LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
|
||||
mSpatialJoiningNum = 0;
|
||||
// Do this here as well as inside sendPositionalUpdate().
|
||||
// Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
|
||||
sendFriendsListUpdates();
|
||||
|
||||
|
||||
if(mSessionTerminateRequested || (!mVoiceEnabled && mIsInitialized))
|
||||
{
|
||||
|
|
@ -1490,7 +1467,6 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
|
||||
sendPositionalUpdate();
|
||||
}
|
||||
|
||||
mIsInitialized = true;
|
||||
}
|
||||
break;
|
||||
|
|
@ -1648,7 +1624,7 @@ void LLVivoxVoiceClient::stateMachine()
|
|||
void LLVivoxVoiceClient::closeSocket(void)
|
||||
{
|
||||
mSocket.reset();
|
||||
mConnected = false;
|
||||
mConnected = false;
|
||||
mConnectorHandle.clear();
|
||||
mAccountHandle.clear();
|
||||
}
|
||||
|
|
@ -1665,7 +1641,7 @@ void LLVivoxVoiceClient::loginSendMessage()
|
|||
<< "<AccountName>" << mAccountName << "</AccountName>"
|
||||
<< "<AccountPassword>" << mAccountPassword << "</AccountPassword>"
|
||||
<< "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>"
|
||||
<< "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>"
|
||||
<< "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>"
|
||||
<< "<BuddyManagementMode>Application</BuddyManagementMode>"
|
||||
<< "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"
|
||||
<< (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"")
|
||||
|
|
@ -1701,42 +1677,6 @@ void LLVivoxVoiceClient::logoutSendMessage()
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::accountListBlockRulesSendMessage()
|
||||
{
|
||||
if(!mAccountHandle.empty())
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL;
|
||||
|
||||
stream
|
||||
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "</Request>"
|
||||
<< "\n\n\n";
|
||||
|
||||
writeString(stream.str());
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::accountListAutoAcceptRulesSendMessage()
|
||||
{
|
||||
if(!mAccountHandle.empty())
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL;
|
||||
|
||||
stream
|
||||
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "</Request>"
|
||||
<< "\n\n\n";
|
||||
|
||||
writeString(stream.str());
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::sessionGroupCreateSendMessage()
|
||||
{
|
||||
if(!mAccountHandle.empty())
|
||||
|
|
@ -2568,10 +2508,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)
|
|||
{
|
||||
writeString(stream.str());
|
||||
}
|
||||
|
||||
// Friends list updates can be huge, especially on the first voice login of an account with lots of friends.
|
||||
// Batching them all together can choke SLVoice, so send them in separate writes.
|
||||
sendFriendsListUpdates();
|
||||
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::buildSetCaptureDevice(std::ostringstream &stream)
|
||||
|
|
@ -2669,275 +2606,6 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
|
|||
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::checkFriend(const LLUUID& id)
|
||||
{
|
||||
buddyListEntry *buddy = findBuddy(id);
|
||||
|
||||
// Make sure we don't add a name before it's been looked up in the avatar name cache
|
||||
LLAvatarName av_name;
|
||||
if (LLAvatarNameCache::get(id, &av_name))
|
||||
{
|
||||
// *NOTE: We feed legacy names to Vivox because we don't know if their service
|
||||
// can support a mix of new and old clients with different sorts of names.
|
||||
std::string name = av_name.getAccountName();
|
||||
|
||||
if (buddy)
|
||||
{
|
||||
// This buddy is already in both lists (vivox buddies and avatar cache).
|
||||
// Trust the avatar cache more for the display name (vivox display name are notoriously wrong)
|
||||
buddy->mDisplayName = name;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This buddy was not in the vivox list, needs to be added.
|
||||
buddy = addBuddy(sipURIFromID(id), name);
|
||||
buddy->mUUID = id;
|
||||
}
|
||||
|
||||
const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id);
|
||||
buddy->mCanSeeMeOnline = (relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
|
||||
// In all the above cases, the buddy is in the SL friends list and tha name has been resolved (which is how we got here).
|
||||
buddy->mNameResolved = true;
|
||||
buddy->mInSLFriends = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This name hasn't been looked up yet in the avatar cache. Don't do anything with this buddy list entry until it has.
|
||||
if (buddy)
|
||||
{
|
||||
buddy->mNameResolved = false;
|
||||
}
|
||||
// Initiate a lookup.
|
||||
// The "lookup completed" callback will ensure that the friends list is rechecked after it completes.
|
||||
lookupName(id);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::clearAllLists()
|
||||
{
|
||||
// FOR TESTING ONLY
|
||||
|
||||
// This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about.
|
||||
buddyListMap::iterator buddy_it;
|
||||
for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
|
||||
{
|
||||
buddyListEntry *buddy = buddy_it->second;
|
||||
buddy_it++;
|
||||
|
||||
std::ostringstream stream;
|
||||
|
||||
if(buddy->mInVivoxBuddies)
|
||||
{
|
||||
// delete this entry from the vivox buddy list
|
||||
buddy->mInVivoxBuddies = false;
|
||||
LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
|
||||
if(buddy->mHasBlockListEntry)
|
||||
{
|
||||
// Delete the associated block list entry (so the block list doesn't fill up with junk)
|
||||
buddy->mHasBlockListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
if(buddy->mHasAutoAcceptListEntry)
|
||||
{
|
||||
// Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk)
|
||||
buddy->mHasAutoAcceptListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
|
||||
writeString(stream.str());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::sendFriendsListUpdates()
|
||||
{
|
||||
if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty)
|
||||
{
|
||||
mFriendsListDirty = false;
|
||||
|
||||
if(0)
|
||||
{
|
||||
// FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries.
|
||||
clearAllLists();
|
||||
return;
|
||||
}
|
||||
|
||||
LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL;
|
||||
|
||||
buddyListMap::iterator buddy_it;
|
||||
for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
|
||||
{
|
||||
// reset the temp flags in the local buddy list
|
||||
buddy_it->second->mInSLFriends = false;
|
||||
}
|
||||
|
||||
// correlate with the friends list
|
||||
{
|
||||
LLCollectAllBuddies collect;
|
||||
LLAvatarTracker::instance().applyFunctor(collect);
|
||||
LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin();
|
||||
LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end();
|
||||
|
||||
for ( ; it != end; ++it)
|
||||
{
|
||||
checkFriend(it->second);
|
||||
}
|
||||
it = collect.mOffline.begin();
|
||||
end = collect.mOffline.end();
|
||||
for ( ; it != end; ++it)
|
||||
{
|
||||
checkFriend(it->second);
|
||||
}
|
||||
}
|
||||
|
||||
LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL;
|
||||
|
||||
for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
|
||||
{
|
||||
buddyListEntry *buddy = buddy_it->second;
|
||||
buddy_it++;
|
||||
|
||||
// Ignore entries that aren't resolved yet.
|
||||
if(buddy->mNameResolved)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
if(buddy->mInSLFriends && !buddy->mInVivoxBuddies)
|
||||
{
|
||||
if(mNumberOfAliases > 0)
|
||||
{
|
||||
// Add (or update) this entry in the vivox buddy list
|
||||
buddy->mInVivoxBuddies = true;
|
||||
LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
|
||||
stream
|
||||
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
|
||||
<< "<DisplayName>" << buddy->mDisplayName << "</DisplayName>"
|
||||
<< "<BuddyData></BuddyData>" // Without this, SLVoice doesn't seem to parse the command.
|
||||
<< "<GroupID>0</GroupID>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
}
|
||||
else if(!buddy->mInSLFriends)
|
||||
{
|
||||
// This entry no longer exists in your SL friends list. Remove all traces of it from the Vivox buddy list.
|
||||
if(buddy->mInVivoxBuddies)
|
||||
{
|
||||
// delete this entry from the vivox buddy list
|
||||
buddy->mInVivoxBuddies = false;
|
||||
LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
|
||||
if(buddy->mHasBlockListEntry)
|
||||
{
|
||||
// Delete the associated block list entry, if any
|
||||
buddy->mHasBlockListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
if(buddy->mHasAutoAcceptListEntry)
|
||||
{
|
||||
// Delete the associated auto-accept list entry, if any
|
||||
buddy->mHasAutoAcceptListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
if(buddy->mInSLFriends)
|
||||
{
|
||||
|
||||
if(buddy->mCanSeeMeOnline)
|
||||
{
|
||||
// Buddy should not be blocked.
|
||||
|
||||
// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
|
||||
|
||||
// If the buddy has a block list entry, delete it.
|
||||
if(buddy->mHasBlockListEntry)
|
||||
{
|
||||
buddy->mHasBlockListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
|
||||
|
||||
// If we just deleted a block list entry, add an auto-accept entry.
|
||||
if(!buddy->mHasAutoAcceptListEntry)
|
||||
{
|
||||
buddy->mHasAutoAcceptListEntry = true;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
|
||||
<< "<AutoAddAsBuddy>0</AutoAddAsBuddy>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Buddy should be blocked.
|
||||
|
||||
// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
|
||||
|
||||
// If this buddy has an autoaccept entry, delete it
|
||||
if(buddy->mHasAutoAcceptListEntry)
|
||||
{
|
||||
buddy->mHasAutoAcceptListEntry = false;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
|
||||
<< "</Request>\n\n\n";
|
||||
|
||||
// If we just deleted an auto-accept entry, add a block list entry.
|
||||
if(!buddy->mHasBlockListEntry)
|
||||
{
|
||||
buddy->mHasBlockListEntry = true;
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
|
||||
<< "<PresenceOnly>1</PresenceOnly>"
|
||||
<< "</Request>\n\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies)
|
||||
{
|
||||
// Delete this entry from the local buddy list. This should NOT invalidate the iterator,
|
||||
// since it has already been incremented to the next entry.
|
||||
deleteBuddy(buddy->mURI);
|
||||
}
|
||||
|
||||
}
|
||||
writeString(stream.str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
// Response/Event handlers
|
||||
|
||||
|
|
@ -3711,7 +3379,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
|
|||
voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager
|
||||
and event is not fired.
|
||||
|
||||
So, we have to call LLSpeakerMgr::update() here.
|
||||
So, we have to call LLSpeakerMgr::update() here.
|
||||
*/
|
||||
LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
|
||||
|
||||
|
|
@ -3743,83 +3411,6 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::buddyPresenceEvent(
|
||||
std::string &uriString,
|
||||
std::string &alias,
|
||||
std::string &statusString,
|
||||
std::string &applicationString)
|
||||
{
|
||||
buddyListEntry *buddy = findBuddy(uriString);
|
||||
|
||||
if(buddy)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
|
||||
|
||||
if(applicationString.empty())
|
||||
{
|
||||
// This presence event is from a client that doesn't set up the Application string. Do things the old-skool way.
|
||||
// NOTE: this will be needed to support people who aren't on the 3010-class SDK yet.
|
||||
|
||||
if ( stricmp("Unknown", statusString.c_str())== 0)
|
||||
{
|
||||
// User went offline with a non-SLim-enabled viewer.
|
||||
buddy->mOnlineSL = false;
|
||||
}
|
||||
else if ( stricmp("Online", statusString.c_str())== 0)
|
||||
{
|
||||
// User came online with a non-SLim-enabled viewer.
|
||||
buddy->mOnlineSL = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the user is online through SLim, their status will be "Online-slc", "Away", or something else.
|
||||
// NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string.
|
||||
buddy->mOnlineSLim = true;
|
||||
}
|
||||
}
|
||||
else if(applicationString.find("SecondLifeViewer") != std::string::npos)
|
||||
{
|
||||
// This presence event is from a viewer that sets the application string
|
||||
if ( stricmp("Unknown", statusString.c_str())== 0)
|
||||
{
|
||||
// Viewer says they're offline
|
||||
buddy->mOnlineSL = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Viewer says they're online
|
||||
buddy->mOnlineSL = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This presence event is from something which is NOT the SL viewer (assume it's SLim).
|
||||
if ( stricmp("Unknown", statusString.c_str())== 0)
|
||||
{
|
||||
// SLim says they're offline
|
||||
buddy->mOnlineSLim = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// SLim says they're online
|
||||
buddy->mOnlineSLim = true;
|
||||
}
|
||||
}
|
||||
|
||||
LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
|
||||
|
||||
// HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change.
|
||||
LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID));
|
||||
|
||||
notifyFriendObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::messageEvent(
|
||||
std::string &sessionHandle,
|
||||
std::string &uriString,
|
||||
|
|
@ -4010,70 +3601,12 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType)
|
||||
{
|
||||
buddyListEntry *buddy = findBuddy(buddyURI);
|
||||
|
||||
if(!buddy)
|
||||
{
|
||||
// Couldn't find buddy by URI, try converting the alias...
|
||||
if(!alias.empty())
|
||||
{
|
||||
LLUUID id;
|
||||
if(IDFromName(alias, id))
|
||||
{
|
||||
buddy = findBuddy(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(buddy)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
if(buddy->mCanSeeMeOnline)
|
||||
{
|
||||
// Sending the response will create an auto-accept rule
|
||||
buddy->mHasAutoAcceptListEntry = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Sending the response will create a block rule
|
||||
buddy->mHasBlockListEntry = true;
|
||||
}
|
||||
|
||||
if(buddy->mInSLFriends)
|
||||
{
|
||||
buddy->mInVivoxBuddies = true;
|
||||
}
|
||||
|
||||
stream
|
||||
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">"
|
||||
<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
|
||||
<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
|
||||
<< "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>"
|
||||
<< "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>"
|
||||
<< "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>"
|
||||
<< "</Request>"
|
||||
<< "\n\n\n";
|
||||
|
||||
writeString(stream.str());
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
|
||||
mTuningEnergy = energy;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::buddyListChanged()
|
||||
{
|
||||
// This is called after we receive a BuddyAndGroupListChangedEvent.
|
||||
mBuddyListMapPopulated = true;
|
||||
mFriendsListDirty = true;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::muteListChanged()
|
||||
{
|
||||
// The user's mute list has been updated. Go through the current participant list and sync it with the mute list.
|
||||
|
|
@ -4092,15 +3625,6 @@ void LLVivoxVoiceClient::muteListChanged()
|
|||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::updateFriends(U32 mask)
|
||||
{
|
||||
if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS))
|
||||
{
|
||||
// Just resend the whole friend list to the daemon
|
||||
mFriendsListDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
// Managing list of participants
|
||||
LLVivoxVoiceClient::participantState::participantState(const std::string &uri) :
|
||||
|
|
@ -4699,34 +4223,6 @@ bool LLVivoxVoiceClient::answerInvite(std::string &sessionHandle)
|
|||
return false;
|
||||
}
|
||||
|
||||
BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id)
|
||||
{
|
||||
bool result = false;
|
||||
buddyListEntry *buddy = findBuddy(id);
|
||||
if(buddy)
|
||||
{
|
||||
result = buddy->mOnlineSLim;
|
||||
LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL;
|
||||
}
|
||||
|
||||
if(!result)
|
||||
{
|
||||
// This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM.
|
||||
sessionState *session = findSession(id);
|
||||
if(session && !session->mHandle.empty())
|
||||
{
|
||||
if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle))
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL;
|
||||
// we have a p2p text session open with this user, so by definition they're online.
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool LLVivoxVoiceClient::isVoiceWorking() const
|
||||
{
|
||||
//Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)
|
||||
|
|
@ -4783,7 +4279,7 @@ BOOL LLVivoxVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
|
|||
// Currently this will be false only for PSTN P2P calls.
|
||||
BOOL LLVivoxVoiceClient::isSessionTextIMPossible(const LLUUID &session_id)
|
||||
{
|
||||
bool result = TRUE;
|
||||
bool result = TRUE;
|
||||
sessionState *session = findSession(session_id);
|
||||
|
||||
if(session != NULL)
|
||||
|
|
@ -5832,224 +5328,6 @@ void LLVivoxVoiceClient::verifySessionState(void)
|
|||
}
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) :
|
||||
mURI(uri)
|
||||
{
|
||||
mOnlineSL = false;
|
||||
mOnlineSLim = false;
|
||||
mCanSeeMeOnline = true;
|
||||
mHasBlockListEntry = false;
|
||||
mHasAutoAcceptListEntry = false;
|
||||
mNameResolved = false;
|
||||
mInVivoxBuddies = false;
|
||||
mInSLFriends = false;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName)
|
||||
{
|
||||
buddyListEntry *buddy = addBuddy(uri, displayName);
|
||||
buddy->mInVivoxBuddies = true;
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri)
|
||||
{
|
||||
std::string empty;
|
||||
buddyListEntry *buddy = addBuddy(uri, empty);
|
||||
if(buddy->mDisplayName.empty())
|
||||
{
|
||||
buddy->mNameResolved = false;
|
||||
}
|
||||
return buddy;
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri, const std::string &displayName)
|
||||
{
|
||||
buddyListEntry *result = NULL;
|
||||
buddyListMap::iterator iter = mBuddyListMap.find(uri);
|
||||
|
||||
if (iter != mBuddyListMap.end())
|
||||
{
|
||||
// Found a matching buddy already in the map.
|
||||
LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL;
|
||||
result = iter->second;
|
||||
}
|
||||
|
||||
if (!result)
|
||||
{
|
||||
// participant isn't already in one list or the other.
|
||||
LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL;
|
||||
result = new buddyListEntry(uri);
|
||||
result->mDisplayName = displayName;
|
||||
|
||||
if (!IDFromName(uri, result->mUUID))
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL;
|
||||
}
|
||||
|
||||
mBuddyListMap.insert(buddyListMap::value_type(result->mURI, result));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const std::string &uri)
|
||||
{
|
||||
buddyListEntry *result = NULL;
|
||||
buddyListMap::iterator iter = mBuddyListMap.find(uri);
|
||||
if(iter != mBuddyListMap.end())
|
||||
{
|
||||
result = iter->second;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const LLUUID &id)
|
||||
{
|
||||
buddyListEntry *result = NULL;
|
||||
buddyListMap::iterator iter;
|
||||
|
||||
for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
|
||||
{
|
||||
if(iter->second->mUUID == id)
|
||||
{
|
||||
result = iter->second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddyByDisplayName(const std::string &name)
|
||||
{
|
||||
buddyListEntry *result = NULL;
|
||||
buddyListMap::iterator iter;
|
||||
|
||||
for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
|
||||
{
|
||||
if(iter->second->mDisplayName == name)
|
||||
{
|
||||
result = iter->second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::deleteBuddy(const std::string &uri)
|
||||
{
|
||||
buddyListMap::iterator iter = mBuddyListMap.find(uri);
|
||||
if(iter != mBuddyListMap.end())
|
||||
{
|
||||
LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL;
|
||||
buddyListEntry *buddy = iter->second;
|
||||
mBuddyListMap.erase(iter);
|
||||
delete buddy;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::deleteAllBuddies(void)
|
||||
{
|
||||
while(!mBuddyListMap.empty())
|
||||
{
|
||||
deleteBuddy(mBuddyListMap.begin()->first);
|
||||
}
|
||||
|
||||
// Don't want to correlate with friends list when we've emptied the buddy list.
|
||||
mBuddyListMapPopulated = false;
|
||||
|
||||
// Don't want to correlate with friends list when we've reset the block rules.
|
||||
mBlockRulesListReceived = false;
|
||||
mAutoAcceptRulesListReceived = false;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::deleteAllBlockRules(void)
|
||||
{
|
||||
// Clear the block list entry flags from all local buddy list entries
|
||||
buddyListMap::iterator buddy_it;
|
||||
for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
|
||||
{
|
||||
buddy_it->second->mHasBlockListEntry = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::deleteAllAutoAcceptRules(void)
|
||||
{
|
||||
// Clear the auto-accept list entry flags from all local buddy list entries
|
||||
buddyListMap::iterator buddy_it;
|
||||
for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
|
||||
{
|
||||
buddy_it->second->mHasAutoAcceptListEntry = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly)
|
||||
{
|
||||
buddyListEntry *buddy = NULL;
|
||||
|
||||
// blockMask is the SIP URI of a friends list entry
|
||||
buddyListMap::iterator iter = mBuddyListMap.find(blockMask);
|
||||
if(iter != mBuddyListMap.end())
|
||||
{
|
||||
LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL;
|
||||
buddy = iter->second;
|
||||
}
|
||||
|
||||
if(buddy == NULL)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL;
|
||||
buddy = addBuddy(blockMask);
|
||||
}
|
||||
|
||||
if(buddy != NULL)
|
||||
{
|
||||
buddy->mHasBlockListEntry = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy)
|
||||
{
|
||||
buddyListEntry *buddy = NULL;
|
||||
|
||||
// blockMask is the SIP URI of a friends list entry
|
||||
buddyListMap::iterator iter = mBuddyListMap.find(autoAcceptMask);
|
||||
if(iter != mBuddyListMap.end())
|
||||
{
|
||||
LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL;
|
||||
buddy = iter->second;
|
||||
}
|
||||
|
||||
if(buddy == NULL)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL;
|
||||
buddy = addBuddy(autoAcceptMask);
|
||||
}
|
||||
|
||||
if(buddy != NULL)
|
||||
{
|
||||
buddy->mHasAutoAcceptListEntry = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString)
|
||||
{
|
||||
// Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
|
||||
mBlockRulesListReceived = true;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString)
|
||||
{
|
||||
// Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
|
||||
mAutoAcceptRulesListReceived = true;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
|
||||
{
|
||||
mParticipantObservers.insert(observer);
|
||||
|
|
@ -6198,11 +5476,6 @@ void LLVivoxVoiceClient::onAvatarNameCache(const LLUUID& agent_id,
|
|||
|
||||
void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
|
||||
{
|
||||
// If the avatar whose name just resolved is on our friends list, resync the friends list.
|
||||
if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL)
|
||||
{
|
||||
mFriendsListDirty = true;
|
||||
}
|
||||
// Iterate over all sessions.
|
||||
for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
|
||||
{
|
||||
|
|
@ -6815,7 +6088,6 @@ void LLVivoxVoiceClient::updateVoiceMorphingMenu()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::notifyVoiceFontObservers()
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL;
|
||||
|
|
@ -7205,18 +6477,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
|
|||
{
|
||||
deviceString.clear();
|
||||
}
|
||||
else if (!stricmp("Buddies", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->deleteAllBuddies();
|
||||
}
|
||||
else if (!stricmp("BlockRules", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->deleteAllBlockRules();
|
||||
}
|
||||
else if (!stricmp("AutoAcceptRules", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules();
|
||||
}
|
||||
else if (!stricmp("SessionFont", tag))
|
||||
{
|
||||
id = 0;
|
||||
|
|
@ -7251,7 +6511,7 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
|
|||
void LLVivoxProtocolParser::EndTag(const char *tag)
|
||||
{
|
||||
const std::string& string = textBuffer;
|
||||
|
||||
|
||||
responseDepth--;
|
||||
|
||||
if (ignoringTags)
|
||||
|
|
@ -7348,24 +6608,10 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
|
|||
{
|
||||
LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
|
||||
}
|
||||
else if (!stricmp("Buddy", tag))
|
||||
{
|
||||
// NOTE : Vivox does *not* give reliable display name for Buddy tags
|
||||
// We don't take those very seriously as a result...
|
||||
LLVivoxVoiceClient::getInstance()->processBuddyListEntry(uriString, displayNameString);
|
||||
}
|
||||
else if (!stricmp("BlockRule", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->addBlockRule(blockMask, presenceOnly);
|
||||
}
|
||||
else if (!stricmp("BlockMask", tag))
|
||||
blockMask = string;
|
||||
else if (!stricmp("PresenceOnly", tag))
|
||||
presenceOnly = string;
|
||||
else if (!stricmp("AutoAcceptRule", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy);
|
||||
}
|
||||
else if (!stricmp("AutoAcceptMask", tag))
|
||||
autoAcceptMask = string;
|
||||
else if (!stricmp("AutoAddAsBuddy", tag))
|
||||
|
|
@ -7597,16 +6843,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
|
|||
|
||||
LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent"))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->buddyPresenceEvent(uriString, alias, statusString, applicationString);
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent"))
|
||||
{
|
||||
// The buddy list was updated during parsing.
|
||||
// Need to recheck against the friends list.
|
||||
LLVivoxVoiceClient::getInstance()->buddyListChanged();
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "BuddyChangedEvent"))
|
||||
{
|
||||
/*
|
||||
|
|
@ -7629,11 +6865,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
|
|||
{
|
||||
LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType);
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "SubscriptionEvent"))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType);
|
||||
}
|
||||
else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))
|
||||
else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))
|
||||
{
|
||||
/*
|
||||
<Event type="SessionUpdatedEvent">
|
||||
|
|
@ -7696,14 +6928,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
|
|||
{
|
||||
LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString);
|
||||
}
|
||||
else if (!stricmp(actionCstr, "Account.ListBlockRules.1"))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->accountListBlockRulesResponse(statusCode, statusString);
|
||||
}
|
||||
else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1"))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->accountListAutoAcceptRulesResponse(statusCode, statusString);
|
||||
}
|
||||
else if (!stricmp(actionCstr, "Session.Set3DPosition.1"))
|
||||
{
|
||||
// We don't need to process these, but they're so spammy we don't want to log them.
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ class LLVivoxProtocolParser;
|
|||
class LLAvatarName;
|
||||
class LLVivoxVoiceAccountProvisionResponder;
|
||||
class LLVivoxVoiceClientMuteListObserver;
|
||||
class LLVivoxVoiceClientFriendsObserver;
|
||||
|
||||
|
||||
class LLVivoxVoiceClient : public LLSingleton<LLVivoxVoiceClient>,
|
||||
|
|
@ -181,7 +180,6 @@ public:
|
|||
//@{
|
||||
virtual BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
|
||||
virtual std::string getDisplayName(const LLUUID& id);
|
||||
virtual BOOL isOnlineSIP(const LLUUID &id);
|
||||
virtual BOOL isParticipantAvatar(const LLUUID &id);
|
||||
virtual BOOL getIsSpeaking(const LLUUID& id);
|
||||
virtual BOOL getIsModeratorMuted(const LLUUID& id);
|
||||
|
|
@ -490,14 +488,10 @@ protected:
|
|||
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 auxAudioPropertiesEvent(F32 energy);
|
||||
void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);
|
||||
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);
|
||||
void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType);
|
||||
|
||||
void buddyListChanged();
|
||||
void muteListChanged();
|
||||
void updateFriends(U32 mask);
|
||||
|
||||
/////////////////////////////
|
||||
// Sending updates of current state
|
||||
|
|
@ -588,24 +582,6 @@ protected:
|
|||
|
||||
typedef std::map<std::string, buddyListEntry*> buddyListMap;
|
||||
|
||||
// This should be called when parsing a buddy list entry sent by SLVoice.
|
||||
void processBuddyListEntry(const std::string &uri, const std::string &displayName);
|
||||
|
||||
buddyListEntry *addBuddy(const std::string &uri);
|
||||
buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName);
|
||||
buddyListEntry *findBuddy(const std::string &uri);
|
||||
buddyListEntry *findBuddy(const LLUUID &id);
|
||||
buddyListEntry *findBuddyByDisplayName(const std::string &name);
|
||||
void deleteBuddy(const std::string &uri);
|
||||
void deleteAllBuddies(void);
|
||||
|
||||
void deleteAllBlockRules(void);
|
||||
void addBlockRule(const std::string &blockMask, const std::string &presenceOnly);
|
||||
void deleteAllAutoAcceptRules(void);
|
||||
void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy);
|
||||
void accountListBlockRulesResponse(int statusCode, const std::string &statusString);
|
||||
void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString);
|
||||
|
||||
/////////////////////////////
|
||||
// session control messages
|
||||
|
||||
|
|
@ -774,8 +750,7 @@ private:
|
|||
void buildSetCaptureDevice(std::ostringstream &stream);
|
||||
void buildSetRenderDevice(std::ostringstream &stream);
|
||||
|
||||
void clearAllLists();
|
||||
void checkFriend(const LLUUID& id);
|
||||
|
||||
void sendFriendsListUpdates();
|
||||
|
||||
// start a text IM session with the specified user
|
||||
|
|
|
|||
|
|
@ -366,6 +366,7 @@ class WindowsManifest(ViewerManifest):
|
|||
self.path("zlib1.dll")
|
||||
self.path("vivoxplatform.dll")
|
||||
self.path("vivoxoal.dll")
|
||||
self.path("ca-bundle.crt")
|
||||
|
||||
# Security
|
||||
self.path("ssleay32.dll")
|
||||
|
|
@ -726,6 +727,7 @@ class DarwinManifest(ViewerManifest):
|
|||
'libvivoxoal.dylib',
|
||||
'libvivoxsdk.dylib',
|
||||
'libvivoxplatform.dylib',
|
||||
'ca-bundle.crt',
|
||||
'SLVoice',
|
||||
):
|
||||
self.path2basename(libdir, libfile)
|
||||
|
|
|
|||
Loading…
Reference in New Issue