Merge viewer-neko

master
Ansariel 2018-06-22 22:22:26 +02:00
commit 4c4b76ab37
38 changed files with 642 additions and 152 deletions

View File

@ -221,7 +221,6 @@ Ansariel Hiller
STORM-2151
MAINT-6917
MAINT-8085
STORM-2122
Aralara Rajal
Arare Chantilly
CHUIBUG-191

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -524,6 +524,7 @@ Loading...
name="Buy Land..."
width="130" />
<button
enabled="false"
follows="left|top"
height="23"
label="Linden Sale"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -474,6 +474,7 @@
</text>
<button
enabled="false"
follows="left|top"
height="20"
label="Linden Sale"

View File

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

View File

@ -306,6 +306,10 @@
label="Zoom"
name="Zoom"
value="Zoom" />
<combo_box.item
label="None"
name="None"
value="None" />
</combo_box>
<panel
border="false"

View File

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

View File

@ -306,6 +306,10 @@
label="Zoom"
name="Zoom"
value="Zoom" />
<combo_box.item
label="None"
name="None"
value="None" />
</combo_box>
<panel
border="false"

View File

@ -474,6 +474,7 @@
</text>
<button
enabled="false"
follows="left|top"
height="20"
label="Linden Sale"

View File

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

View File

@ -307,6 +307,10 @@
label="Zoom"
name="Zoom"
value="Zoom" />
<combo_box.item
label="None"
name="None"
value="None" />
</combo_box>
<panel
border="false"

View File

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