Merge viewer-neko
commit
4c4b76ab37
|
|
@ -221,7 +221,6 @@ Ansariel Hiller
|
|||
STORM-2151
|
||||
MAINT-6917
|
||||
MAINT-8085
|
||||
STORM-2122
|
||||
Aralara Rajal
|
||||
Arare Chantilly
|
||||
CHUIBUG-191
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ const U8 CLICK_ACTION_OPEN = 4;
|
|||
const U8 CLICK_ACTION_PLAY = 5;
|
||||
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
|
||||
const U8 CLICK_ACTION_ZOOM = 7;
|
||||
const U8 CLICK_ACTION_DISABLED = 8;
|
||||
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -283,6 +283,7 @@ void LLCoros::setStackSize(S32 stacksize)
|
|||
|
||||
void LLCoros::printActiveCoroutines()
|
||||
{
|
||||
LL_INFOS("LLCoros") << "Number of active coroutines: " << (S32)mCoros.size() << LL_ENDL;
|
||||
LL_INFOS("LLCoros") << "-------------- List of active coroutines ------------";
|
||||
CoroMap::iterator iter;
|
||||
CoroMap::iterator end = mCoros.end();
|
||||
|
|
@ -405,7 +406,13 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
|
|||
std::string name(generateDistinctName(prefix));
|
||||
Current current;
|
||||
// pass the current value of Current as previous context
|
||||
CoroData* newCoro = new CoroData(current, name, callable, mStackSize);
|
||||
CoroData* newCoro = new(std::nothrow) CoroData(current, name, callable, mStackSize);
|
||||
if (newCoro == NULL)
|
||||
{
|
||||
// Out of memory?
|
||||
printActiveCoroutines();
|
||||
LL_ERRS("LLCoros") << "Failed to start coroutine: " << name << " Stacksize: " << mStackSize << " Total coroutines: " << mCoros.size() << LL_ENDL;
|
||||
}
|
||||
// Store it in our pointer map
|
||||
mCoros.insert(name, newCoro);
|
||||
// also set it as current
|
||||
|
|
|
|||
|
|
@ -209,7 +209,6 @@ set(viewer_SOURCE_FILES
|
|||
lggbeamscolors.cpp
|
||||
lggcontactsets.cpp
|
||||
lfsimfeaturehandler.cpp
|
||||
llfloaterauction.cpp
|
||||
llfloaterdisplayname.cpp
|
||||
llpanelopenregionsettings.cpp
|
||||
llviewerdisplayname.cpp
|
||||
|
|
@ -316,6 +315,7 @@ set(viewer_SOURCE_FILES
|
|||
llflickrconnect.cpp
|
||||
llfloaterabout.cpp
|
||||
llfloaterbvhpreview.cpp
|
||||
llfloaterauction.cpp
|
||||
llfloaterautoreplacesettings.cpp
|
||||
llfloateravatar.cpp
|
||||
llfloateravatarpicker.cpp
|
||||
|
|
@ -966,7 +966,6 @@ set(viewer_HEADER_FILES
|
|||
lggbeamscolors.h
|
||||
lggcontactsets.h
|
||||
lfsimfeaturehandler.h
|
||||
llfloaterauction.h
|
||||
llfloaterdisplayname.h
|
||||
llviewerdisplayname.h
|
||||
# <FS:Ansariel> [Legacy Bake]
|
||||
|
|
@ -1073,6 +1072,7 @@ set(viewer_HEADER_FILES
|
|||
llflickrconnect.h
|
||||
llfloaterabout.h
|
||||
llfloaterbvhpreview.h
|
||||
llfloaterauction.h
|
||||
llfloaterautoreplacesettings.h
|
||||
llfloateravatar.h
|
||||
llfloateravatarpicker.h
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
#include "llagentlanguage.h"
|
||||
#include "llagentui.h"
|
||||
#include "llagentwearables.h"
|
||||
#include "lldirpicker.h"
|
||||
#include "llfloaterimcontainer.h"
|
||||
#include "llimprocessing.h"
|
||||
#include "llwindow.h"
|
||||
|
|
@ -2373,6 +2374,7 @@ bool LLAppViewer::cleanup()
|
|||
mAppCoreHttp.cleanup();
|
||||
|
||||
SUBSYSTEM_CLEANUP(LLFilePickerThread);
|
||||
SUBSYSTEM_CLEANUP(LLDirPickerThread);
|
||||
|
||||
//MUST happen AFTER SUBSYSTEM_CLEANUP(LLCurl)
|
||||
delete sTextureCache;
|
||||
|
|
@ -2543,6 +2545,7 @@ bool LLAppViewer::initThreads()
|
|||
gMeshRepo.init();
|
||||
|
||||
LLFilePickerThread::initClass();
|
||||
LLDirPickerThread::initClass();
|
||||
|
||||
// *FIX: no error handling here!
|
||||
return true;
|
||||
|
|
@ -5444,7 +5447,7 @@ void LLAppViewer::idle()
|
|||
LLSmoothInterpolation::updateInterpolants();
|
||||
LLMortician::updateClass();
|
||||
LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
|
||||
|
||||
LLDirPickerThread::clearDead();
|
||||
F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
|
||||
|
||||
// Cap out-of-control frame times
|
||||
|
|
|
|||
|
|
@ -77,6 +77,14 @@ LLDirPicker::LLDirPicker() :
|
|||
mFileName(NULL),
|
||||
mLocked(false)
|
||||
{
|
||||
bi.hwndOwner = NULL;
|
||||
bi.pidlRoot = NULL;
|
||||
bi.pszDisplayName = NULL;
|
||||
bi.lpszTitle = NULL;
|
||||
bi.ulFlags = BIF_USENEWUI;
|
||||
bi.lpfn = NULL;
|
||||
bi.lParam = NULL;
|
||||
bi.iImage = 0;
|
||||
}
|
||||
|
||||
LLDirPicker::~LLDirPicker()
|
||||
|
|
@ -84,7 +92,7 @@ LLDirPicker::~LLDirPicker()
|
|||
// nothing
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
if( mLocked )
|
||||
{
|
||||
|
|
@ -99,39 +107,39 @@ BOOL LLDirPicker::getDir(std::string* filename)
|
|||
|
||||
BOOL success = FALSE;
|
||||
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
|
||||
if (blocking)
|
||||
{
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
}
|
||||
|
||||
BROWSEINFO bi;
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
|
||||
|
||||
bi.ulFlags = BIF_USENEWUI;
|
||||
bi.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
|
||||
bi.lpszTitle = NULL;
|
||||
::OleInitialize(NULL);
|
||||
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
|
||||
|
||||
::OleInitialize(NULL);
|
||||
if(pIDL != NULL)
|
||||
{
|
||||
WCHAR buffer[_MAX_PATH] = {'\0'};
|
||||
|
||||
LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);
|
||||
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
|
||||
{
|
||||
// Set the string value.
|
||||
|
||||
if(pIDL != NULL)
|
||||
{
|
||||
WCHAR buffer[_MAX_PATH] = {'\0'};
|
||||
mDir = utf16str_to_utf8str(llutf16string(buffer));
|
||||
success = TRUE;
|
||||
}
|
||||
// free the item id list
|
||||
CoTaskMemFree(pIDL);
|
||||
}
|
||||
|
||||
if(::SHGetPathFromIDList(pIDL, buffer) != 0)
|
||||
{
|
||||
// Set the string value.
|
||||
::OleUninitialize();
|
||||
|
||||
mDir = utf16str_to_utf8str(llutf16string(buffer));
|
||||
success = TRUE;
|
||||
}
|
||||
|
||||
// free the item id list
|
||||
CoTaskMemFree(pIDL);
|
||||
}
|
||||
|
||||
::OleUninitialize();
|
||||
|
||||
send_agent_resume();
|
||||
if (blocking)
|
||||
{
|
||||
send_agent_resume();
|
||||
}
|
||||
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
|
|
@ -167,7 +175,7 @@ void LLDirPicker::reset()
|
|||
|
||||
|
||||
//static
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
LLFilePicker::ELoadFilter filter=LLFilePicker::FFLOAD_DIRECTORY;
|
||||
|
||||
|
|
@ -201,7 +209,7 @@ void LLDirPicker::reset()
|
|||
mFilePicker->reset();
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
reset();
|
||||
|
||||
|
|
@ -256,7 +264,7 @@ void LLDirPicker::reset()
|
|||
{
|
||||
}
|
||||
|
||||
BOOL LLDirPicker::getDir(std::string* filename)
|
||||
BOOL LLDirPicker::getDir(std::string* filename, bool blocking)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -267,3 +275,94 @@ std::string LLDirPicker::getDirName()
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
LLMutex* LLDirPickerThread::sMutex = NULL;
|
||||
std::queue<LLDirPickerThread*> LLDirPickerThread::sDeadQ;
|
||||
|
||||
void LLDirPickerThread::getFile()
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
start();
|
||||
#else
|
||||
run();
|
||||
#endif
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLDirPickerThread::run()
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
bool blocking = false;
|
||||
#else
|
||||
bool blocking = true; // modal
|
||||
#endif
|
||||
|
||||
LLDirPicker picker;
|
||||
|
||||
if (picker.getDir(&mProposedName, blocking))
|
||||
{
|
||||
mResponses.push_back(picker.getDirName());
|
||||
}
|
||||
|
||||
{
|
||||
LLMutexLock lock(sMutex);
|
||||
sDeadQ.push(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::initClass()
|
||||
{
|
||||
sMutex = new LLMutex();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::cleanupClass()
|
||||
{
|
||||
clearDead();
|
||||
|
||||
delete sMutex;
|
||||
sMutex = NULL;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLDirPickerThread::clearDead()
|
||||
{
|
||||
if (!sDeadQ.empty())
|
||||
{
|
||||
LLMutexLock lock(sMutex);
|
||||
while (!sDeadQ.empty())
|
||||
{
|
||||
LLDirPickerThread* thread = sDeadQ.front();
|
||||
thread->notify(thread->mResponses);
|
||||
delete thread;
|
||||
sDeadQ.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLDirPickerThread::LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name)
|
||||
: LLThread("dir picker"),
|
||||
mFilePickedSignal(NULL)
|
||||
{
|
||||
mFilePickedSignal = new dir_picked_signal_t();
|
||||
mFilePickedSignal->connect(cb);
|
||||
}
|
||||
|
||||
LLDirPickerThread::~LLDirPickerThread()
|
||||
{
|
||||
delete mFilePickedSignal;
|
||||
}
|
||||
|
||||
void LLDirPickerThread::notify(const std::vector<std::string>& filenames)
|
||||
{
|
||||
if (!filenames.empty())
|
||||
{
|
||||
if (mFilePickedSignal)
|
||||
{
|
||||
(*mFilePickedSignal)(filenames, mProposedName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,13 @@
|
|||
|
||||
#include "stdtypes.h"
|
||||
|
||||
#include "llthread.h"
|
||||
#include <queue>
|
||||
|
||||
#if LL_WINDOWS
|
||||
#include <shlobj.h>
|
||||
#endif
|
||||
|
||||
#if LL_DARWIN
|
||||
|
||||
// AssertMacros.h does bad things.
|
||||
|
|
@ -53,7 +60,7 @@ public:
|
|||
// calling this before main() is undefined
|
||||
static LLDirPicker& instance( void ) { return sInstance; }
|
||||
|
||||
BOOL getDir(std::string* filename);
|
||||
BOOL getDir(std::string* filename, bool blocking = true);
|
||||
std::string getDirName();
|
||||
|
||||
// clear any lists of buffers or whatever, and make sure the dir
|
||||
|
|
@ -76,11 +83,15 @@ private:
|
|||
LLFilePicker *mFilePicker;
|
||||
#endif
|
||||
|
||||
|
||||
std::string* mFileName;
|
||||
std::string mDir;
|
||||
bool mLocked;
|
||||
|
||||
static LLDirPicker sInstance;
|
||||
#if LL_WINDOWS
|
||||
BROWSEINFO bi;
|
||||
#endif
|
||||
|
||||
public:
|
||||
// don't call these directly please.
|
||||
|
|
@ -88,4 +99,33 @@ public:
|
|||
~LLDirPicker();
|
||||
};
|
||||
|
||||
class LLDirPickerThread : public LLThread
|
||||
{
|
||||
public:
|
||||
|
||||
static std::queue<LLDirPickerThread*> sDeadQ;
|
||||
static LLMutex* sMutex;
|
||||
|
||||
static void initClass();
|
||||
static void cleanupClass();
|
||||
static void clearDead();
|
||||
|
||||
std::vector<std::string> mResponses;
|
||||
std::string mProposedName;
|
||||
|
||||
typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, std::string proposed_name)> dir_picked_signal_t;
|
||||
|
||||
LLDirPickerThread(const dir_picked_signal_t::slot_type& cb, const std::string &proposed_name);
|
||||
~LLDirPickerThread();
|
||||
|
||||
void getFile();
|
||||
|
||||
virtual void run();
|
||||
|
||||
virtual void notify(const std::vector<std::string>& filenames);
|
||||
|
||||
private:
|
||||
dir_picked_signal_t* mFilePickedSignal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -333,6 +333,9 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
gGL.diffuseColor4f(0, 0, 1, 1);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
gGL.diffuseColor4f(0, 1, 0, 1);
|
||||
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
if(shaders)
|
||||
{
|
||||
gHighlightProgram.unbind();
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "llcombobox.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloatergroups.h"
|
||||
#include "llfloaterscriptlimits.h"
|
||||
#include "llavataractions.h"
|
||||
|
|
@ -78,7 +79,6 @@
|
|||
#include "llpanelexperiencelisteditor.h"
|
||||
#include "llpanelexperiencepicker.h"
|
||||
#include "llexperiencecache.h"
|
||||
#include "llweb.h"
|
||||
|
||||
#include "llgroupactions.h"
|
||||
#include "llsdutil_math.h"
|
||||
|
|
@ -569,7 +569,7 @@ void LLPanelLandGeneral::refresh()
|
|||
|
||||
mBtnDeedToGroup->setEnabled(FALSE);
|
||||
mBtnSetGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(LLGridManager::instance().isInSecondLife()); // <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
|
||||
mCheckDeedToGroup ->set(FALSE);
|
||||
mCheckDeedToGroup ->setEnabled(FALSE);
|
||||
|
|
@ -669,7 +669,7 @@ void LLPanelLandGeneral::refresh()
|
|||
mTextClaimDate->setEnabled(FALSE);
|
||||
mTextGroup->setText(getString("none_text"));
|
||||
mTextGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(LLGridManager::instance().isInSecondLife()); // <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -725,12 +725,10 @@ void LLPanelLandGeneral::refresh()
|
|||
mTextClaimDate->setText(claim_date_str);
|
||||
mTextClaimDate->setEnabled(is_leased);
|
||||
|
||||
// <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
|
||||
&& (owner_id == GOVERNOR_LINDEN_ID)
|
||||
&& (parcel->getAuctionID() == 0);
|
||||
mBtnStartAuction->setEnabled(enable_auction || LLGridManager::instance().isInSecondLife());
|
||||
// </FS:Ansariel>
|
||||
mBtnStartAuction->setEnabled(enable_auction);
|
||||
}
|
||||
|
||||
// Display options
|
||||
|
|
@ -1084,32 +1082,20 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
|
|||
// static
|
||||
void LLPanelLandGeneral::onClickStartAuction(void* data)
|
||||
{
|
||||
// <FS:Ansariel> Restore land auction floater for OpenSim
|
||||
//std::string auction_url = "https://places.[GRID]/auctions/";
|
||||
//LLWeb::loadURLExternal(LLWeb::expandURLSubstitutions(auction_url, LLSD()));
|
||||
if (LLGridManager::instance().isInSecondLife())
|
||||
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
|
||||
LLParcel* parcelp = panelp->mParcel->getParcel();
|
||||
if(parcelp)
|
||||
{
|
||||
std::string auction_url = "https://places.[GRID]/auctions/";
|
||||
LLWeb::loadURLExternal(LLWeb::expandURLSubstitutions(auction_url, LLSD()));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
|
||||
LLParcel* parcelp = panelp->mParcel->getParcel();
|
||||
if (parcelp)
|
||||
if(parcelp->getForSale())
|
||||
{
|
||||
if (parcelp->getForSale())
|
||||
{
|
||||
LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
|
||||
}
|
||||
else
|
||||
{
|
||||
//LLFloaterAuction::showInstance();
|
||||
LLFloaterReg::showInstance("auction");
|
||||
}
|
||||
LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
|
||||
}
|
||||
else
|
||||
{
|
||||
//LLFloaterAuction::showInstance();
|
||||
LLFloaterReg::showInstance("auction");
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -1661,16 +1661,15 @@ void LLFloaterPreference::onClickSetCache()
|
|||
|
||||
std::string proposed_name(cur_name);
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
if (! picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeCachePath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
std::string dir_name = picker.getDirName();
|
||||
if (!dir_name.empty() && dir_name != cur_name)
|
||||
void LLFloaterPreference::changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
std::string dir_name = filenames[0];
|
||||
if (!dir_name.empty() && dir_name != proposed_name)
|
||||
{
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));
|
||||
LLNotificationsUtil::add("CacheWillBeMoved");
|
||||
gSavedSettings.setString("NewCacheLocation", dir_name);
|
||||
gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
|
||||
|
|
@ -2848,25 +2847,21 @@ void LLFloaterPreference::onClickLogPath()
|
|||
std::string proposed_name(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
|
||||
mPriorInstantMessageLogPath.clear();
|
||||
|
||||
LLDirPicker& picker = LLDirPicker::instance();
|
||||
//Launches a directory picker and waits for feedback
|
||||
if (!picker.getDir(&proposed_name ) )
|
||||
{
|
||||
return; //Canceled!
|
||||
}
|
||||
|
||||
//Gets the path from the directory picker
|
||||
std::string dir_name = picker.getDirName();
|
||||
|
||||
//Path changed
|
||||
if(proposed_name != dir_name)
|
||||
{
|
||||
gSavedPerAccountSettings.setString("InstantMessageLogPath", dir_name);
|
||||
mPriorInstantMessageLogPath = proposed_name;
|
||||
|
||||
// enable/disable 'Delete transcripts button
|
||||
updateDeleteTranscriptsButton();
|
||||
(new LLDirPickerThread(boost::bind(&LLFloaterPreference::changeLogPath, this, _1, _2), proposed_name))->getFile();
|
||||
}
|
||||
|
||||
void LLFloaterPreference::changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name)
|
||||
{
|
||||
//Path changed
|
||||
if (proposed_name != filenames[0])
|
||||
{
|
||||
gSavedPerAccountSettings.setString("InstantMessageLogPath", filenames[0]);
|
||||
mPriorInstantMessageLogPath = proposed_name;
|
||||
|
||||
// enable/disable 'Delete transcripts button
|
||||
updateDeleteTranscriptsButton();
|
||||
}
|
||||
//[FIX FIRE-2765 : SJ] Enable Reset button when own Chatlogdirectory is set
|
||||
getChildView("reset_logpath")->setEnabled(TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ public:
|
|||
void onClickResetVoice();
|
||||
|
||||
void onClickSetCache();
|
||||
void changeCachePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
void onClickBrowseCache();
|
||||
void onClickBrowseCrashLogs();
|
||||
void onClickBrowseChatLogDir();
|
||||
|
|
@ -200,6 +201,7 @@ public:
|
|||
void resetAllIgnored();
|
||||
void setAllIgnored();
|
||||
void onClickLogPath();
|
||||
void changeLogPath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
bool moveTranscriptsAndLog();
|
||||
//[FIX FIRE-2765 : SJ] Making sure Reset button resets works
|
||||
void onClickResetLogPath();
|
||||
|
|
|
|||
|
|
@ -206,6 +206,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
|
||||
// change z sort of clickable text to be behind buttons
|
||||
sendChildToBack(getChildView("forgot_password_text"));
|
||||
sendChildToBack(getChildView("sign_up_text"));
|
||||
|
||||
LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
|
||||
updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
|
||||
|
|
@ -273,6 +274,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
|
||||
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
|
||||
|
||||
LLTextBox* sign_up_text = getChild<LLTextBox>("sign_up_text");
|
||||
sign_up_text->setClickedCallback(onClickSignUp, NULL);
|
||||
|
||||
// get the web browser control
|
||||
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
|
||||
web_browser->addObserver(this);
|
||||
|
|
@ -923,6 +927,15 @@ void LLPanelLogin::onClickForgotPassword(void*)
|
|||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::onClickSignUp(void*)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
LLWeb::loadURLExternal(sInstance->getString("sign_up_url"));
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ private:
|
|||
static void onClickNewAccount(void*);
|
||||
static void onClickVersion(void*);
|
||||
static void onClickForgotPassword(void*);
|
||||
static void onClickSignUp(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
static void updateServerCombo();
|
||||
|
||||
|
|
|
|||
|
|
@ -134,6 +134,10 @@ U8 string_value_to_click_action(std::string p_value)
|
|||
{
|
||||
return CLICK_ACTION_ZOOM;
|
||||
}
|
||||
if (p_value == "None")
|
||||
{
|
||||
return CLICK_ACTION_DISABLED;
|
||||
}
|
||||
return CLICK_ACTION_TOUCH;
|
||||
}
|
||||
|
||||
|
|
@ -160,6 +164,9 @@ std::string click_action_to_string_value( U8 action)
|
|||
case CLICK_ACTION_ZOOM:
|
||||
return "Zoom";
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
return "None";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,8 +69,8 @@ private:
|
|||
void onQualitySliderCommit(LLUICtrl* ctrl);
|
||||
void onSaveFlyoutCommit(LLUICtrl* ctrl);
|
||||
|
||||
void LLPanelSnapshotLocal::onLocalSaved();
|
||||
void LLPanelSnapshotLocal::onLocalCanceled();
|
||||
void onLocalSaved();
|
||||
void onLocalCanceled();
|
||||
};
|
||||
|
||||
static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
|
||||
|
|
|
|||
|
|
@ -1159,6 +1159,8 @@ static U8 string_value_to_click_action(std::string p_value)
|
|||
return CLICK_ACTION_OPEN;
|
||||
if (p_value == "Zoom")
|
||||
return CLICK_ACTION_ZOOM;
|
||||
if (p_value == "None")
|
||||
return CLICK_ACTION_DISABLED;
|
||||
return CLICK_ACTION_TOUCH;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2065,13 +2065,15 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
|
|||
if(w * h *c > 0) //valid
|
||||
{
|
||||
//make a duplicate to keep the original raw image untouched.
|
||||
raw = raw->scaled(w, h);
|
||||
raw = raw->duplicate();
|
||||
if (raw->isBufferInvalid())
|
||||
{
|
||||
LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
raw->scale(w, h);
|
||||
|
||||
discardlevel += i ;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -323,6 +323,8 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
}
|
||||
}
|
||||
return TRUE;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
return TRUE;
|
||||
default:
|
||||
// nothing
|
||||
break;
|
||||
|
|
@ -507,6 +509,8 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)
|
|||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
cursor = cursor_from_parcel_media(click_action);
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -572,6 +576,8 @@ void LLToolPie::selectionPropertiesReceived()
|
|||
case CLICK_ACTION_OPEN:
|
||||
LLFloaterReg::showInstance("openobject");
|
||||
break;
|
||||
case CLICK_ACTION_DISABLED:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "llcompilequeue.h"
|
||||
#include "llfasttimerview.h"
|
||||
#include "llfloaterabout.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloaterautoreplacesettings.h"
|
||||
#include "llfloateravatar.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
|
|
@ -200,7 +201,6 @@
|
|||
#include "fspanelclassified.h"
|
||||
#include "lggbeamcolormapfloater.h"
|
||||
#include "lggbeammapfloater.h"
|
||||
#include "llfloaterauction.h"
|
||||
#include "llfloaterdisplayname.h"
|
||||
#include "llfloaterscriptrecover.h"
|
||||
#include "llfloatersearchreplace.h"
|
||||
|
|
@ -241,6 +241,7 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
|
||||
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
|
||||
LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
|
||||
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
|
||||
LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
|
||||
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
|
||||
// <FS:Ansariel> [FS Persisted Avatar Render Settings]
|
||||
|
|
@ -453,7 +454,6 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("animation_explorer", "floater_animation_explorer.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<AnimationExplorer>);
|
||||
LLFloaterReg::add("animation_overrider", "floater_ao.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FloaterAO>);
|
||||
LLFloaterReg::add("area_search", "floater_fs_area_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSAreaSearch>);
|
||||
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
|
||||
LLFloaterReg::add("export_collada", "floater_export_collada.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ColladaExportFloater>);
|
||||
LLFloaterReg::add("delete_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteQueue>);
|
||||
LLFloaterReg::add("floater_profile", "floater_profile_view.xml",&LLFloaterReg::build<FSFloaterProfile>);
|
||||
|
|
|
|||
|
|
@ -183,6 +183,96 @@ const U8 AU_FLAGS_NONE = 0x00;
|
|||
const U8 AU_FLAGS_HIDETITLE = 0x01;
|
||||
const U8 AU_FLAGS_CLIENT_AUTOPILOT = 0x02;
|
||||
|
||||
void accept_friendship_coro(std::string url, LLSD notification)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
if (url.empty())
|
||||
{
|
||||
LL_WARNS() << "Empty capability!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
url += "?from=" + payload["from_id"].asString();
|
||||
url += "&agent_name=\"" + LLURI::escape(gAgentAvatarp->getFullname()) + "\"";
|
||||
|
||||
LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS() << "HTTP status, " << status.toTerseString() <<
|
||||
". friendship offer accept failed." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result.has("success") || result["success"].asBoolean() == false)
|
||||
{
|
||||
LL_WARNS() << "Server failed to process accepted friendship. " << httpResults << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void decline_friendship_coro(std::string url, LLSD notification, S32 option)
|
||||
{
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy));
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
|
||||
if (url.empty())
|
||||
{
|
||||
LL_WARNS() << "Empty capability!" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
url += "?from=" + payload["from_id"].asString();
|
||||
|
||||
LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
LL_WARNS() << "HTTP status, " << status.toTerseString() <<
|
||||
". friendship offer decline failed." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!result.has("success") || result["success"].asBoolean() == false)
|
||||
{
|
||||
LL_WARNS() << "Server failed to process declined friendship. " << httpResults << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (option == 1)
|
||||
{
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else if (option == 2)
|
||||
{
|
||||
// start IM session
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
|
@ -193,9 +283,6 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
|||
// this will be skipped if the user offering friendship is blocked
|
||||
if (notification_ptr)
|
||||
{
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
|
||||
switch(option)
|
||||
{
|
||||
case 0:
|
||||
|
|
@ -206,46 +293,73 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
|
|||
const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
|
||||
|
||||
// This will also trigger an onlinenotification if the user is online
|
||||
msg->newMessageFast(_PREHASH_AcceptFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->nextBlockFast(_PREHASH_FolderData);
|
||||
msg->addUUIDFast(_PREHASH_FolderID, fid);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
std::string url = gAgent.getRegionCapability("AcceptFriendship");
|
||||
if (!url.empty())
|
||||
{
|
||||
LLCoros::instance().launch("LLMessageSystem::acceptFriendshipOffer",
|
||||
boost::bind(accept_friendship_coro, url, notification));
|
||||
}
|
||||
else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_AcceptFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->nextBlockFast(_PREHASH_FolderData);
|
||||
msg->addUUIDFast(_PREHASH_FolderID, fid);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
|
||||
LLSD payload = notification["payload"];
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
// add friend to recent people list
|
||||
LLRecentPeople::instance().add(payload["from_id"]);
|
||||
LLNotificationsUtil::add("FriendshipAcceptedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to accept friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1: // Decline
|
||||
{
|
||||
LLSD payload = notification["payload"];
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
// fall-through
|
||||
case 2: // Send IM - decline and start IM session
|
||||
{
|
||||
// decline
|
||||
// We no longer notify other viewers, but we DO still send
|
||||
// the rejection to the simulator to delete the pending userop.
|
||||
msg->newMessageFast(_PREHASH_DeclineFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
// the rejection to the simulator to delete the pending userop.
|
||||
std::string url = gAgent.getRegionCapability("DeclineFriendship");
|
||||
if (!url.empty())
|
||||
{
|
||||
LLCoros::instance().launch("LLMessageSystem::declineFriendshipOffer",
|
||||
boost::bind(decline_friendship_coro, url, notification, option));
|
||||
}
|
||||
else if (payload.has("session_id") && payload["session_id"].asUUID().notNull())
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_DeclineFriendship);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_TransactionBlock);
|
||||
msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
|
||||
msg->sendReliable(LLHost(payload["sender"].asString()));
|
||||
|
||||
// start IM session
|
||||
if(2 == option)
|
||||
{
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
if (option == 1) // due to fall-through
|
||||
{
|
||||
LLNotificationsUtil::add("FriendshipDeclinedByMe",
|
||||
notification["substitutions"], payload);
|
||||
}
|
||||
else if (option == 2)
|
||||
{
|
||||
// start IM session
|
||||
LLAvatarActions::startIM(payload["from_id"].asUUID());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to decline friendship offer, neither capability nor transaction id are accessible" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
default:
|
||||
// close button probably, possibly timed out
|
||||
|
|
@ -4033,6 +4147,110 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
|
|||
}
|
||||
|
||||
|
||||
// sounds can arrive before objects, store them for a short time
|
||||
// Note: this is a workaround for MAINT-4743, real fix would be to make
|
||||
// server send sound along with object update that creates (rezes) the object
|
||||
class PostponedSoundData
|
||||
{
|
||||
public:
|
||||
PostponedSoundData() :
|
||||
mExpirationTime(0)
|
||||
{}
|
||||
PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags);
|
||||
bool hasExpired() { return LLFrameTimer::getTotalSeconds() > mExpirationTime; }
|
||||
|
||||
LLUUID mObjectId;
|
||||
LLUUID mSoundId;
|
||||
LLUUID mOwnerId;
|
||||
F32 mGain;
|
||||
U8 mFlags;
|
||||
static const F64 MAXIMUM_PLAY_DELAY;
|
||||
|
||||
private:
|
||||
F64 mExpirationTime; //seconds since epoch
|
||||
};
|
||||
const F64 PostponedSoundData::MAXIMUM_PLAY_DELAY = 15.0;
|
||||
static F64 postponed_sounds_update_expiration = 0.0;
|
||||
static std::map<LLUUID, PostponedSoundData> postponed_sounds;
|
||||
|
||||
void set_attached_sound(LLViewerObject *objectp, const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
|
||||
{
|
||||
if (LLMuteList::getInstance()->isMuted(object_id)) return;
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
|
||||
|
||||
// Don't play sounds from a region with maturity above current agent maturity
|
||||
LLVector3d pos = objectp->getPositionGlobal();
|
||||
if (!gAgent.canAccessMaturityAtGlobal(pos))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
objectp->setAttachedSound(sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
PostponedSoundData::PostponedSoundData(const LLUUID &object_id, const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const U8 flags)
|
||||
:
|
||||
mObjectId(object_id),
|
||||
mSoundId(sound_id),
|
||||
mOwnerId(owner_id),
|
||||
mGain(gain),
|
||||
mFlags(flags),
|
||||
mExpirationTime(LLFrameTimer::getTotalSeconds() + MAXIMUM_PLAY_DELAY)
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
void update_attached_sounds()
|
||||
{
|
||||
if (postponed_sounds.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
|
||||
std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
|
||||
while (iter != end)
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
|
||||
PostponedSoundData* data = &cur_iter->second;
|
||||
if (data->hasExpired())
|
||||
{
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerObject *objectp = gObjectList.findObject(data->mObjectId);
|
||||
if (objectp)
|
||||
{
|
||||
set_attached_sound(objectp, data->mObjectId, data->mSoundId, data->mOwnerId, data->mGain, data->mFlags);
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
|
||||
}
|
||||
|
||||
//static
|
||||
void clear_expired_postponed_sounds()
|
||||
{
|
||||
if (postponed_sounds_update_expiration > LLFrameTimer::getTotalSeconds())
|
||||
{
|
||||
return;
|
||||
}
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.begin();
|
||||
std::map<LLUUID, PostponedSoundData>::iterator end = postponed_sounds.end();
|
||||
while (iter != end)
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator cur_iter = iter++;
|
||||
PostponedSoundData* data = &cur_iter->second;
|
||||
if (data->hasExpired())
|
||||
{
|
||||
postponed_sounds.erase(cur_iter);
|
||||
}
|
||||
}
|
||||
postponed_sounds_update_expiration = LLFrameTimer::getTotalSeconds() + 2 * PostponedSoundData::MAXIMUM_PLAY_DELAY;
|
||||
}
|
||||
|
||||
// *TODO: Remove this dependency, or figure out a better way to handle
|
||||
// this hack.
|
||||
|
|
@ -4051,7 +4269,12 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data)
|
|||
}
|
||||
|
||||
// Update the object...
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processObjectUpdate(mesgsys, user_data, OUT_FULL);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data)
|
||||
|
|
@ -4067,7 +4290,12 @@ void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data
|
|||
}
|
||||
|
||||
// Update the object...
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_FULL_COMPRESSED);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
|
||||
|
|
@ -4098,7 +4326,12 @@ void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_
|
|||
gObjectData += (U32Bytes)mesgsys->getReceiveSize();
|
||||
}
|
||||
|
||||
S32 old_num_objects = gObjectList.mNumNewObjects;
|
||||
gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED);
|
||||
if (old_num_objects != gObjectList.mNumNewObjects)
|
||||
{
|
||||
update_attached_sounds();
|
||||
}
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_PROCESS_OBJECTS("Process Kill Objects");
|
||||
|
|
@ -4455,27 +4688,27 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data)
|
|||
msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags);
|
||||
|
||||
LLViewerObject *objectp = gObjectList.findObject(object_id);
|
||||
if (!objectp)
|
||||
if (objectp)
|
||||
{
|
||||
// we don't know about this object, just bail
|
||||
return;
|
||||
set_attached_sound(objectp, object_id, sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(object_id)) return;
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
|
||||
|
||||
// Don't play sounds from a region with maturity above current agent maturity
|
||||
LLVector3d pos = objectp->getPositionGlobal();
|
||||
if( !gAgent.canAccessMaturityAtGlobal(pos) )
|
||||
else if (sound_id.notNull())
|
||||
{
|
||||
return;
|
||||
// we don't know about this object yet, probably it has yet to arrive
|
||||
// std::map for dupplicate prevention.
|
||||
postponed_sounds[object_id] = (PostponedSoundData(object_id, sound_id, owner_id, gain, flags));
|
||||
clear_expired_postponed_sounds();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::map<LLUUID, PostponedSoundData>::iterator iter = postponed_sounds.find(object_id);
|
||||
if (iter != postponed_sounds.end())
|
||||
{
|
||||
postponed_sounds.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
objectp->setAttachedSound(sound_id, owner_id, gain, flags);
|
||||
}
|
||||
|
||||
|
||||
void process_attached_sound_gain_change(LLMessageSystem *mesgsys, void **user_data)
|
||||
{
|
||||
F32 gain = 0;
|
||||
|
|
|
|||
|
|
@ -1984,7 +1984,10 @@ void LLViewerRegion::updateNetStats()
|
|||
mLastPacketsLost = mPacketsLost;
|
||||
|
||||
mPacketsIn = cdp->getPacketsIn();
|
||||
// <FS:Ansariel> FIRE-17071: UDP network data measuring is wrong
|
||||
//mBitsIn = 8 * cdp->getBytesIn();
|
||||
mBitsIn = cdp->getBytesIn();
|
||||
// </FS:Ansariel>
|
||||
mPacketsOut = cdp->getPacketsOut();
|
||||
mPacketsLost = cdp->getPacketsLost();
|
||||
mPingDelay = cdp->getPingDelay();
|
||||
|
|
@ -3001,6 +3004,7 @@ void LLViewerRegion::unpackRegionHandshake()
|
|||
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
||||
{
|
||||
capabilityNames.append("AbuseCategories");
|
||||
capabilityNames.append("AcceptFriendship");
|
||||
capabilityNames.append("AgentPreferences");
|
||||
capabilityNames.append("AgentState");
|
||||
capabilityNames.append("AttachmentResources");
|
||||
|
|
@ -3010,6 +3014,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
|||
capabilityNames.append("ChatSessionRequest");
|
||||
capabilityNames.append("CopyInventoryFromNotecard");
|
||||
capabilityNames.append("CreateInventoryCategory");
|
||||
capabilityNames.append("DeclineFriendship");
|
||||
capabilityNames.append("DispatchRegionInfo");
|
||||
capabilityNames.append("DirectDelivery");
|
||||
capabilityNames.append("EnvironmentSettings");
|
||||
|
|
|
|||
|
|
@ -5600,6 +5600,15 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
|
|||
#else
|
||||
boost::filesystem::path b_path(lastSnapshotDir);
|
||||
#endif
|
||||
if (!boost::filesystem::is_directory(b_path))
|
||||
{
|
||||
LLSD args;
|
||||
args["PATH"] = lastSnapshotDir;
|
||||
LLNotificationsUtil::add("SnapshotToLocalDirNotExist", args);
|
||||
resetSnapshotLoc();
|
||||
failure_cb();
|
||||
return;
|
||||
}
|
||||
boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
|
||||
if (b_space.free < image->getDataSize())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6357,6 +6357,7 @@ void LLVivoxVoiceClient::expireVoiceFonts()
|
|||
|
||||
LLSD args;
|
||||
args["URL"] = LLTrans::getString("voice_morphing_url");
|
||||
args["PREMIUM_URL"] = LLTrans::getString("premium_voice_morphing_url");
|
||||
|
||||
// Give a notification if any voice fonts have expired.
|
||||
if (have_expired)
|
||||
|
|
|
|||
|
|
@ -524,6 +524,7 @@ Loading...
|
|||
name="Buy Land..."
|
||||
width="130" />
|
||||
<button
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
label="Linden Sale"
|
||||
|
|
|
|||
|
|
@ -1179,6 +1179,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<view_border
|
||||
left="5"
|
||||
|
|
|
|||
|
|
@ -8742,6 +8742,8 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
|
|||
<unique/>
|
||||
One or more of your subscribed Voice Morphs has expired.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8755,6 +8757,8 @@ One or more of your subscribed Voice Morphs has expired.
|
|||
<unique/>
|
||||
The active Voice Morph has expired, your normal voice settings have been applied.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8768,6 +8772,8 @@ The active Voice Morph has expired, your normal voice settings have been applied
|
|||
<unique/>
|
||||
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
|
||||
[[URL] Click here] to renew your subscription.
|
||||
|
||||
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
|
||||
<tag>fail</tag>
|
||||
<tag>voice</tag>
|
||||
</notification>
|
||||
|
|
@ -8900,6 +8906,11 @@ Failed to save appearance to XML.
|
|||
Failed to save snapshot to [PATH]: Disk is full. [NEED_MEMORY]KB is required but only [FREE_MEMORY]KB is free.
|
||||
</notification>
|
||||
|
||||
<notification icon="notifytip.tga"
|
||||
name="SnapshotToLocalDirNotExist" type="notifytip">
|
||||
Failed to save snapshot to [PATH]: Directory does not exist.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="PresetNotSaved"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@
|
|||
name="forgot_password_url">
|
||||
http://secondlife.com/account/request.php
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="sign_up_url">
|
||||
https://join.secondlife.com/
|
||||
</panel.string>
|
||||
<layout_stack
|
||||
follows="left|right|top"
|
||||
height="172"
|
||||
|
|
@ -149,7 +153,18 @@
|
|||
label="Select grid"
|
||||
layout="topleft"
|
||||
name="server_combo"
|
||||
width="149" />
|
||||
width="149" />
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="sign_up_text"
|
||||
left="778"
|
||||
bottom_delta="-10"
|
||||
width="200">
|
||||
Sign up
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
height="172"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@
|
|||
name="forgot_password_url">
|
||||
http://secondlife.com/account/request.php
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="sign_up_url">
|
||||
https://join.secondlife.com/
|
||||
</panel.string>
|
||||
<layout_stack
|
||||
follows="left|right|top|bottom"
|
||||
width="1024"
|
||||
|
|
@ -168,6 +172,17 @@
|
|||
width="200">
|
||||
Forgotten password
|
||||
</text>
|
||||
<text
|
||||
follows="left|top"
|
||||
font="SansSerifLarge"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
name="sign_up_text"
|
||||
left="432"
|
||||
top="34"
|
||||
width="200">
|
||||
Sign up
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
height="100"
|
||||
|
|
|
|||
|
|
@ -303,10 +303,14 @@
|
|||
label="Open"
|
||||
name="Open"
|
||||
value="Open" />
|
||||
<combo_box.item
|
||||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<panel
|
||||
border="false"
|
||||
|
|
|
|||
|
|
@ -474,6 +474,7 @@
|
|||
</text>
|
||||
|
||||
<button
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
height="20"
|
||||
label="Linden Sale"
|
||||
|
|
|
|||
|
|
@ -1177,6 +1177,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<view_border
|
||||
left="5"
|
||||
|
|
|
|||
|
|
@ -306,6 +306,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<panel
|
||||
border="false"
|
||||
|
|
|
|||
|
|
@ -1177,6 +1177,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<view_border
|
||||
left="5"
|
||||
|
|
|
|||
|
|
@ -306,6 +306,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<panel
|
||||
border="false"
|
||||
|
|
|
|||
|
|
@ -474,6 +474,7 @@
|
|||
</text>
|
||||
|
||||
<button
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
height="20"
|
||||
label="Linden Sale"
|
||||
|
|
|
|||
|
|
@ -1178,6 +1178,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<view_border
|
||||
left="5"
|
||||
|
|
|
|||
|
|
@ -307,6 +307,10 @@
|
|||
label="Zoom"
|
||||
name="Zoom"
|
||||
value="Zoom" />
|
||||
<combo_box.item
|
||||
label="None"
|
||||
name="None"
|
||||
value="None" />
|
||||
</combo_box>
|
||||
<panel
|
||||
border="false"
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ namespace tut
|
|||
std::string("https://secondlife.com/helpers/"));
|
||||
ensure_equals("Agni login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
|
||||
std::string("http://viewer-login.agni.lindenlab.com/"));
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
ensure("Agni is a system grid",
|
||||
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
|
||||
|
||||
|
|
@ -261,7 +261,7 @@ namespace tut
|
|||
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
|
||||
ensure_equals("Aditi login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
|
||||
std::string("http://viewer-login.agni.lindenlab.com/"));
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
ensure("Aditi is a system grid",
|
||||
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
|
||||
}
|
||||
|
|
@ -309,7 +309,7 @@ namespace tut
|
|||
std::string("https://secondlife.com/helpers/"));
|
||||
ensure_equals("Agni login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
|
||||
std::string("http://viewer-login.agni.lindenlab.com/"));
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
ensure("Agni is a system grid",
|
||||
LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com"));
|
||||
|
||||
|
|
@ -333,7 +333,7 @@ namespace tut
|
|||
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
|
||||
ensure_equals("Aditi login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
|
||||
std::string("http://viewer-login.agni.lindenlab.com/"));
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
ensure("Aditi is a system grid",
|
||||
LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com"));
|
||||
|
||||
|
|
@ -422,7 +422,7 @@ namespace tut
|
|||
std::string("https://secondlife.com/helpers/"));
|
||||
ensure_equals("getLoginPage",
|
||||
LLGridManager::getInstance()->getLoginPage(),
|
||||
std::string("http://viewer-login.agni.lindenlab.com/"));
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
ensure_equals("update url base for Agni", // relies on agni being the default
|
||||
std::string("https://update.secondlife.com/update"),
|
||||
LLGridManager::getInstance()->getUpdateServiceURL());
|
||||
|
|
|
|||
Loading…
Reference in New Issue