Merge Firestorm LGPL

master
Ansariel 2017-08-23 17:53:48 +02:00
commit c47b8c27ba
100 changed files with 1561 additions and 404 deletions

View File

@ -565,3 +565,4 @@ cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release
022709ef76a331cac1ba6ef1a6da8a5e9ef63f5a 5.0.4-release
b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release
3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release
abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release

View File

@ -828,6 +828,8 @@ Kitty Barnett
MAINT-6153
MAINT-6154
MAINT-6568
STORM-2149
MAINT-7581
Kolor Fall
Komiko Okamoto
Korvel Noh

View File

@ -129,6 +129,7 @@ LLMotion *LLMotionRegistry::createMotion( const LLUUID &id )
//-----------------------------------------------------------------------------
LLMotionController::LLMotionController()
: mTimeFactor(sCurrentTimeFactor),
mUpdateFactor(1.f), // <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
mCharacter(NULL),
mAnimTime(0.f),
mPrevTimerElapsed(0.f),
@ -825,7 +826,10 @@ void LLMotionController::updateMotions(bool force_update)
// Update timing info for this time step.
if (!mPaused)
{
F32 update_time = mAnimTime + delta_time * mTimeFactor;
// <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
//F32 update_time = mAnimTime + delta_time * mTimeFactor;
F32 update_time = mAnimTime + delta_time * mTimeFactor * mUpdateFactor;
// </FS:Ansariel>
if (use_quantum)
{
F32 time_interval = fmodf(update_time, mTimeStep);

View File

@ -154,6 +154,9 @@ public:
void setTimeFactor(F32 time_factor);
F32 getTimeFactor() const { return mTimeFactor; }
// <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
void setUpdateFactor(F32 update_factor) { mUpdateFactor = update_factor; }
motion_list_t& getActiveMotions() { return mActiveMotions; }
void incMotionCounts(S32& num_motions, S32& num_loading_motions, S32& num_loaded_motions, S32& num_active_motions, S32& num_deprecated_motions);
@ -191,6 +194,7 @@ protected:
protected:
F32 mTimeFactor; // 1.f for normal speed
static F32 sCurrentTimeFactor; // Value to use for initialization
F32 mUpdateFactor; // <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
static LLMotionRegistry sRegistry;
LLPoseBlender mPoseBlender;

View File

@ -127,9 +127,12 @@ const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES;
// We want to span a few windows to allow transport to slow
// after onset of the throttles and then recover without a final
// failure. Other systems may need other constants.
const int HTTP_RETRY_COUNT_DEFAULT = 8;
const int HTTP_RETRY_COUNT_DEFAULT = 5;
const int HTTP_RETRY_COUNT_MIN = 0;
const int HTTP_RETRY_COUNT_MAX = 100;
const HttpTime HTTP_RETRY_BACKOFF_MIN_DEFAULT = 1E6L; // 1 sec
const HttpTime HTTP_RETRY_BACKOFF_MAX_DEFAULT = 5E6L; // 5 sec
const HttpTime HTTP_RETRY_BACKOFF_MAX = 20E6L; // 20 sec
const int HTTP_REDIRECTS_DEFAULT = 10;

View File

@ -142,6 +142,8 @@ HttpOpRequest::HttpOpRequest()
mPolicy503Retries(0),
mPolicyRetryAt(HttpTime(0)),
mPolicyRetryLimit(HTTP_RETRY_COUNT_DEFAULT),
mPolicyMinRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MIN_DEFAULT)),
mPolicyMaxRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MAX_DEFAULT)),
mCallbackSSLVerify(NULL)
{
// *NOTE: As members are added, retry initialization/cleanup
@ -438,6 +440,9 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id,
mPolicyRetryLimit = options->getRetries();
mPolicyRetryLimit = llclamp(mPolicyRetryLimit, HTTP_RETRY_COUNT_MIN, HTTP_RETRY_COUNT_MAX);
mTracing = (std::max)(mTracing, llclamp(options->getTrace(), HTTP_TRACE_MIN, HTTP_TRACE_MAX));
mPolicyMinRetryBackoff = llclamp(options->getMinBackoff(), HttpTime(0), HTTP_RETRY_BACKOFF_MAX);
mPolicyMaxRetryBackoff = llclamp(options->getMaxBackoff(), mPolicyMinRetryBackoff, HTTP_RETRY_BACKOFF_MAX);
}
}

View File

@ -233,6 +233,8 @@ public:
int mPolicy503Retries;
HttpTime mPolicyRetryAt;
int mPolicyRetryLimit;
HttpTime mPolicyMinRetryBackoff; // initial delay between retries (mcs)
HttpTime mPolicyMaxRetryBackoff;
}; // end class HttpOpRequest

View File

@ -152,20 +152,16 @@ void HttpPolicy::addOp(const HttpOpRequest::ptr_t &op)
void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)
{
static const HttpTime retry_deltas[] =
{
250000, // 1st retry in 0.25 S, etc...
500000,
1000000,
2000000,
5000000 // ... to every 5.0 S.
};
static const int delta_max(int(LL_ARRAY_SIZE(retry_deltas)) - 1);
static const HttpStatus error_503(503);
const HttpTime now(totalTime());
const int policy_class(op->mReqPolicy);
HttpTime delta(retry_deltas[llclamp(op->mPolicyRetries, 0, delta_max)]);
HttpTime delta_min = op->mPolicyMinRetryBackoff;
HttpTime delta_max = op->mPolicyMaxRetryBackoff;
// mPolicyRetries limited to 100
U32 delta_factor = op->mPolicyRetries <= 10 ? 1 << op->mPolicyRetries : 1024;
HttpTime delta = llmin(delta_min * delta_factor, delta_max);
bool external_delta(false);
if (op->mReplyRetryAfter > 0 && op->mReplyRetryAfter < 30)

View File

@ -39,6 +39,8 @@ HttpOptions::HttpOptions() :
mTimeout(HTTP_REQUEST_TIMEOUT_DEFAULT),
mTransferTimeout(HTTP_REQUEST_XFER_TIMEOUT_DEFAULT),
mRetries(HTTP_RETRY_COUNT_DEFAULT),
mMinRetryBackoff(HTTP_RETRY_BACKOFF_MIN_DEFAULT),
mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),
mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),
mFollowRedirects(true),
mVerifyPeer(false),
@ -81,6 +83,16 @@ void HttpOptions::setRetries(unsigned int retries)
mRetries = retries;
}
void HttpOptions::setMinBackoff(HttpTime delay)
{
mMinRetryBackoff = delay;
}
void HttpOptions::setMaxBackoff(HttpTime delay)
{
mMaxRetryBackoff = delay;
}
void HttpOptions::setUseRetryAfter(bool use_retry)
{
mUseRetryAfter = use_retry;

View File

@ -101,13 +101,31 @@ public:
/// Sets the number of retries on an LLCore::HTTPRequest before the
/// request fails.
// Default: 8
// Default: 5
void setRetries(unsigned int retries);
unsigned int getRetries() const
{
return mRetries;
}
/// Sets minimal delay before request retries. In microseconds.
/// HttpPolicy will increase delay from min to max with each retry
// Default: 1 000 000 mcs
void setMinBackoff(HttpTime delay);
HttpTime getMinBackoff() const
{
return mMinRetryBackoff;
}
/// Sets maximum delay before request retries. In microseconds.
/// HttpPolicy will increase delay from min to max with each retry
// Default: 5 000 000 mcs
void setMaxBackoff(HttpTime delay);
HttpTime getMaxBackoff() const
{
return mMaxRetryBackoff;
}
// Default: true
void setUseRetryAfter(bool use_retry);
bool getUseRetryAfter() const
@ -166,6 +184,8 @@ protected:
unsigned int mTimeout;
unsigned int mTransferTimeout;
unsigned int mRetries;
HttpTime mMinRetryBackoff;
HttpTime mMaxRetryBackoff;
bool mUseRetryAfter;
bool mFollowRedirects;
bool mVerifyPeer;

View File

@ -112,10 +112,10 @@ void LLPngWrapper::readDataCallback(png_structp png_ptr, png_bytep dest, png_siz
void LLPngWrapper::writeDataCallback(png_structp png_ptr, png_bytep src, png_size_t length)
{
PngDataInfo *dataInfo = (PngDataInfo *) png_get_io_ptr(png_ptr);
if (dataInfo->mOffset + length > dataInfo->mDataSize)
{
png_error(png_ptr, "Data write error. Requested data size exceeds available data size.");
return;
if (dataInfo->mOffset + length > dataInfo->mDataSize)
{
png_error(png_ptr, "Data write error. Requested data size exceeds available data size.");
return;
}
U8 *dest = &dataInfo->mData[dataInfo->mOffset];
memcpy(dest, src, length);

View File

@ -1319,7 +1319,7 @@ void LLVertexBuffer::createGLIndices(U32 size)
void LLVertexBuffer::destroyGLBuffer()
{
if (mGLBuffer)
if (mGLBuffer || mMappedData)
{
if (mMappedDataUsingVBOs)
{
@ -1339,7 +1339,7 @@ void LLVertexBuffer::destroyGLBuffer()
void LLVertexBuffer::destroyGLIndices()
{
if (mGLIndices)
if (mGLIndices || mMappedIndexData)
{
if (mMappedIndexDataUsingVBOs)
{

View File

@ -102,6 +102,18 @@ void LLCloseAllFoldersFunctor::doFolder(LLFolderViewFolder* folder)
void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)
{ }
//---------------------------------------------------------------------------
void LLAllDescendentsPassedFilter::doFolder(LLFolderViewFolder* folder)
{
mAllDescendentsPassedFilter &= (folder) && (folder->passedFilter()) && (folder->descendantsPassedFilter());
}
void LLAllDescendentsPassedFilter::doItem(LLFolderViewItem* item)
{
mAllDescendentsPassedFilter &= (item) && (item->passedFilter());
}
///----------------------------------------------------------------------------
/// Class LLFolderViewScrollContainer
///----------------------------------------------------------------------------

View File

@ -409,6 +409,18 @@ public:
virtual void doItem(LLFolderViewItem* item);
};
class LLAllDescendentsPassedFilter : public LLFolderViewFunctor
{
public:
LLAllDescendentsPassedFilter() : mAllDescendentsPassedFilter(true) {}
/*virtual*/ ~LLAllDescendentsPassedFilter() {}
/*virtual*/ void doFolder(LLFolderViewFolder* folder);
/*virtual*/ void doItem(LLFolderViewItem* item);
bool allDescendentsPassedFilter() const { return mAllDescendentsPassedFilter; }
protected:
bool mAllDescendentsPassedFilter;
};
// Flags for buildContextMenu()
const U32 SUPPRESS_OPEN_ITEM = 0x1;
const U32 FIRST_SELECTED_ITEM = 0x2;

View File

@ -1277,6 +1277,11 @@ BOOL LLFolderViewFolder::needsArrange()
return mLastArrangeGeneration < getRoot()->getArrangeGeneration();
}
bool LLFolderViewFolder::descendantsPassedFilter(S32 filter_generation)
{
return getViewModelItem()->descendantsPassedFilter(filter_generation);
}
// Passes selection information on to children and record selection
// information if necessary.
BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,

View File

@ -3353,6 +3353,7 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
if (getHighlightedItem())
{
clearHoverItem();
LLMenuGL::setKeyboardMode(FALSE);
}
else
{
@ -3799,10 +3800,10 @@ BOOL LLMenuHolderGL::hideMenus()
{
return FALSE;
}
LLMenuGL::setKeyboardMode(FALSE);
BOOL menu_visible = hasVisibleMenu();
if (menu_visible)
{
LLMenuGL::setKeyboardMode(FALSE);
// clicked off of menu, hide them all
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{

View File

@ -67,7 +67,8 @@ LLNotificationForm::FormIgnore::FormIgnore()
: text("text"),
control("control"),
invert_control("invert_control", false),
save_option("save_option", false)
save_option("save_option", false),
session_only("session_only", false)
{}
LLNotificationForm::FormButton::FormButton()
@ -126,6 +127,7 @@ bool handleIgnoredNotification(const LLSD& payload)
switch(form->getIgnoreType())
{
case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE:
case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY:
response = pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON);
break;
case LLNotificationForm::IGNORE_WITH_LAST_RESPONSE:
@ -198,7 +200,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica
if (!p.ignore.save_option)
{
mIgnore = IGNORE_WITH_DEFAULT_RESPONSE;
mIgnore = p.ignore.session_only ? IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY : IGNORE_WITH_DEFAULT_RESPONSE;
}
else
{
@ -427,6 +429,7 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mLogToChat(p.log_to_chat),
mLogToIM(p.log_to_im),
mShowToast(p.show_toast),
mFadeToast(p.fade_toast),
mSoundName("")
{
if (p.sound.isProvided() && LLUI::sSettingGroups["config"]
@ -950,6 +953,11 @@ bool LLNotification::canShowToast() const
return mTemplatep->mShowToast;
}
bool LLNotification::canFadeToast() const
{
return mTemplatep->mFadeToast;
}
bool LLNotification::hasFormElements() const
{
return mTemplatep->mForm->getNumElements() != 0;
@ -1801,6 +1809,18 @@ bool LLNotifications::getIgnoreAllNotifications()
{
return mIgnoreAllNotifications;
}
void LLNotifications::setIgnored(const std::string& name, bool ignored)
{
LLNotificationTemplatePtr templatep = getTemplate(name);
templatep->mForm->setIgnored(ignored);
}
bool LLNotifications::getIgnored(const std::string& name)
{
LLNotificationTemplatePtr templatep = getTemplate(name);
return (mIgnoreAllNotifications) || ( (templatep->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) && (templatep->mForm->getIgnored()) );
}
bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
{

View File

@ -180,6 +180,7 @@ public:
Optional<bool> save_option;
Optional<std::string> control;
Optional<bool> invert_control;
Optional<bool> session_only;
FormIgnore();
};
@ -234,7 +235,8 @@ public:
typedef enum e_ignore_type
{
IGNORE_NO,
IGNORE_WITH_DEFAULT_RESPONSE,
IGNORE_WITH_DEFAULT_RESPONSE,
IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY,
IGNORE_WITH_LAST_RESPONSE,
IGNORE_SHOW_AGAIN
} EIgnoreType;
@ -564,6 +566,7 @@ public:
bool canLogToChat() const;
bool canLogToIM() const;
bool canShowToast() const;
bool canFadeToast() const;
bool hasFormElements() const;
void playSound();
@ -969,6 +972,9 @@ public:
void setIgnoreAllNotifications(bool ignore);
bool getIgnoreAllNotifications();
void setIgnored(const std::string& name, bool ignored);
bool getIgnored(const std::string& name);
bool isVisibleByRules(LLNotificationPtr pNotification);
private:

View File

@ -177,6 +177,7 @@ struct LLNotificationTemplate
Optional<bool> persist,
log_to_im,
show_toast,
fade_toast,
log_to_chat,
force_urls_external;
Optional<std::string> functor,
@ -199,6 +200,7 @@ struct LLNotificationTemplate
Params()
: name("name"),
persist("persist", false),
fade_toast("fade_toast", true),
log_to_im("log_to_im", false),
show_toast("show_toast", true),
log_to_chat("log_to_chat", true),
@ -316,6 +318,7 @@ struct LLNotificationTemplate
bool mLogToChat;
bool mLogToIM;
bool mShowToast;
bool mFadeToast;
};
#endif //LL_LLNOTIFICATION_TEMPLATE_H

View File

@ -428,6 +428,21 @@ S32 LLScrollListCtrl::getItemCount() const
return mItemList.size();
}
BOOL LLScrollListCtrl::hasSelectedItem() const
{
item_list::iterator iter;
for (iter = mItemList.begin(); iter < mItemList.end(); )
{
LLScrollListItem* itemp = *iter;
if (itemp && itemp->getSelected())
{
return TRUE;
}
iter++;
}
return FALSE;
}
// virtual LLScrolListInterface function (was deleteAllItems)
void LLScrollListCtrl::clearRows()
{

View File

@ -206,6 +206,8 @@ public:
virtual BOOL isSelected(const LLSD& value) const;
BOOL hasSelectedItem() const;
BOOL handleClick(S32 x, S32 y, MASK mask);
BOOL selectFirstItem();
BOOL selectNthItem( S32 index );

View File

@ -135,6 +135,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
mEditor->setFocusLostCallback( boost::bind(&LLSpinCtrl::onEditorLostFocus, _1, this ));
if (p.allow_digits_only)
{
mEditor->setPrevalidateInput(LLTextValidate::validateNonNegativeS32NoSpace);
@ -276,6 +277,31 @@ void LLSpinCtrl::onEditorGainFocus( LLFocusableElement* caller, void *userdata )
self->onFocusReceived();
}
// static
void LLSpinCtrl::onEditorLostFocus( LLFocusableElement* caller, void *userdata )
{
LLSpinCtrl* self = (LLSpinCtrl*) userdata;
llassert( caller == self->mEditor );
self->onFocusLost();
std::string text = self->mEditor->getText();
LLLocale locale(LLLocale::USER_LOCALE);
F32 val = (F32)atof(text.c_str());
F32 saved_val = self->getValueF32();
if (saved_val != val && !self->mEditor->isDirty())
{
// Editor was focused when value update arrived, string
// in editor is different from one in spin control.
// Since editor is not dirty, it won't commit, so either
// attempt to commit value from editor or revert to a more
// recent value from spin control
self->updateEditor();
}
}
void LLSpinCtrl::setValue(const LLSD& value )
{
F32 v = (F32)value.asReal();

View File

@ -98,6 +98,7 @@ public:
void onEditorCommit(const LLSD& data);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
static void onEditorLostFocus(LLFocusableElement* caller, void *userdata);
static void onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);
void onUpBtn(const LLSD& data);

View File

@ -108,8 +108,13 @@ LLDir::~LLDir()
std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)
{
//Returns a vector of fullpath filenames.
boost::filesystem::path p (dirname);
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
boost::filesystem::path p(utf8str_to_utf16str(dirname));
#else
boost::filesystem::path p(dirname);
#endif
std::vector<std::string> v;
if (exists(p))
@ -199,7 +204,12 @@ U32 LLDir::deleteDirAndContents(const std::string& dir_name)
try
{
boost::filesystem::path dir_path(dir_name);
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
boost::filesystem::path dir_path(utf8str_to_utf16str(dir_name));
#else
boost::filesystem::path dir_path(dir_name);
#endif
if (boost::filesystem::exists (dir_path))
{
if (!boost::filesystem::is_empty (dir_path))

View File

@ -51,16 +51,11 @@ private:
LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
: mIsValid(false)
{
// <FS:ND> Unicode path on Windows need some extra handling
// fs::path dir_path(dirname);
#ifdef LL_WINDOWS
fs::path dir_path( utf8str_to_utf16str(dirname) );
#ifdef LL_WINDOWS // or BOOST_WINDOWS_API
fs::path dir_path(utf8str_to_utf16str(dirname));
#else
fs::path dir_path(dirname);
#endif
// </FS:ND>
#endif
bool is_dir = false;

View File

@ -35,6 +35,7 @@
#undef INITGUID
#include <wbemidl.h>
#include <comdef.h>
#include <boost/tokenizer.hpp>
@ -206,6 +207,160 @@ HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
return E_FAIL;
}
//Getting the version of graphics controller driver via WMI
std::string LLDXHardware::getDriverVersionWMI()
{
std::string mDriverVersion;
HRESULT hrCoInitialize = S_OK;
HRESULT hres;
hrCoInitialize = CoInitialize(0);
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hres))
{
LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hres << LL_ENDL;
return std::string(); // Program has failed.
}
IWbemServices *pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << hres << LL_ENDL;
pLoc->Release();
CoUninitialize();
return std::string(); // Program has failed.
}
LL_DEBUGS("AppInit") << "Connected to ROOT\\CIMV2 WMI namespace" << LL_ENDL;
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hres << LL_ENDL;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return std::string(); // Program has failed.
}
IEnumWbemClassObject* pEnumerator = NULL;
// Get the data from the query
ULONG uReturn = 0;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_VideoController"), //Consider using Availability to filter out disabled controllers
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hres << LL_ENDL;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return std::string(); // Program has failed.
}
while (pEnumerator)
{
IWbemClassObject *pclsObj = NULL;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
break; // If quantity less then 1.
}
VARIANT vtProp;
// Get the value of the Name property
hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 0, 0);
if (FAILED(hr))
{
LL_WARNS("AppInit") << "Query for name property failed." << " Error code = 0x" << hr << LL_ENDL;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return std::string(); // Program has failed.
}
// use characters in the returned driver version
BSTR driverVersion(vtProp.bstrVal);
//convert BSTR to std::string
std::wstring ws(driverVersion, SysStringLen(driverVersion));
std::string str(ws.begin(), ws.end());
LL_INFOS("AppInit") << " DriverVersion : " << str << LL_ENDL;
if (mDriverVersion.empty())
{
mDriverVersion = str;
}
else if (mDriverVersion != str)
{
LL_WARNS("DriverVersion") << "Different versions of drivers. Version of second driver : " << str << LL_ENDL;
}
VariantClear(&vtProp);
pclsObj->Release();
}
// Cleanup
// ========
if (pSvc)
{
pSvc->Release();
}
if (pLoc)
{
pLoc->Release();
}
if (pEnumerator)
{
pEnumerator->Release();
}
if (SUCCEEDED(hrCoInitialize))
{
CoUninitialize();
}
return mDriverVersion;
}
void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPropValue, int outputSize)
{
HRESULT hr;

View File

@ -91,6 +91,8 @@ public:
BOOL getInfo(BOOL vram_only, bool disable_wmi);
// </FS:Ansariel>
std::string getDriverVersionWMI();
S32 getVRAM() const { return mVRAM; }
LLSD getDisplayInfo();

View File

@ -1,34 +0,0 @@
We no longer use lscript in Firestorm. legacy LSO compilation is no longer used in
Second Life or OpenSim, and this removes the dependency on Bison for building along
with continued compatibility problems with the build system (OSX 10.8, Opensuse 12.3, etc)
This directory is not used as of Rev 34229.
--
Cinder
Please enjoy this ascii-art.
____
\%%%%%%;.
\%%%%%%%%;..
.\. (%%%%%%%%%%%%;.
.;%%%;. %%%%%%%%%%%%%%%%%;.
%%%%%%%%; %%%%%%%%%%%%%%%%%%%%%;.
%%%%%%%%%)__(%%%%%%%%%%%%%%%%%%%%%%%%;.
;%%%%%% /%%%%%\ %%%%%%%%%%%%%%%%%%%%%%%;
\%% /%/'''\%%%\ %%%%%%%%%%%%%%%%%%%%%%%;
'%%%%%%%\. \%%|/%%%%%%%%%%%%%%%%%%%%%%; %%
.;%%%%%%%%%%\|%%%%%%%%%%%%%%%%%%%%%%%%%% %%%
(%CCC%%%%CCC%\%%%%%%%%%%%%%%%%%%%%%%%%%/ %%%%
%% !/ \%%%%%%%%%%%%%%%%%%%%%%/ %%%%%%
.% %%% \%%%%%%%%%%%%%/'%%%%%%%%%
.__\\/__. .%%% o o %%%% %%%%%%%%%%%/'%%%%%%%%%%%
\.;%%%%%%%%%;.'%% %%%% ,%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%/ %___.!. /%%%% ,%%%%%%%% \%%%%%%%%%%%%%
\%% %%% %%/ %%%%%%\ /%%%% ,%%%%%%%%% |%%%%%%%%%%%%%
/%% %%% %% %%%%%%%)?**&%%%% ,%%%%%%%%%%; |%%%%%%%%%%%%%
%% %%% %% %%%%%%%%%%%%%/ ,%%%%%%%%%%%/ /%%%%%%%%%%%%%%
/%%% %%%%% %%% %%%%%%%;/',;/%%%%%%%%%;;../%%%%%%%%%%%%%%%%%
%%%%%%/'''\%%%%%% ='''\\ \%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//'' ''\\

View File

@ -7811,12 +7811,12 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>10.0</real>
<real>40.0</real>
</map>
<key>LoginSRVPump</key>
<map>
<key>Comment</key>
<string>Name of the message pump that handles SRV request</string>
<string>Name of the message pump that handles SRV request (deprecated)</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>

View File

@ -40,18 +40,20 @@
#include "llpanel.h"
#include "lluictrlfactory.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
#include "llcallingcard.h" //for LLAvatarTracker
#include "llagent.h"
#include "llagentdata.h"
#include "llavataractions.h"
#include "llavatariconctrl.h"
#include "llcallingcard.h" //for LLAvatarTracker
#include "llgroupactions.h"
#include "llgroupmgr.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltrans.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llmutelist.h"
#include "llstylemap.h"
#include "llslurl.h"
#include "lllayoutstack.h"
#include "llagent.h"
#include "llnotificationsutil.h"
#include "lltoastnotifypanel.h"
#include "lltooltip.h"
@ -202,6 +204,161 @@ public:
return false;
}
void banGroupMember(const LLUUID& participant_uuid)
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return;
}
gdatap->banMemberById(participant_uuid);
}
bool canBanInGroup()
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return false;
}
if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
return false;
}
bool canBanGroupMember(const LLUUID& participant_uuid)
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return false;
}
if (gdatap->mPendingBanRequest)
{
return false;
}
if (gAgentID == getAvatarId())
{
//Don't ban self
return false;
}
if (gdatap->isRoleMemberDataComplete())
{
if (gdatap->mMembers.size())
{
LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find(participant_uuid);
if (mi != gdatap->mMembers.end())
{
LLGroupMemberData* member_data = (*mi).second;
// Is the member an owner?
if (member_data && member_data->isInRole(gdatap->mOwnerRole))
{
return false;
}
if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
}
}
}
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(participant_uuid).get();
if (speakerp
&& gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
}
return false;
}
bool isGroupModerator()
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (!speaker_mgr)
{
LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
return false;
}
// Is session a group call/chat?
if(gAgent.isInGroup(mSessionID))
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(gAgentID).get();
// Is agent a moderator?
return speakerp && speakerp->mIsModerator;
}
return false;
}
bool canModerate(const std::string& userdata)
{
// only group moderators can perform actions related to this "enable callback"
if (!isGroupModerator() || gAgentID == getAvatarId())
{
return false;
}
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (!speaker_mgr)
{
return false;
}
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (!speakerp)
{
return false;
}
bool voice_channel = speakerp->isInVoiceChannel();
if ("can_moderate_voice" == userdata)
{
return voice_channel;
}
else if ("can_mute" == userdata)
{
return voice_channel && (speakerp->mStatus != LLSpeaker::STATUS_MUTED);
}
else if ("can_unmute" == userdata)
{
return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
}
else if ("can_allow_text_chat" == userdata)
{
return true;
}
return false;
}
void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
{
std::string level = userdata.asString();
@ -280,11 +437,36 @@ public:
}
else if(level == "block_unblock")
{
mute(getAvatarId(), LLMute::flagVoiceChat);
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
}
else if(level == "mute_unmute")
{
mute(getAvatarId(), LLMute::flagTextChat);
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagTextChat);
}
else if(level == "toggle_allow_text_chat")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
speaker_mgr->toggleAllowTextChat(getAvatarId());
}
else if(level == "group_mute")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->moderateVoiceParticipant(getAvatarId(), false);
}
}
else if(level == "group_unmute")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->moderateVoiceParticipant(getAvatarId(), true);
}
}
else if(level == "ban_member")
{
banGroupMember(getAvatarId());
}
}
@ -300,24 +482,69 @@ public:
{
return LLMuteList::getInstance()->isMuted(getAvatarId(), LLMute::flagTextChat);
}
else if (level == "is_allowed_text_chat")
{
if (gAgent.isInGroup(mSessionID))
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
const LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId());
if (NULL != speakerp)
{
return !speakerp->mModeratorMutedText;
}
}
return false;
}
return false;
}
void mute(const LLUUID& participant_id, U32 flags)
bool onAvatarIconContextMenuItemEnabled(const LLSD& userdata)
{
BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
LLAvatarName av_name;
LLAvatarNameCache::get(participant_id, &av_name);
LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT);
std::string level = userdata.asString();
if (!is_muted)
if (level == "can_allow_text_chat" || level == "can_mute" || level == "can_unmute")
{
LLMuteList::getInstance()->add(mute, flags);
return canModerate(userdata);
}
else
else if (level == "can_ban_member")
{
LLMuteList::getInstance()->remove(mute, flags);
return canBanGroupMember(getAvatarId());
}
return false;
}
bool onAvatarIconContextMenuItemVisible(const LLSD& userdata)
{
std::string level = userdata.asString();
if (level == "show_mute")
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (speakerp)
{
return speakerp->isInVoiceChannel() && speakerp->mStatus != LLSpeaker::STATUS_MUTED;
}
}
return false;
}
else if (level == "show_unmute")
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (speakerp)
{
return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
}
}
return false;
}
return false;
}
BOOL postBuild()
@ -327,6 +554,8 @@ public:
registrar.add("AvatarIcon.Action", boost::bind(&FSChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
registrar_enable.add("AvatarIcon.Check", boost::bind(&FSChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
registrar_enable.add("AvatarIcon.Enable", boost::bind(&FSChatHistoryHeader::onAvatarIconContextMenuItemEnabled, this, _2));
registrar_enable.add("AvatarIcon.Visible", boost::bind(&FSChatHistoryHeader::onAvatarIconContextMenuItemVisible, this, _2));
registrar.add("ObjectIcon.Action", boost::bind(&FSChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
registrar_enable.add("ObjectIcon.Visible", boost::bind(&FSChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
@ -691,9 +920,14 @@ protected:
if(menu)
{
bool is_friend = LLAvatarActions::isFriend(mAvatarID);
bool is_group_session = gAgent.isInGroup(mSessionID);
menu->setItemEnabled("Add Friend", !is_friend);
menu->setItemEnabled("Remove Friend", is_friend);
menu->setItemVisible("Moderator Options Separator", is_group_session && isGroupModerator());
menu->setItemVisible("Moderator Options", is_group_session && isGroupModerator());
menu->setItemVisible("Group Ban Separator", is_group_session && canBanInGroup());
menu->setItemVisible("BanMember", is_group_session && canBanInGroup());
if(gAgentID == mAvatarID)
{

View File

@ -399,6 +399,40 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht
{
status = LLCore::HttpStatus(HTTP_INTERNAL_ERROR, "Malformed response contents");
}
else if (status.getType() == 410) //GONE
{
// Item does not exist or was already deleted from server.
// parent folder is out of sync
if (type == REMOVECATEGORY)
{
LLViewerInventoryCategory *cat = gInventory.getCategory(targetId);
if (cat)
{
LL_WARNS("Inventory") << "Purge failed for '" << cat->getName()
<< "' local version:" << cat->getVersion()
<< " since folder no longer exists at server. Descendent count: server == " << cat->getDescendentCount()
<< ", viewer == " << cat->getViewerDescendentCount()
<< LL_ENDL;
gInventory.fetchDescendentsOf(cat->getParentUUID());
// Note: don't delete folder here - contained items will be deparented (or deleted)
// and since we are clearly out of sync we can't be sure we won't get rid of something we need.
// For example folder could have been moved or renamed with items intact, let it fetch first.
}
}
else if (type == REMOVEITEM)
{
LLViewerInventoryItem *item = gInventory.getItem(targetId);
if (item)
{
LL_WARNS("Inventory") << "Purge failed for '" << item->getName()
<< "' since item no longer exists at server." << LL_ENDL;
gInventory.fetchDescendentsOf(item->getParentUUID());
// since item not on the server and exists at viewer, so it needs an update at the least,
// so delete it, in worst case item will be refetched with new params.
gInventory.onObjectDeletedFromServer(targetId);
}
}
}
LL_WARNS("Inventory") << "Inventory error: " << status.toString() << LL_ENDL;
LL_WARNS("Inventory") << ll_pretty_print_sd(result) << LL_ENDL;
}
@ -1000,7 +1034,16 @@ void AISUpdate::doUpdate()
// inventory COF is maintained on the viewer through calls to
// LLInventoryModel::accountForUpdate when a changing operation
// is performed. This occasionally gets out of sync however.
cat->setVersion(version);
if (version != LLViewerInventoryCategory::VERSION_UNKNOWN)
{
cat->setVersion(version);
}
else
{
// We do not account for update if version is UNKNOWN, so we shouldn't rise version
// either or viewer will get stuck on descendants count -1, try to refetch folder instead
cat->fetch();
}
}
}

View File

@ -3772,10 +3772,19 @@ LLSD LLAppViewer::getViewerInfo() const
info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
#if LL_WINDOWS
LLSD driver_info = gDXHardware.getDisplayInfo();
if (driver_info.has("DriverVersion"))
std::string drvinfo = gDXHardware.getDriverVersionWMI();
if (!drvinfo.empty())
{
info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
info["GRAPHICS_DRIVER_VERSION"] = drvinfo;
}
else
{
LL_WARNS("Driver version")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL;
LLSD driver_info = gDXHardware.getDisplayInfo();
if (driver_info.has("DriverVersion"))
{
info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
}
}
#endif

View File

@ -1243,7 +1243,7 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
}
// static
void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
void LLAvatarActions::toggleMute(const LLUUID& id, U32 flags)
{
LLAvatarName av_name;
LLAvatarNameCache::get(id, &av_name);
@ -1254,14 +1254,20 @@ void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
LLMute mute(id, av_name.getUserName(), LLMute::AGENT);
if (!is_muted)
{
mute_list->add(mute, LLMute::flagVoiceChat);
mute_list->add(mute, flags);
}
else
{
mute_list->remove(mute, LLMute::flagVoiceChat);
mute_list->remove(mute, flags);
}
}
// static
void LLAvatarActions::toggleMuteVoice(const LLUUID& id)
{
toggleMute(id, LLMute::flagVoiceChat);
}
// static
bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
{

View File

@ -140,6 +140,11 @@ public:
*/
static void toggleBlock(const LLUUID& id);
/**
* Mute/unmute avatar.
*/
static void toggleMute(const LLUUID& id, U32 flags);
/**
* Block/unblock the avatar voice.
*/

View File

@ -40,10 +40,14 @@
#include "llpanel.h"
#include "lluictrlfactory.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
#include "llcallingcard.h" //for LLAvatarTracker
#include "llagent.h"
#include "llagentdata.h"
#include "llavataractions.h"
#include "llavatariconctrl.h"
#include "llcallingcard.h" //for LLAvatarTracker
#include "llgroupactions.h"
#include "llgroupmgr.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltrans.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
@ -51,7 +55,6 @@
#include "llstylemap.h"
#include "llslurl.h"
#include "lllayoutstack.h"
#include "llagent.h"
#include "llnotificationsutil.h"
#include "lltoastnotifypanel.h"
#include "lltooltip.h"
@ -63,7 +66,6 @@
#include "llurlaction.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llmutelist.h"
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f)
#include "rlvcommon.h"
// [/RLVa:KB]
@ -200,6 +202,161 @@ public:
return false;
}
void banGroupMember(const LLUUID& participant_uuid)
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return;
}
gdatap->banMemberById(participant_uuid);
}
bool canBanInGroup()
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return false;
}
if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
return false;
}
bool canBanGroupMember(const LLUUID& participant_uuid)
{
LLUUID group_uuid = mSessionID;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_uuid);
if (!gdatap)
{
// Not a group
return false;
}
if (gdatap->mPendingBanRequest)
{
return false;
}
if (gAgentID == getAvatarId())
{
//Don't ban self
return false;
}
if (gdatap->isRoleMemberDataComplete())
{
if (gdatap->mMembers.size())
{
LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find(participant_uuid);
if (mi != gdatap->mMembers.end())
{
LLGroupMemberData* member_data = (*mi).second;
// Is the member an owner?
if (member_data && member_data->isInRole(gdatap->mOwnerRole))
{
return false;
}
if (gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
}
}
}
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(participant_uuid).get();
if (speakerp
&& gAgent.hasPowerInGroup(group_uuid, GP_ROLE_REMOVE_MEMBER)
&& gAgent.hasPowerInGroup(group_uuid, GP_GROUP_BAN_ACCESS))
{
return true;
}
}
return false;
}
bool isGroupModerator()
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (!speaker_mgr)
{
LL_WARNS() << "Speaker manager is missing" << LL_ENDL;
return false;
}
// Is session a group call/chat?
if(gAgent.isInGroup(mSessionID))
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(gAgentID).get();
// Is agent a moderator?
return speakerp && speakerp->mIsModerator;
}
return false;
}
bool canModerate(const std::string& userdata)
{
// only group moderators can perform actions related to this "enable callback"
if (!isGroupModerator() || gAgentID == getAvatarId())
{
return false;
}
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (!speaker_mgr)
{
return false;
}
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (!speakerp)
{
return false;
}
bool voice_channel = speakerp->isInVoiceChannel();
if ("can_moderate_voice" == userdata)
{
return voice_channel;
}
else if ("can_mute" == userdata)
{
return voice_channel && (speakerp->mStatus != LLSpeaker::STATUS_MUTED);
}
else if ("can_unmute" == userdata)
{
return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
}
else if ("can_allow_text_chat" == userdata)
{
return true;
}
return false;
}
void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
{
std::string level = userdata.asString();
@ -258,11 +415,36 @@ public:
}
else if(level == "block_unblock")
{
mute(getAvatarId(), LLMute::flagVoiceChat);
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
}
else if(level == "mute_unmute")
{
mute(getAvatarId(), LLMute::flagTextChat);
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagTextChat);
}
else if(level == "toggle_allow_text_chat")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
speaker_mgr->toggleAllowTextChat(getAvatarId());
}
else if(level == "group_mute")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->moderateVoiceParticipant(getAvatarId(), false);
}
}
else if(level == "group_unmute")
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->moderateVoiceParticipant(getAvatarId(), true);
}
}
else if(level == "ban_member")
{
banGroupMember(getAvatarId());
}
}
@ -278,24 +460,71 @@ public:
{
return LLMuteList::getInstance()->isMuted(getAvatarId(), LLMute::flagTextChat);
}
else if (level == "is_allowed_text_chat")
{
if (gAgent.isInGroup(mSessionID))
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if(speaker_mgr)
{
const LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId());
if (NULL != speakerp)
{
return !speakerp->mModeratorMutedText;
}
}
}
return false;
}
return false;
}
void mute(const LLUUID& participant_id, U32 flags)
bool onAvatarIconContextMenuItemEnabled(const LLSD& userdata)
{
BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
LLAvatarName av_name;
LLAvatarNameCache::get(participant_id, &av_name);
LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT);
std::string level = userdata.asString();
if (!is_muted)
if (level == "can_allow_text_chat" || level == "can_mute" || level == "can_unmute")
{
LLMuteList::getInstance()->add(mute, flags);
return canModerate(userdata);
}
else
else if (level == "can_ban_member")
{
LLMuteList::getInstance()->remove(mute, flags);
return canBanGroupMember(getAvatarId());
}
return false;
}
bool onAvatarIconContextMenuItemVisible(const LLSD& userdata)
{
std::string level = userdata.asString();
if (level == "show_mute")
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (speakerp)
{
return speakerp->isInVoiceChannel() && speakerp->mStatus != LLSpeaker::STATUS_MUTED;
}
}
return false;
}
else if (level == "show_unmute")
{
LLSpeakerMgr * speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLSpeaker * speakerp = speaker_mgr->findSpeaker(getAvatarId()).get();
if (speakerp)
{
return speakerp->mStatus == LLSpeaker::STATUS_MUTED;
}
}
return false;
}
return false;
}
BOOL postBuild()
@ -305,6 +534,8 @@ public:
registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
registrar_enable.add("AvatarIcon.Enable", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemEnabled, this, _2));
registrar_enable.add("AvatarIcon.Visible", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemVisible, this, _2));
registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
@ -613,9 +844,14 @@ protected:
if(menu)
{
bool is_friend = LLAvatarActions::isFriend(mAvatarID);
bool is_group_session = gAgent.isInGroup(mSessionID);
menu->setItemEnabled("Add Friend", !is_friend);
menu->setItemEnabled("Remove Friend", is_friend);
menu->setItemVisible("Moderator Options Separator", is_group_session && isGroupModerator());
menu->setItemVisible("Moderator Options", is_group_session && isGroupModerator());
menu->setItemVisible("Group Ban Separator", is_group_session && canBanInGroup());
menu->setItemVisible("BanMember", is_group_session && canBanInGroup());
if(gAgentID == mAvatarID)
{

View File

@ -1151,11 +1151,11 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
}
else if ("block_unblock" == command)
{
toggleMute(userID, LLMute::flagVoiceChat);
LLAvatarActions::toggleMute(userID, LLMute::flagVoiceChat);
}
else if ("mute_unmute" == command)
{
toggleMute(userID, LLMute::flagTextChat);
LLAvatarActions::toggleMute(userID, LLMute::flagTextChat);
}
else if ("selected" == command || "mute_all" == command || "unmute_all" == command)
{
@ -2097,24 +2097,6 @@ void LLFloaterIMContainer::toggleAllowTextChat(const LLUUID& participant_uuid)
}
}
void LLFloaterIMContainer::toggleMute(const LLUUID& participant_id, U32 flags)
{
BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags);
LLAvatarName av_name;
LLAvatarNameCache::get(participant_id, &av_name);
LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT);
if (!is_muted)
{
LLMuteList::getInstance()->add(mute, flags);
}
else
{
LLMuteList::getInstance()->remove(mute, flags);
}
}
void LLFloaterIMContainer::openNearbyChat()
{
// If there's only one conversation in the container and that conversation is the nearby chat

View File

@ -178,7 +178,6 @@ private:
void moderateVoiceAllParticipants(bool unmute);
void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
void toggleAllowTextChat(const LLUUID& participant_uuid);
void toggleMute(const LLUUID& participant_id, U32 flags);
void banSelectedMember(const LLUUID& participant_uuid);
void openNearbyChat();
bool isParticipantListExpanded();

View File

@ -97,6 +97,10 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
{ "/shout" , CHAT_TYPE_SHOUT}
};
bool cb_do_nothing()
{
return false;
}
LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
: LLFloaterIMSessionTab(LLSD(LLUUID::null)),
@ -107,6 +111,12 @@ LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
mIsP2PChat = false;
mIsNearbyChat = true;
mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
// Required by LLFloaterIMSessionTab::mGearBtn
// But nearby floater has no 'per agent' menu items,
mEnableCallbackRegistrar.add("Avatar.EnableGearItem", boost::bind(&cb_do_nothing));
mCommitCallbackRegistrar.add("Avatar.GearDoToSelected", boost::bind(&cb_do_nothing));
mEnableCallbackRegistrar.add("Avatar.CheckGearItem", boost::bind(&cb_do_nothing));
}
//static

View File

@ -48,6 +48,10 @@
const F32 REFRESH_INTERVAL = 1.0f;
void cb_group_do_nothing()
{
}
LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
: LLTransientDockableFloater(NULL, false, session_id),
mIsP2PChat(false),
@ -84,6 +88,7 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
mEnableCallbackRegistrar.add("Avatar.CheckItem", boost::bind(&LLFloaterIMSessionTab::checkContextMenuItem, this, _2));
mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMSessionTab::enableContextMenuItem, this, _2));
mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMSessionTab::doToSelected, this, _2));
mCommitCallbackRegistrar.add("Group.DoToSelected", boost::bind(&cb_group_do_nothing));
}
LLFloaterIMSessionTab::~LLFloaterIMSessionTab()

View File

@ -41,16 +41,13 @@ LLFloaterLinkReplace::LLFloaterLinkReplace(const LLSD& key)
mRemainingItems(0),
mSourceUUID(LLUUID::null),
mTargetUUID(LLUUID::null),
mInstance(NULL),
mBatchSize(gSavedSettings.getU32("LinkReplaceBatchSize"))
{
mEventTimer.stop();
mInstance = this;
}
LLFloaterLinkReplace::~LLFloaterLinkReplace()
{
mInstance = NULL;
}
BOOL LLFloaterLinkReplace::postBuild()
@ -180,11 +177,9 @@ void LLFloaterLinkReplace::onStartClicked()
}
}
void LLFloaterLinkReplace::linkCreatedCallback(const LLUUID& old_item_id,
const LLUUID& target_item_id,
bool needs_wearable_ordering_update,
bool needs_description_update,
const LLUUID& outfit_folder_id)
// static
void LLFloaterLinkReplace::linkCreatedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& old_item_id, const LLUUID& target_item_id,
bool needs_wearable_ordering_update, bool needs_description_update, const LLUUID& outfit_folder_id)
{
LL_DEBUGS() << "Inventory link replace:" << LL_NEWLINE
<< " - old_item_id = " << old_item_id.asString() << LL_NEWLINE
@ -239,20 +234,21 @@ void LLFloaterLinkReplace::linkCreatedCallback(const LLUUID& old_item_id,
outfit_update_folder = outfit_folder_id;
}
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::itemRemovedCallback, this, outfit_update_folder));
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::itemRemovedCallback, floater_handle, outfit_update_folder));
remove_inventory_object(old_item_id, cb);
}
void LLFloaterLinkReplace::itemRemovedCallback(const LLUUID& outfit_folder_id)
// static
void LLFloaterLinkReplace::itemRemovedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& outfit_folder_id)
{
if (outfit_folder_id.notNull())
{
LLAppearanceMgr::getInstance()->updateClothingOrderingInfo(outfit_folder_id);
}
if (mInstance)
if (!floater_handle.isDead())
{
decreaseOpenItemCount();
floater_handle.get()->decreaseOpenItemCount();
}
}
@ -324,7 +320,7 @@ void LLFloaterLinkReplace::processBatch(LLInventoryModel::item_array_t items)
LLInventoryObject::const_object_list_t obj_array;
obj_array.push_back(LLConstPointer<LLInventoryObject>(target_item));
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&LLFloaterLinkReplace::linkCreatedCallback,
this,
getDerivedHandle<LLFloaterLinkReplace>(),
source_item->getUUID(),
target_item->getUUID(),
needs_wearable_ordering_update,

View File

@ -98,12 +98,9 @@ private:
void updateFoundLinks();
void processBatch(LLInventoryModel::item_array_t items);
void linkCreatedCallback(const LLUUID& old_item_id,
const LLUUID& target_item_id,
bool needs_wearable_ordering_update,
bool needs_description_update,
const LLUUID& outfit_folder_id);
void itemRemovedCallback(const LLUUID& outfit_folder_id);
static void linkCreatedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& old_item_id, const LLUUID& target_item_id,
bool needs_wearable_ordering_update, bool needs_description_update, const LLUUID& outfit_folder_id);
static void itemRemovedCallback(LLHandle<LLFloaterLinkReplace> floater_handle, const LLUUID& outfit_folder_id);
void onSourceItemDrop(const LLUUID& source_item_id);
void onTargetItemDrop(const LLUUID& target_item_id);
@ -120,8 +117,6 @@ private:
U32 mBatchSize;
LLInventoryModel::item_array_t mRemainingInventoryItems;
LLFloaterLinkReplace* mInstance;
};
#endif // LL_FLOATERLINKREPLACE_H

View File

@ -112,24 +112,16 @@ BOOL LLFloaterScriptLimits::postBuild()
}
// contruct the panels
std::string land_url = gAgent.getRegion()->getCapability("LandResources");
if (!land_url.empty())
{
LLPanelScriptLimitsRegionMemory* panel_memory;
panel_memory = new LLPanelScriptLimitsRegionMemory;
mInfoPanels.push_back(panel_memory);
panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
mTab->addTabPanel(panel_memory);
}
std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources");
if (!attachment_url.empty())
{
LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
mInfoPanels.push_back(panel_attachments);
panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
mTab->addTabPanel(panel_attachments);
}
LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory;
mInfoPanels.push_back(panel_memory);
panel_memory->buildFromFile( "panel_script_limits_region_memory.xml");
mTab->addTabPanel(panel_memory);
LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment;
mInfoPanels.push_back(panel_attachments);
panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml");
mTab->addTabPanel(panel_attachments);
if(mInfoPanels.size() > 0)
{
@ -195,6 +187,8 @@ LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory()
BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()
{
if (!gAgent.getRegion()) return FALSE;
LLSD body;
std::string url = gAgent.getRegion()->getCapability("LandResources");
if (!url.empty())
@ -718,10 +712,9 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain()
LLParcel* parcel = instance->getCurrentSelectedParcel();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
LLUUID current_region_id = gAgent.getRegion()->getRegionID();
if ((region) && (parcel))
{
LLUUID current_region_id = gAgent.getRegion()->getRegionID();
LLVector3 parcel_center = parcel->getCenterpoint();
region_id = region->getRegionID();
@ -982,6 +975,8 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()
{
if (!gAgent.getRegion()) return FALSE;
LLSD body;
std::string url = gAgent.getRegion()->getCapability("AttachmentResources");
if (!url.empty())

View File

@ -837,20 +837,20 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
// HACK - highlight buttons for next click
mRadioGroupMove->setVisible(move_visible);
if (!gGrabBtnSpin &&
!gGrabBtnVertical &&
!(mask == MASK_VERTICAL) &&
!(mask == MASK_SPIN) )
if (!(gGrabBtnSpin ||
gGrabBtnVertical ||
(mask == MASK_VERTICAL) ||
(mask == MASK_SPIN)))
{
mRadioGroupMove->setValue("radio move");
}
else if (gGrabBtnVertical ||
(mask == MASK_VERTICAL) )
else if ((mask == MASK_VERTICAL) ||
(gGrabBtnVertical && (mask != MASK_SPIN)))
{
mRadioGroupMove->setValue("radio lift");
}
else if (gGrabBtnSpin ||
(mask == MASK_SPIN) )
else if ((mask == MASK_SPIN) ||
(gGrabBtnSpin && (mask != MASK_VERTICAL)))
{
mRadioGroupMove->setValue("radio spin");
}

View File

@ -4210,8 +4210,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
LLInventoryModel::cat_array_t* cat_array;
LLInventoryModel::item_array_t* item_array;
gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
LLViewerInventoryCategory *trash = getCategory();
// Enable Empty menu item only when there is something to act upon.
if ((0 == cat_array->size() && 0 == item_array->size()) || is_recent_panel)
// Also don't enable menu if folder isn't fully fetched
if ((0 == cat_array->size() && 0 == item_array->size())
|| is_recent_panel
|| !trash
|| trash->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN
|| trash->getDescendentCount() == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
disabled_items.push_back(std::string("Empty Trash"));
}
@ -4400,8 +4406,6 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
LLFolderType::EType type = category->getPreferredType();
const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
// BAP change once we're no longer treating regular categories as ensembles.
const bool is_ensemble = (type == LLFolderType::FT_NONE ||
LLFolderType::lookupIsEnsembleType(type));
const bool is_agent_inventory = isAgentInventory();
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-11-24 (Catznip-2.4)
const bool is_outfit = (type == LLFolderType::FT_OUTFIT);
@ -4437,41 +4441,34 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
checkFolderForContentsOfType(model, is_object) ||
checkFolderForContentsOfType(model, is_gesture) )
{
// <FS:Beq> FIRE-21246 re-enable context menus for remove from COF on system folders and reinstate wearables separator
// Only enable add/replace outfit for non-system folders.
if (!is_system_folder)
{
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
items.push_back(std::string("Add To Outfit"));
// Adding an outfit onto another (versus replacing) doesn't make sense.
if (type != LLFolderType::FT_OUTFIT)
{
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
//items.push_back(std::string("Add To Outfit"));
// <FS:TT> Patch: ReplaceWornItemsOnly
items.push_back(std::string("Wear Items"));
// </FS:TT>
}
items.push_back(std::string("Replace Outfit"));
}
if (is_agent_inventory)
{
items.push_back(std::string("Folder Wearables Separator"));
// Only enable add/replace outfit for non-system folders.
if (!is_system_folder)
{
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
items.push_back(std::string("Add To Outfit"));
// Adding an outfit onto another (versus replacing) doesn't make sense.
if (type != LLFolderType::FT_OUTFIT)
{
// <FS:Ansariel> FIRE-3302: "Add to Current Outfit" missing for inventory outfit folder
//items.push_back(std::string("Add To Outfit"));
// <FS:TT> Patch: ReplaceWornItemsOnly
items.push_back(std::string("Wear Items"));
// </FS:TT>
}
items.push_back(std::string("Replace Outfit"));
}
if (is_ensemble)
{
items.push_back(std::string("Wear As Ensemble"));
}
items.push_back(std::string("Remove From Outfit"));
if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
{
disabled_items.push_back(std::string("Remove From Outfit"));
disabled_items.push_back(std::string("Remove From Outfit"));
}
}
// </FS:Beq> (change also outdents the next 3 if blocks with no fucntional impact)
// if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
//if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-11-24 (Catznip-2.4)
if ( ((is_outfit) && (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))) ||
((!is_outfit) && (gAgentWearables.isCOFChangeInProgress())) )
@ -4491,6 +4488,7 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
disabled_items.push_back(std::string("Add To Outfit"));
}
items.push_back(std::string("Outfit Separator"));
}
}

View File

@ -2427,9 +2427,33 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
if ("delete" == action)
{
LLSD args;
args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
static bool sDisplayedAtSession = false;
LLAllDescendentsPassedFilter f;
for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
{
if (LLFolderViewFolder* folder = dynamic_cast<LLFolderViewFolder*>(*it))
{
folder->applyFunctorRecursively(f);
}
}
// Fall through to the generic confirmation if the user choose to ignore the specialized one
if ( (!f.allDescendentsPassedFilter()) && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )
{
LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
}
else
{
if (!sDisplayedAtSession) // ask for the confirmation at least once per session
{
LLNotifications::instance().setIgnored("DeleteItems", false);
sDisplayedAtSession = true;
}
LLSD args;
args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
}
// Note: marketplace listings will be updated in the callback if delete confirmed
return;
}

View File

@ -480,6 +480,8 @@ struct LLInventoryAction
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
static void removeItemFromDND(LLFolderView* root);
static const int sConfirmOnDeleteItemsNumber;
private:
static void buildMarketplaceFolders(LLFolderView* root);
static void updateMarketplaceFolders();

View File

@ -42,6 +42,7 @@
#include "bufferstream.h"
#include "llcorehttputil.h"
#include "llviewermenu.h"
#include "llviewernetwork.h"
// History (may be apocryphal)
//
@ -554,7 +555,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
// OnIdle it will be called anyway due to Add flag for processed item.
// It seems like in some cases we are updaiting on fail (no flag),
// but is there anything to update?
gInventory.notifyObservers();
// <FS:Ansariel> FIRE-21376: Inventory not loading properly on OpenSim
//gInventory.notifyObservers();
if (LLGridManager::getInstance()->isInSecondLife())
{
gInventory.notifyObservers();
}
// </FS:Ansariel>
}
if ((mFetchCount > max_concurrent_fetches) ||
@ -873,6 +880,12 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
titem->setParent(lost_uuid);
titem->updateParentOnServer(FALSE);
gInventory.updateItem(titem);
// <FS:Ansariel> FIRE-21376: Inventory not loading properly on OpenSim
if (!LLGridManager::getInstance()->isInSecondLife())
{
gInventory.notifyObservers();
}
// </FS:Ansariel>
}
}
}
@ -945,6 +958,13 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res
{
fetcher->setAllFoldersFetched();
}
// <FS:Ansariel> FIRE-21376: Inventory not loading properly on OpenSim
if (!LLGridManager::getInstance()->isInSecondLife())
{
gInventory.notifyObservers();
}
// </FS:Ansariel>
}
@ -987,6 +1007,13 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http
fetcher->setAllFoldersFetched();
}
}
// <FS:Ansariel> FIRE-21376: Inventory not loading properly on OpenSim
if (!LLGridManager::getInstance()->isInSecondLife())
{
gInventory.notifyObservers();
}
// </FS:Ansariel>
}
@ -1024,6 +1051,13 @@ void BGFolderHttpHandler::processFailure(const char * const reason, LLCore::Http
fetcher->setAllFoldersFetched();
}
}
// <FS:Ansariel> FIRE-21376: Inventory not loading properly on OpenSim
if (!LLGridManager::getInstance()->isInSecondLife())
{
gInventory.notifyObservers();
}
// </FS:Ansariel>
}

View File

@ -384,6 +384,11 @@ void LLInventoryFetchDescendentsObserver::startFetch()
if (!cat) continue;
if (!isCategoryComplete(cat))
{
// CHECK IT: isCategoryComplete() checks both version and descendant count but
// fetch() only works for Unknown version and doesn't care about descentants,
// as result fetch won't start and folder will potentially get stuck as
// incomplete in observer.
// Likely either both should use only version or both should check descendants.
cat->fetch(); //blindly fetch it without seeing if anything else is fetching it.
mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer.
}

View File

@ -61,6 +61,8 @@
#include <boost/scoped_ptr.hpp>
#include <sstream>
const S32 LOGIN_MAX_RETRIES = 3;
class LLLoginInstance::Disposable {
public:
virtual ~Disposable() {}
@ -228,13 +230,16 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["host_id"] = gSavedSettings.getString("HostID");
request_params["extended_errors"] = true; // request message_id and message_args
// Specify desired timeout/retry options
LLSD http_params;
http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
http_params["retries"] = LOGIN_MAX_RETRIES;
mRequestData.clear();
mRequestData["method"] = "login_to_simulator";
mRequestData["params"] = request_params;
mRequestData["options"] = requested_options;
mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
mRequestData["http_params"] = http_params;
}
bool LLLoginInstance::handleLoginEvent(const LLSD& event)

View File

@ -177,6 +177,8 @@ public:
virtual bool wantsKeyUpKeyDown() const;
virtual bool wantsReturnKey() const;
virtual BOOL acceptsTextInput() const {return TRUE;}
protected:
void convertInputCoords(S32& x, S32& y);

View File

@ -1669,7 +1669,12 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
LLMeshRepository::sCacheBytesRead += size;
++LLMeshRepository::sCacheReads;
file.seek(offset);
U8* buffer = new U8[size];
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
LL_WARNS(LOG_MESH) << "Can't allocate memory for mesh LOD" << LL_ENDL;
return false;
}
file.read(buffer, size);
//make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)

View File

@ -327,6 +327,8 @@ public:
*/
static std::string getSubstitutionName(const LLNotificationPtr& notification);
static std::string getSubstitutionOriginalName(const LLNotificationPtr& notification);
/**
* Adds notification panel to the IM floater.
*/

View File

@ -325,6 +325,20 @@ std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notifica
return res;
}
// static
std::string LLHandlerUtil::getSubstitutionOriginalName(const LLNotificationPtr& notification)
{
if(notification->getSubstitutions().has("ORIGINAL_NAME"))
{
std::string name = notification->getSubstitutions()["ORIGINAL_NAME"];
if(!name.empty())
{
return name;
}
}
return LLHandlerUtil::getSubstitutionName(notification);
}
// static
void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
{

View File

@ -155,6 +155,7 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)
// we not save offer notifications to the syswell floater that should be added to the IM floater
p.can_be_stored = !add_notif_to_im;
p.force_show = notification->getOfferFromAgent();
p.can_fade = notification->canFadeToast();
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)

View File

@ -77,6 +77,7 @@ void LLScriptHandler::addToastWithNotification(const LLNotificationPtr& notifica
p.notification = notification;
p.panel = notify_box;
p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
p.can_fade = notification->canFadeToast();
if(gAgent.isDoNotDisturb())
{
p.force_show = notification->getName() == "SystemMessage"

View File

@ -89,8 +89,8 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification)
}
std::string session_name = notification->getPayload()["SESSION_NAME"];
const std::string name = notification->getSubstitutions()["NAME"];
const LLUUID agent_id = notification->getSubstitutions()["AGENT-ID"]; // [FIRE-3522 : SJ]
const std::string name = LLHandlerUtil::getSubstitutionOriginalName(notification);
const LLUUID agent_id = notification->getSubstitutions()["AGENT-ID"]; // [FIRE-3522 : SJ]
if (session_name.empty())
{

View File

@ -347,7 +347,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
mItemPanels.pop_back();
}
LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID outfit_id)
{
LLOutfitGalleryItem::Params giparams;
LLOutfitGalleryItem* gitem = LLUICtrlFactory::create<LLOutfitGalleryItem>(giparams);
@ -356,6 +356,7 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
gitem->setFollowsLeft();
gitem->setFollowsTop();
gitem->setOutfitName(name);
gitem->setUUID(outfit_id);
return gitem;
}
@ -514,7 +515,7 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
if (!cat) return;
std::string name = cat->getName();
LLOutfitGalleryItem* item = buildGalleryItem(name);
LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id);
mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item));
item->setRightMouseDownCallback(boost::bind(&LLOutfitListBase::outfitRightClickCallBack, this,
_1, _2, _3, cat_id));
@ -664,7 +665,8 @@ LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
mSelected(false),
mWorn(false),
mDefaultImage(true),
mOutfitName("")
mOutfitName(""),
mUUID(LLUUID())
{
buildFromFile("panel_outfit_gallery_item.xml");
}
@ -748,23 +750,20 @@ BOOL LLOutfitGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
return LLUICtrl::handleRightMouseDown(x, y, mask);
}
BOOL LLOutfitGallery::handleDoubleClick(S32 x, S32 y, MASK mask)
BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
{
LLTabContainer* appearence_tabs = LLPanelOutfitsInventory::findInstance()->getChild<LLTabContainer>("appearance_tabs");
LLPanel* panel = NULL;
LLAccordionCtrl* accordion = NULL;
if (appearence_tabs != NULL)
if (appearence_tabs && (mUUID != LLUUID()))
{
appearence_tabs->selectTabByName("outfitslist_tab");
panel = appearence_tabs->getCurrentPanel();
if (panel != NULL)
LLPanel* panel = appearence_tabs->getCurrentPanel();
if (panel)
{
accordion = panel->getChild<LLAccordionCtrl>("outfits_accordion");
LLAccordionCtrl* accordion = panel->getChild<LLAccordionCtrl>("outfits_accordion");
LLOutfitsList* outfit_list = dynamic_cast<LLOutfitsList*>(panel);
if (accordion != NULL && outfit_list != NULL)
{
LLUUID item_id = getSelectedOutfitUUID();
outfit_list->setSelectedOutfitByUUID(item_id);
outfit_list->setSelectedOutfitByUUID(mUUID);
LLAccordionCtrlTab* tab = accordion->getSelectedTab();
tab->showAndFocusHeader();
return TRUE;
@ -772,7 +771,7 @@ BOOL LLOutfitGallery::handleDoubleClick(S32 x, S32 y, MASK mask)
}
}
return LLUICtrl::handleDoubleClick(x, y, mask);
return LLPanel::handleDoubleClick(x, y, mask);
}
void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)

View File

@ -115,8 +115,6 @@ public:
void onBeforeOutfitSnapshotSave();
void onAfterOutfitSnapshotSave();
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
protected:
/*virtual*/ void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id);
/*virtual*/ void onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid);
@ -150,7 +148,7 @@ private:
void updateRowsIfNeeded();
void updateGalleryWidth();
LLOutfitGalleryItem* buildGalleryItem(std::string name);
LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
void onTextureSelectionChanged(LLInventoryItem* itemp);
@ -258,6 +256,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
void setDefaultImage();
void setImageAssetId(LLUUID asset_id);
@ -265,6 +264,7 @@ public:
void setOutfitName(std::string name);
void setOutfitWorn(bool value);
void setSelected(bool value);
void setUUID(LLUUID outfit_id) {mUUID = outfit_id;}
std::string getItemName() {return mOutfitName;}
bool isDefaultImage() {return mDefaultImage;}
@ -274,6 +274,7 @@ public:
private:
LLPointer<LLViewerFetchedTexture> mTexturep;
LLUUID mUUID;
LLUUID mImageAssetId;
LLTextBox* mOutfitNameText;
LLTextBox* mOutfitWornText;

View File

@ -219,19 +219,21 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
// While we're at it let's get the stats from the new table if that
// capability exists.
std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
if (!url.empty())
if (gAgent.getRegion())
{
LL_INFOS() << "Classified stat request via capability" << LL_ENDL;
LLSD body;
LLUUID classifiedId = getClassifiedId();
body["classified_id"] = classifiedId;
LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body,
boost::bind(&LLPanelClassifiedInfo::handleSearchStatResponse, classifiedId, _1));
// While we're at it let's get the stats from the new table if that
// capability exists.
std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
if (!url.empty())
{
LL_INFOS() << "Classified stat request via capability" << LL_ENDL;
LLSD body;
LLUUID classifiedId = getClassifiedId();
body["classified_id"] = classifiedId;
LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body,
boost::bind(&LLPanelClassifiedInfo::handleSearchStatResponse, classifiedId, _1));
}
}
// Update classified click stats.
// *TODO: Should we do this when opening not from search?
sendClickMessage("profile");
@ -559,21 +561,24 @@ void LLPanelClassifiedInfo::sendClickMessage(
const LLVector3d& global_pos,
const std::string& sim_name)
{
// You're allowed to click on your own ads to reassure yourself
// that the system is working.
LLSD body;
body["type"] = type;
body["from_search"] = from_search;
body["classified_id"] = classified_id;
body["parcel_id"] = parcel_id;
body["dest_pos_global"] = global_pos.getValue();
body["region_name"] = sim_name;
if (gAgent.getRegion())
{
// You're allowed to click on your own ads to reassure yourself
// that the system is working.
LLSD body;
body["type"] = type;
body["from_search"] = from_search;
body["classified_id"] = classified_id;
body["parcel_id"] = parcel_id;
body["dest_pos_global"] = global_pos.getValue();
body["region_name"] = sim_name;
std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
LL_INFOS() << "Sending click msg via capability (url=" << url << ")" << LL_ENDL;
LL_INFOS() << "body: [" << body << "]" << LL_ENDL;
LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body,
"SearchStatTracking Click report sent.", "SearchStatTracking Click report NOT sent.");
std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
LL_INFOS() << "Sending click msg via capability (url=" << url << ")" << LL_ENDL;
LL_INFOS() << "body: [" << body << "]" << LL_ENDL;
LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body,
"SearchStatTracking Click report sent.", "SearchStatTracking Click report NOT sent.");
}
}
void LLPanelClassifiedInfo::sendClickMessage(const std::string& type)

View File

@ -172,6 +172,8 @@ public:
virtual void setupCtrls (LLPanel* parent) {};
virtual void onFilterChanged() { }
protected:
LLUUID mGroupID;
BOOL mAllowEdit;

View File

@ -516,6 +516,7 @@ void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
mSearchFilter = filter;
LLStringUtil::toLower(mSearchFilter);
update(GC_ALL);
onFilterChanged();
}
void LLPanelGroupSubTab::activate()
@ -2578,12 +2579,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
//////////////////////////////////////////////////////////////////////////
LLGroupMgrGroupData::role_list_t::iterator rit = gdatap->mRoles.find(role_id);
U64 current_role_powers = GP_NO_POWERS;
if (rit != gdatap->mRoles.end())
{
current_role_powers = ((*rit).second->getRoleData().mRolePowers);
}
U64 current_role_powers = gdatap->getRolePowers(role_id);
if(isEnablingAbility)
{
@ -2886,6 +2882,16 @@ void LLPanelGroupActionsSubTab::activate()
LLPanelGroupSubTab::activate();
update(GC_ALL);
mActionDescription->clear();
mActionList->deselectAllItems();
mActionList->deleteAllItems();
buildActionsList(mActionList,
GP_ALL_POWERS,
GP_ALL_POWERS,
NULL,
FALSE,
TRUE,
FALSE);
}
void LLPanelGroupActionsSubTab::deactivate()
@ -2914,19 +2920,31 @@ void LLPanelGroupActionsSubTab::update(LLGroupChange gc)
if (mGroupID.isNull()) return;
mActionList->deselectAllItems();
mActionMembers->deleteAllItems();
mActionRoles->deleteAllItems();
mActionDescription->clear();
if(mActionList->hasSelectedItem())
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (gdatap && gdatap->isMemberDataComplete() && gdatap->isRoleDataComplete())
{
handleActionSelect();
}
}
}
void LLPanelGroupActionsSubTab::onFilterChanged()
{
mActionDescription->clear();
mActionList->deselectAllItems();
mActionList->deleteAllItems();
buildActionsList(mActionList,
GP_ALL_POWERS,
GP_ALL_POWERS,
NULL,
FALSE,
TRUE,
FALSE);
GP_ALL_POWERS,
GP_ALL_POWERS,
NULL,
FALSE,
TRUE,
FALSE);
}
void LLPanelGroupActionsSubTab::handleActionSelect()

View File

@ -322,6 +322,7 @@ public:
virtual bool needsApply(std::string& mesg);
virtual bool apply(std::string& mesg);
virtual void update(LLGroupChange gc);
virtual void onFilterChanged();
void handleActionSelect();

View File

@ -1564,28 +1564,6 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
LLFloaterReg::showInstance("linkreplace", params);
}
// <FS:Ansariel> Inventory Links Replace
if (command_name == "replace_links")
{
LLSD params;
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (current_item)
{
LLInvFVBridge* bridge = (LLInvFVBridge*)current_item->getViewModelItem();
if (bridge)
{
LLInventoryObject* obj = bridge->getInventoryObject();
if (obj && obj->getType() != LLAssetType::AT_CATEGORY && obj->getActualType() != LLAssetType::AT_LINK_FOLDER)
{
params = LLSD(obj->getUUID());
}
}
}
LLFloaterReg::showInstance("fs_linkreplace", params);
}
// </FS:Ansariel>
}
void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility )
@ -1704,13 +1682,13 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
return children != LLInventoryModel::CHILDREN_NO;
return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
}
if (command_name == "empty_lostnfound")
{
const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
return children != LLInventoryModel::CHILDREN_NO;
return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
}
return TRUE;

View File

@ -194,6 +194,7 @@ void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
//}
//else
//{
// cancel();
// floater->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "local")));
//}
floater->saveLocal(boost::bind(&LLPanelSnapshotLocal::saveLocalCallback, this, _1));

View File

@ -202,6 +202,8 @@ void LLPanelSnapshotPostcard::sendPostcardFinished(LLSD result)
void LLPanelSnapshotPostcard::sendPostcard()
{
if (!gAgent.getRegion()) return;
// upload the image
std::string url = gAgent.getRegion()->getCapability("SendPostcard");
if (!url.empty())

View File

@ -62,7 +62,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(isItemInTrash())
{
items.push_back(std::string("Purge Item"));
if (!isItemRemovable())
if (!isItemRemovable() || (gInventory.getCategory(mUUID) && !gInventory.isCategoryComplete(mUUID)))
{
disabled_items.push_back(std::string("Purge Item"));
}

View File

@ -2322,6 +2322,7 @@ void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/)
mScriptEd->sync();
}
if (!gAgent.getRegion()) return;
const LLInventoryItem *inv_item = getItem();
// save it out to asset server
std::string url = gAgent.getRegion()->getCapability("UpdateScriptAgent");

View File

@ -45,6 +45,7 @@
#include "llimagepng.h"
#include "lllandmarkactions.h"
#include "lllocalcliprect.h"
#include "llresmgr.h"
#include "llnotificationsutil.h"
#include "llslurl.h"
#include "llsnapshotlivepreview.h"
@ -56,6 +57,7 @@
#include "llvfs.h"
#include "llwindow.h"
#include "llworld.h"
#include <boost/filesystem.hpp>
const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
@ -1198,7 +1200,7 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
// getFormattedImage();
//
// // Save the formatted image
// BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
// BOOL success = saveLocal(mFormattedImage);
//
// if(success)
// {
@ -1206,6 +1208,42 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
// }
// return success;
//}
//
////Check if failed due to insufficient memory
//BOOL LLSnapshotLivePreview::saveLocal(LLPointer<LLImageFormatted> mFormattedImage)
//{
// BOOL insufficient_memory;
// BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, FALSE, insufficient_memory);
//
// if (insufficient_memory)
// {
// std::string lastSnapshotDir = LLViewerWindow::getLastSnapshotDir();
//
//#ifdef LL_WINDOWS
// boost::filesystem::path b_path(utf8str_to_utf16str(lastSnapshotDir));
//#else
// boost::filesystem::path b_path(lastSnapshotDir);
//#endif
// boost::filesystem::space_info b_space = boost::filesystem::space(b_path);
// if (b_space.free < mFormattedImage->getDataSize())
// {
// LLSD args;
// args["PATH"] = lastSnapshotDir;
//
// std::string needM_bytes_string;
// LLResMgr::getInstance()->getIntegerString(needM_bytes_string, (mFormattedImage->getDataSize()) >> 10);
// args["NEED_MEMORY"] = needM_bytes_string;
//
// std::string freeM_bytes_string;
// LLResMgr::getInstance()->getIntegerString(freeM_bytes_string, (b_space.free) >> 10);
// args["FREE_MEMORY"] = freeM_bytes_string;
//
// LLNotificationsUtil::add("SnapshotToComputerFailed", args);
// return false;
// }
// }
// return success;
//}
void LLSnapshotLivePreview::saveLocal(boost::function<void(bool)> callback)
{

View File

@ -41,6 +41,7 @@ class LLSnapshotLivePreview : public LLView
LOG_CLASS(LLSnapshotLivePreview);
public:
//static BOOL saveLocal(LLPointer<LLImageFormatted>); // <FS:Ansariel> Threaded filepickers
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
Params()

View File

@ -3065,13 +3065,15 @@ void login_callback(S32 option, void *userdata)
*/
void show_release_notes_if_required()
{
if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
static bool release_notes_shown = false;
if (!release_notes_shown && (LLVersionInfo::getChannelAndVersion() != gLastRunVersion)
&& LLVersionInfo::getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
{
LLSD info(LLAppViewer::instance()->getViewerInfo());
LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
release_notes_shown = true;
}
}

View File

@ -46,6 +46,8 @@
#include "lltransientfloatermgr.h"
#include "llviewercontrol.h" // for gSavedSettings
#include <boost/algorithm/string.hpp>
const S32 MAX_ALLOWED_MSG_WIDTH = 400;
const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@ -365,6 +367,10 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
{
setCheckBox(LLNotifications::instance().getGlobalString("skipnexttime"), ignore_label);
}
if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY)
{
setCheckBox(LLNotifications::instance().getGlobalString("skipnexttimesessiononly"), ignore_label);
}
else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
{
setCheckBox(LLNotifications::instance().getGlobalString("alwayschoose"), ignore_label);
@ -399,15 +405,18 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
const LLFontGL* font = mCheck->getFont();
const S32 LINE_HEIGHT = font->getLineHeight();
std::vector<std::string> lines;
boost::split(lines, check_title, boost::is_any_of("\n"));
// Extend dialog for "check next time"
S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD;
S32 check_width = S32(font->getWidth(check_title) + 0.99f) + 16;
S32 check_width = S32(font->getWidth(lines[0]) + 0.99f) + 16; // use width of the first line
max_msg_width = llmax(max_msg_width, check_width);
S32 dialog_width = max_msg_width + 2 * HPAD;
S32 dialog_height = LLToastPanel::getRect().getHeight();
dialog_height += LINE_HEIGHT;
dialog_height += LINE_HEIGHT * lines.size();
dialog_height += LINE_HEIGHT / 2;
LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
@ -416,7 +425,7 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
// set check_box's attributes
LLRect check_rect;
mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT));
mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT*lines.size()));
mCheck->setLabel(check_title);
mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));

View File

@ -1472,13 +1472,20 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
// accessor that looks at permissions, copyability, and names of
// inventory items to determine if a drop would be ok.
EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)
EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item, EDragAndDropType type)
{
// check the basics
if (!item || !obj) return ACCEPT_NO;
// HACK: downcast
LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item;
if (!vitem->isFinished()) return ACCEPT_NO;
if (!vitem->isFinished() && (type != DAD_CATEGORY))
{
// Note: for DAD_CATEGORY we assume that folder version check passed and folder
// is complete, meaning that items inside are up to date.
// (isFinished() == false) at the moment shows that item was loaded from cache.
// Library or agent inventory only.
return ACCEPT_NO;
}
if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links
// deny attempts to drop from an object onto itself. This is to
@ -2382,7 +2389,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
(*item_iter) = item;
}
*/
rv = willObjectAcceptInventory(root_object, item);
rv = willObjectAcceptInventory(root_object, item, DAD_CATEGORY);
if (rv < ACCEPT_YES_COPY_SINGLE)
{
LL_DEBUGS() << "Object will not accept " << item->getUUID() << LL_ENDL;

View File

@ -224,7 +224,7 @@ protected:
// accessor that looks at permissions, copyability, and names of
// inventory items to determine if a drop would be ok.
static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item);
static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item, EDragAndDropType type = DAD_NONE);
public:
// helper functions

View File

@ -499,39 +499,53 @@ void LLToolGrabBase::handleHoverActive(S32 x, S32 y, MASK mask)
return;
}
//--------------------------------------------------
// Determine target mode
//--------------------------------------------------
bool vertical_dragging = false;
bool spin_grabbing = false;
if ((mask == MASK_VERTICAL)
|| (gGrabBtnVertical && (mask != MASK_SPIN)))
{
vertical_dragging = TRUE;
}
else if ((mask == MASK_SPIN)
|| (gGrabBtnSpin && (mask != MASK_VERTICAL)))
{
spin_grabbing = TRUE;
}
//--------------------------------------------------
// Toggle spinning
//--------------------------------------------------
if (mSpinGrabbing && !(mask == MASK_SPIN) && !gGrabBtnSpin)
if (mSpinGrabbing && !spin_grabbing)
{
// user released ALT key, stop spinning
// user released or switched mask key(s), stop spinning
stopSpin();
}
else if (!mSpinGrabbing && (mask == MASK_SPIN) )
else if (!mSpinGrabbing && spin_grabbing)
{
// user pressed ALT key, start spinning
// user pressed mask key(s), start spinning
startSpin();
}
mSpinGrabbing = spin_grabbing;
//--------------------------------------------------
// Toggle vertical dragging
//--------------------------------------------------
if (mVerticalDragging && !(mask == MASK_VERTICAL) && !gGrabBtnVertical)
if (mVerticalDragging && !vertical_dragging)
{
// ...switch to horizontal dragging
mVerticalDragging = FALSE;
mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
}
else if (!mVerticalDragging && (mask == MASK_VERTICAL) )
else if (!mVerticalDragging && vertical_dragging)
{
// ...switch to vertical dragging
mVerticalDragging = TRUE;
mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
}
mVerticalDragging = vertical_dragging;
const F32 RADIANS_PER_PIXEL_X = 0.01f;
const F32 RADIANS_PER_PIXEL_Y = 0.01f;
@ -782,12 +796,13 @@ void LLToolGrabBase::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
//--------------------------------------------------
// Toggle vertical dragging
//--------------------------------------------------
if (mVerticalDragging && !(mask == MASK_VERTICAL) && !gGrabBtnVertical)
if (!(mask == MASK_VERTICAL) && !gGrabBtnVertical)
{
mVerticalDragging = FALSE;
}
else if (!mVerticalDragging && (mask == MASK_VERTICAL) )
else if ((gGrabBtnVertical && (mask != MASK_SPIN))
|| (mask == MASK_VERTICAL))
{
mVerticalDragging = TRUE;
}

View File

@ -1695,6 +1695,10 @@ void remove_inventory_category(
LLPointer<LLViewerInventoryCategory> obj = gInventory.getCategory(cat_id);
if(obj)
{
if (!gInventory.isCategoryComplete(cat_id))
{
LL_WARNS() << "Removing (purging) incomplete category " << obj->getName() << LL_ENDL;
}
if(LLFolderType::lookupIsProtectedType(obj->getPreferredType()))
{
LLNotificationsUtil::add("CannotRemoveProtectedCategories");
@ -1809,6 +1813,10 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)
{
if (AISAPI::isAvailable())
{
if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;
}
AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
AISAPI::PurgeDescendents(id, cr);
}

View File

@ -863,7 +863,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
//formatted->enableOverSize() ;
//formatted->encode(raw, 0);
//formatted->disableOverSize() ;
//gViewerWindow->saveImageNumbered(formatted);
//LLSnapshotLivePreview::saveLocal(formatted);
LLSnapshotModel::ESnapshotFormat fmt = (LLSnapshotModel::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
switch (fmt)

View File

@ -3579,11 +3579,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
case IM_INVENTORY_ACCEPTED:
{
// args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
// args["ORIGINAL_NAME"] = original_name;
// [RLVa:KB] - Checked: RLVa-1.2.2
// Only anonymize the name if the agent is nearby, there isn't an open IM session to them and their profile isn't open
bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
(RlvActions::canShowName(RlvActions::SNC_DEFAULT, from_id)) || (!RlvUtil::isNearbyAgent(from_id)) || (RlvUIEnabler::hasOpenProfile(from_id)) || (RlvUIEnabler::hasOpenIM(from_id));
args["NAME"] = LLSLURL("agent", from_id, (fRlvCanShowName) ? "completename" : "rlvanonym").getSLURLString();;
args["ORIGINAL_NAME"] = fRlvCanShowName ? original_name : RlvStrings::getAnonym(original_name);
// [/RLVa:KB]
LLSD payload;
payload["from_id"] = from_id;

View File

@ -1356,9 +1356,11 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
bool new_dead_object = true;
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
LL_INFOS() << "Object " << objectp->mID << " already on dead list!" << LL_ENDL;
new_dead_object = false;
}
else
{
@ -1395,7 +1397,10 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
// Also, not cleaned up
removeDrawable(objectp->mDrawable);
mNumDeadObjects++;
if(new_dead_object)
{
mNumDeadObjects++;
}
}
static LLTrace::BlockTimerStatHandle FTM_REMOVE_DRAWABLE("Remove Drawable");

View File

@ -33,6 +33,7 @@
#include <iostream>
#include <fstream>
#include <algorithm>
#include <boost/filesystem.hpp>
#include <boost/lambda/core.hpp>
#include <boost/regex.hpp>
@ -4853,6 +4854,21 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
// <FS:Ansariel> Threaded filepickers
void do_save_image(LLImageFormatted* image, const std::string& snapshot_dir, const std::string& base_name, const std::string& extension, boost::function<void(bool)> callback)
{
// Check if there is enough free space to save snapshot
#ifdef LL_WINDOWS
boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(snapshot_dir));
#else
boost::filesystem::space_info b_space = boost::filesystem::space(snapshot_dir);
#endif
if (b_space.free < image->getDataSize())
{
if (callback)
{
callback(false);
}
return;
}
// Look for an unused file name
std::string filepath;
S32 i = 1;
@ -4908,10 +4924,13 @@ void LLViewerWindow::saveImageCallback(const std::string& filename, LLImageForma
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
// <FS:Ansariel> Threaded filepickers
//BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker)
//BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory)
void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker, boost::function<void(bool)> callback)
// </FS:Ansariel>
{
// <FS:Ansariel> Threaded filepickers
//insufficient_memory = FALSE;
if (!image)
{
LL_WARNS() << "No image to save" << LL_ENDL;
@ -4963,6 +4982,17 @@ void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke
// LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
//}
// Check if there is enough free space to save snapshot
//#ifdef LL_WINDOWS
// boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir));
//#else
// boost::filesystem::space_info b_space = boost::filesystem::space(sSnapshotDir);
//#endif
// if (b_space.free < image->getDataSize())
// {
// insufficient_memory = TRUE;
// return FALSE;
// }
//// Look for an unused file name
//std::string filepath;
//S32 i = 1;

View File

@ -354,7 +354,7 @@ public:
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
// <FS:Ansariel> Threaded filepickers
//BOOL saveImageNumbered(LLImageFormatted *image, bool force_picker = false);
BOOL saveImageNumbered(LLImageFormatted *image, BOOL force_picker, BOOL& insufficient_memory);
void saveImageNumbered(LLImageFormatted *image, bool force_picker = false, boost::function<void(bool)> callback = NULL);
void saveImageCallback(const std::string& filename, LLImageFormatted* image, const std::string& extension, boost::function<void(bool)> callback);
// </FS:Ansariel>
@ -427,6 +427,7 @@ public:
bool getSystemUIScaleFactorChanged() { return mSystemUIScaleFactorChanged; }
static void showSystemUIScaleFactorChanged();
static std::string getLastSnapshotDir() { return sSnapshotDir; }
private:
bool shouldShowToolTipFor(LLMouseHandler *mh);

View File

@ -4050,11 +4050,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// don't early out for your own avatar, as we rely on your animations playing reliably
// for example, the "turn around" animation when entering customize avatar needs to trigger
// even when your avatar is offscreen
if (!visible && !isSelf())
{
updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
// <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
//if (!visible && !isSelf())
//{
// updateMotions(LLCharacter::HIDDEN_UPDATE);
// return FALSE;
//}
// </FS:Ansariel>
// <FS:Zi> Optionally disable the usage of timesteps, testing if this affects performance or
// creates animation issues - FIRE-3657
@ -4074,6 +4076,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
removeAnimationData("Walk Speed");
}
mMotionController.setTimeStep(time_step);
mMotionController.setUpdateFactor(mUpdatePeriod); // <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
// LL_INFOS() << "Setting timestep to " << time_quantum * pixel_area_scale << LL_ENDL;
}
// <FS:Zi> Optionally disable the usage of timesteps, testing if this affects performance or
@ -4081,9 +4084,18 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
else
{
mMotionController.setTimeStep(0.0f);
mMotionController.setUpdateFactor(mUpdatePeriod); // <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
}
// </FS:Zi>
// <FS:Ansariel> Fix impostered animation speed based on a fix by Henri Beauchamp
if (!visible && !isSelf())
{
updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
// </FS:Ansariel>
if (getParent() && !mIsSitting)
{
sitOnObject((LLViewerObject*)getParent());

View File

@ -2785,7 +2785,9 @@ bool LLVOAvatarSelf::updateAvatarRezMetrics(bool force_send)
{
const F32 AV_METRICS_INTERVAL_QA = 30.0;
F32 send_period = 300.0;
if (gSavedSettings.getBOOL("QAModeMetrics"))
static LLCachedControl<bool> qa_mode_metrics(gSavedSettings,"QAModeMetrics");
if (qa_mode_metrics)
{
send_period = AV_METRICS_INTERVAL_QA;
}

View File

@ -312,7 +312,7 @@ public:
}
XMLRPC_RequestSetData(request, xparams);
mTransaction.reset(new LLXMLRPCTransaction(mUri, request));
mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD()));
mPreviousStatus = mTransaction->status(NULL);
// Free the XMLRPC_REQUEST object and the attached data values.

View File

@ -208,7 +208,7 @@ public:
std::string mCertStore;
LLPointer<LLCertificate> mErrorCert;
Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip);
Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
Impl(const std::string& uri,
const std::string& method, LLXMLRPCValue params, bool useGzip);
~Impl();
@ -219,7 +219,7 @@ public:
void setHttpStatus(const LLCore::HttpStatus &status);
private:
void init(XMLRPC_REQUEST request, bool useGzip);
void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);
};
LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request,
@ -315,13 +315,13 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,
//=========================================================================
LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_REQUEST request, bool useGzip)
XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
: mHttpRequest(),
mStatus(LLXMLRPCTransaction::StatusNotStarted),
mURI(uri),
mResponse(0)
{
init(request, useGzip);
init(request, useGzip, httpParams);
}
@ -337,7 +337,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);
XMLRPC_RequestSetData(request, params.getValue());
init(request, useGzip);
init(request, useGzip, LLSD());
// DEV-28398: without this XMLRPC_RequestFree() call, it looks as though
// the 'request' object is simply leaked. It's less clear to me whether we
// should also ask to free request value data (second param 1), since the
@ -345,7 +345,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_RequestFree(request, 1);
}
void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
{
LLCore::HttpOptions::ptr_t httpOpts;
LLCore::HttpHeaders::ptr_t httpHeaders;
@ -359,7 +359,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer
httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions());
httpOpts->setTimeout(40L);
// delay between repeats will start from 5 sec and grow to 20 sec with each repeat
httpOpts->setMinBackoff(5E6L);
httpOpts->setMaxBackoff(20E6L);
httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L);
if (httpParams.has("retries"))
{
httpOpts->setRetries(httpParams["retries"].asInteger());
}
bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
mCertStore = gSavedSettings.getString("CertStore");
@ -526,8 +534,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)
LLXMLRPCTransaction::LLXMLRPCTransaction(
const std::string& uri, XMLRPC_REQUEST request, bool useGzip)
: impl(* new Impl(uri, request, useGzip))
const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)
: impl(* new Impl(uri, request, useGzip, httpParams))
{ }

View File

@ -85,7 +85,7 @@ class LLXMLRPCTransaction
{
public:
LLXMLRPCTransaction(const std::string& uri,
XMLRPC_REQUEST request, bool useGzip = true);
XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD());
// does not take ownership of the request object
// request can be freed as soon as the transaction is constructed

View File

@ -6,13 +6,16 @@
<floater.string name="loading_url">
data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Weiter" label_selected="Weiter" name="Continue"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<check_box label="Ich stimme den Servicebedingungen und Datenschutzbestimmungen zu." name="agree_chk"/>
<text name="tos_heading">
Lesen Sie die folgenden Servicebedingungen und Datenbestimmungen sorgfältig durch. Sie müssen den Servicebedingungen zustimmen, um sich bei [CURRENT_GRID] anmelden zu können.
Lesen Sie die folgenden Geschäftsbedingungen, Datenschutzbestimmungen und Servicebedingungen sorgfältig durch, einschließlich der Voraussetzungen für Schiedsgerichtsverfahren und dem Verzicht auf jegliche Ansprüche zur Beilegung von Streitigkeiten. Sie müssen den Bedingungen zustimmen, um sich anmelden zu können.
</text>
<text name="external_tos_required">
Sie müssen sich unter https://my.secondlife.com anmelden und die Servicebedingungen akzeptieren, bevor Sie fortfahren können. Vielen Dank!
</text>
<check_box label="Ich habe gelesen und stimme zu:" name="agree_chk"/>
<text name="agree_list">
Den Geschäftsbedingungen, Datenschutzbestimmungen und Servicebedingungen, einschließlich der Voraussetzungen zur Beilegung von Streitigkeiten
</text>
<button label="Weiter" label_selected="Weiter" name="Continue"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Avatar Icon Menu">
<toggleable_menu name="Avatar Icon Menu">
<menu_item_call label="Profil anzeigen" name="Show Profile"/>
<menu_item_call label="IM" name="Send IM"/>
<menu_item_call label="Zu Einwohner teleportieren" name="Teleport to"/>
@ -20,4 +20,10 @@
<menu_item_call label="Url in Zwischenablage kopieren" name="copy url"/>
<menu_item_check label="Voice blockieren" name="Block Unblock"/>
<menu_item_check label="Chat blockieren" name="Mute Text"/>
</menu>
<context_menu label="Moderatoroptionen" name="Moderator Options">
<menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/>
<menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/>
<menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/>
</context_menu>
<menu_item_call label="Mitglied verbannen" name="BanMember"/>
</toggleable_menu>

View File

@ -3,6 +3,10 @@
<global name="skipnexttime">
Nicht mehr anzeigen
</global>
<global name="skipnexttimesessiononly">
Nicht mehr anzeigen
(für aktuelle Sitzung)
</global>
<global name="alwayschoose">
Diese Option immer auswählen
</global>
@ -349,7 +353,7 @@ Fortfahren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
</notification>
<notification name="JoinGroupNoCost">
Sie treten der Gruppe [NAME] bei.
Sie treten der Gruppe &lt;nolink&gt;[NAME]&lt;/nolink&gt; bei.
Fortfahren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
</notification>
@ -380,12 +384,12 @@ Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="JoinGroupMaxGroups">
Sie können der Gruppe [group_name] nicht beitreten:
Sie können der Gruppe &lt;nolink&gt;[group_name]&lt;/nolink&gt; nicht beitreten:
Sie sind bereits Mitglied in [group_count] Gruppen, das erlaubte Limit sind [max_groups].
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="JoinGroupClosedEnrollment">
Sie können der Gruppe [group_name] nicht beitreten:
Sie können der Gruppe &lt;nolink&gt;[group_name]&lt;/nolink&gt; nicht beitreten:
Die Gruppe besitzt keine öffentliche Anmeldung mehr.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@ -419,7 +423,7 @@ Der Verkaufspreis beträgt [SALE_PRICE] L$. Der Verkauf an [NAME] wird zu diesem
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren?
Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „&lt;nolink&gt;[NAME]&lt;/nolink&gt;“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren?
*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht!
@ -465,7 +469,7 @@ Objekte: [N]
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben?
Objekte auf dieser Parzelle, die von der Gruppe &lt;nolink&gt;[NAME]&lt;/nolink&gt; nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben?
Objekte: [N]
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@ -513,7 +517,7 @@ Um Medien nur auf einer Fläche einzufügen, wählen Sie „Oberfläche auswähl
Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON]
</notification>
<notification name="MustAgreeToLogIn">
Bevor Sie sich in [CURRENT_GRID] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen.
Bevor Sie sich in [CURRENT_GRID] anmelden können, müssen Sie den Geschäftsbedingungen, Datenschutzbestimmungen und Servicebedingungen zustimmen.
</notification>
<notification name="CouldNotPutOnOutfit">
Outfit konnte nicht angezogen werden.
@ -774,7 +778,7 @@ Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/>
</notification>
<notification name="EjectAvatarFromGroup">
Sie haben [AVATAR_NAME] aus der Gruppe [GROUP_NAME] geworfen.
Sie haben [AVATAR_NAME] aus der Gruppe &lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt; geworfen.
</notification>
<notification name="AcquireErrorTooManyObjects">
FEHLER: Zu viele Objekte ausgewählt.
@ -1386,7 +1390,7 @@ Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut.
Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt.
Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
Der Gruppe „[GROUP_NAME]“
Der Gruppe „&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;
[AREA] m² Land schenken?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@ -1395,7 +1399,7 @@ Der Gruppe „[GROUP_NAME]“
Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[NAME]“.
Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt.
Der Gruppe „[GROUP_NAME]“ [AREA] m² an Land schenken?
Der Gruppe „&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;“ [AREA] m² an Land schenken?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
@ -1806,7 +1810,7 @@ Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="GroupDepart">
Sie haben die Gruppe „[group_name]“ verlassen.
Sie haben die Gruppe „&lt;nolink&gt;[group_name]&lt;/nolink&gt;“ verlassen.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
@ -2504,7 +2508,17 @@ Diese Aktion kann nicht rückgängig gemacht werden.
</notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Vor dem Löschen von Objekten bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
<form name="form">
<ignore name="ignore" text="Vor dem Löschen von Objekten bestätigen"/>
<button name="Yes" text="OK"/>
<button name="No" text="Abbrechen"/>
</form>
</notification>
<notification name="DeleteFilteredItems">
Ein Filter ist auf Ihrem Inventar aktiv und es sind nicht alle Objekte sichtbar, die Sie löschen möchten.
Sind Sie sicher, dass Sie diese löschen möchten?
<usetemplate ignoretext="Bestätigten, wenn gefilterte Objekte gelöscht werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmUnlink">
Soll das ausgewählte Objekt wirklich getrennt werden?
@ -2927,7 +2941,7 @@ Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kon
Alle Objekte auf der ausgewählten Parzelle, die Einwohner &apos;[NAME]&apos; gehören, wurden an ihren Eigentümern zurückgegeben.
</notification>
<notification name="GroupObjectsReturned">
Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert.
Die mit der Gruppe &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert.
Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben.
Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht.
</notification>
@ -3383,7 +3397,7 @@ Um diese Berechtigung zu gewähren, laden Sie die neueste Version des Viewers vo
</form>
</notification>
<notification name="ScriptDialogGroup">
&lt;nolink&gt;[TITLE]&lt;/nolink&gt;“ von [GROUPNAME]
&lt;nolink&gt;[TITLE]&lt;/nolink&gt;“ von &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;
[MESSAGE]
<form name="form">
<button name="Client_Side_Mute" text="Blockieren"/>
@ -3431,7 +3445,7 @@ Klicken Sie auf &apos;Akzeptieren &apos;, um dem Gespräch beizutreten, oder au
[NAME] wurde ein Inventarobjekt angeboten und wird nicht länger ignoriert.
</notification>
<notification name="VoiceInviteGroup">
[NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
[NAME] ist einem Voice-Chat mit der Gruppe &lt;nolink&gt;[GROUP]&lt;/nolink&gt; beigetreten.
Klicken Sie auf &apos;Akzeptieren &apos;, um dem Gespräch beizutreten, oder auf &apos;Ablehnen &apos;, um die Einladung auszuschlagen. Klicken Sie auf Ignorieren, um diesen Anrufer zu ignorieren.
<form name="form">
<button name="Accept" text="Akzeptieren"/>

View File

@ -273,7 +273,6 @@ support@secondlife.com.
<string name="LoginFailedAccountDisabled">
Ihre Anfrage kann derzeit nicht bearbeitet werden.
Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an.
</string>
<string name="LoginFailedTransformError">
Nicht übereinstimmende Daten bei der Anmeldung festgestellt.

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu
<toggleable_menu
height="101"
layout="topleft"
left="100"
@ -142,5 +142,43 @@
name="Mute Text">
<on_click function="AvatarIcon.Action" parameter="mute_unmute" />
<on_check function="AvatarIcon.Check" parameter="is_muted" />
</menu_item_check>
</menu>
</menu_item_check>
<menu_item_separator layout="topleft" name="Moderator Options Separator"/>
<context_menu
label="Moderator Options"
layout="topleft"
name="Moderator Options">
<menu_item_check
label="Allow text chat"
layout="topleft"
name="AllowTextChat">
<on_check function="AvatarIcon.Check" parameter="is_allowed_text_chat" />
<on_click function="AvatarIcon.Action" parameter="toggle_allow_text_chat" />
<on_enable function="AvatarIcon.Enable" parameter="can_allow_text_chat" />
</menu_item_check>
<menu_item_call
label="Mute this participant"
layout="topleft"
name="ModerateVoiceMuteSelected">
<on_click function="AvatarIcon.Action" parameter="group_mute" />
<on_enable function="AvatarIcon.Enable" parameter="can_mute" />
<on_visible function="AvatarIcon.Visible" parameter="show_mute" />
</menu_item_call>
<menu_item_call
label="Unmute this participant"
layout="topleft"
name="ModerateVoiceUnMuteSelected">
<on_click function="AvatarIcon.Action" parameter="group_unmute" />
<on_enable function="AvatarIcon.Enable" parameter="can_unmute" />
<on_visible function="AvatarIcon.Visible" parameter="show_unmute" />
</menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" name="Group Ban Separator"/>
<menu_item_call
label="Ban member"
layout="topleft"
name="BanMember">
<on_click function="AvatarIcon.Action" parameter="ban_member" />
<on_enable function="AvatarIcon.Enable" parameter="can_ban_member" />
</menu_item_call>
</toggleable_menu>

View File

@ -5,6 +5,11 @@
Do not show me this again
</global>
<global name="skipnexttimesessiononly">
Don&apos;t show me this again
(for current session)
</global>
<global name="alwayschoose">
Always choose this option
@ -870,7 +875,7 @@ Do you wish to proceed?
icon="alertmodal.tga"
name="JoinGroupNoCost"
type="alertmodal">
You are joining group [NAME].
You are joining group &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
Do you wish to proceed?
<tag>group</tag>
<tag>confirm</tag>
@ -961,7 +966,7 @@ Sorry, trial users can't join groups.
icon="alertmodal.tga"
name="JoinGroupMaxGroups"
type="alertmodal">
You cannot join '[group_name]':
You cannot join &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
You are already a member of [group_count] groups, the maximum number allowed is [max_groups]
<tag>success</tag>
<tag>group_id</tag>
@ -977,7 +982,7 @@ You are already a member of [group_count] groups, the maximum number allowed is
icon="alertmodal.tga"
name="JoinGroupClosedEnrollment"
type="alertmodal">
You cannot join '[group_name]':
You cannot join &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
The group no longer has open enrollment.
<tag>group_id</tag>
<tag>success</tag>
@ -1066,7 +1071,7 @@ Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NA
icon="alertmodal.tga"
name="ReturnObjectsDeededToGroup"
type="alertmodal">
Are you sure you want to return all objects shared with the group &apos;[NAME]&apos; on this parcel of land back to their previous owner&apos;s inventory?
Are you sure you want to return all objects shared with the group &apos;&lt;nolink&gt;[NAME]&lt;/nolink&gt;&apos; on this parcel of land back to their previous owner&apos;s inventory?
*WARNING* This will delete the non-transferable objects deeded to the group!
@ -1169,7 +1174,7 @@ Are you sure you want to disable all objects in this region?
icon="alertmodal.tga"
name="ReturnObjectsNotOwnedByGroup"
type="alertmodal">
Return the objects on this parcel of land that are *NOT* shared with the group [NAME] back to their owners?
Return the objects on this parcel of land that are NOT shared with the group &lt;nolink&gt;[NAME]&lt;/nolink&gt; back to their owners?
Objects: [N]
<tag>confirm</tag>
@ -1294,7 +1299,7 @@ There was a problem uploading a report screenshot due to the following reason: [
name="MustAgreeToLogIn"
type="alertmodal">
<tag>fail</tag>
You must agree to the Terms of Service to continue logging into [CURRENT_GRID].
You must agree to the Terms and Conditions, Privacy Policy, and Terms of Service to continue logging into [CURRENT_GRID].
</notification>
<notification
@ -2043,7 +2048,7 @@ Eject the following avatars from your land?
name="EjectAvatarFromGroup"
persist="true"
type="notify">
You ejected [AVATAR_NAME] from group [GROUP_NAME].
You ejected [AVATAR_NAME] from group &lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;.
<tag>group</tag>
</notification>
@ -3454,7 +3459,7 @@ Please select a smaller area and try again.
By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
Deed this [AREA] m² of land to the group &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<tag>group</tag>
<tag>confirm</tag>
<usetemplate
@ -3471,7 +3476,7 @@ By deeding this parcel, the group will be required to have and maintain sufficie
The deed will include a simultaneous land contribution to the group from &apos;[NAME]&apos;.
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
Deed this [AREA] m² of land to the group &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<tag>group</tag>
<tag>confirm</tag>
<usetemplate
@ -4137,7 +4142,7 @@ Leave Group?
icon="notify.tga"
name="GroupDepart"
type="notify">
You have left the group &apos;[group_name]&apos;.
You have left the group &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;.
<tag>group</tag>
</notification>
@ -5989,9 +5994,34 @@ You cannot undo this action.
type="alertmodal">
<unique/>
[QUESTION]
<tag>confirm</tag>
<form name="form">
<ignore name="ignore"
session_only="true"
text="Confirm before deleting items"/>
<button
default="true"
index="0"
name="Yes"
text="OK"/>
<button
index="1"
name="No"
text="Cancel"/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="DeleteFilteredItems"
type="alertmodal">
<unique/>
Your inventory is currently filtered and not all of the items you're about to delete are currently visible.
Are you sure you want to delete them?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before deleting items"
ignoretext="Confirm before deleting filtered items"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
@ -7234,7 +7264,7 @@ The objects on the selected parcel of land owned by the resident &apos;[NAME]&ap
name="GroupObjectsReturned"
persist="true"
type="notify">
The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
The objects on the selected parcel of land shared with the group &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; have been returned back to their owner&apos;s inventory.
Transferable deeded objects have been returned to their previous owners.
Non-transferable objects that are deeded to the group have been deleted.
<tag>group</tag>
@ -7776,6 +7806,7 @@ Do you want to keep it? "Mute" will block all future offers or messages from [NA
label="Teleport offer from [NAME_LABEL]"
log_to_im="true"
log_to_chat="false"
fade_toast="false"
type="offer"
sound="UISndTeleportOffer">
[NAME_SLURL] has offered to teleport you to their location:
@ -7918,6 +7949,7 @@ However, this region contains content accessible to adults only.
icon="notify.tga"
name="TeleportRequest"
log_to_im="true"
fade_toast="false"
type="offer">
[NAME_SLURL] is requesting to be teleported to your location.
[MESSAGE]
@ -8294,6 +8326,7 @@ Other Key Experiences may be available.
icon="notify.tga"
name="ScriptQuestionExperience"
persist="false"
fade_toast="false"
type="notify">
&apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, requests your participation in the [GRID_WIDE] experience:
@ -8402,7 +8435,7 @@ To grant this permission please update your viewer to the latest version from [D
show_toast="false"
type="notify">
<tag>group</tag>
[GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
&lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
<form name="form">
<button
@ -8533,7 +8566,7 @@ Click Accept to join the call or Decline to decline the invitation. Click mute t
icon="notify.tga"
name="VoiceInviteGroup"
type="notify">
[NAME] has joined a Voice Chat call with the group [GROUP].
[NAME] has joined a Voice Chat call with the group &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Click Accept to join the call or Decline to decline the invitation. Click mute to permanently block all messages from this caller.
<tag>group</tag>
<tag>confirm</tag>
@ -8865,6 +8898,11 @@ Appearance has been saved to XML to [PATH]
Failed to save appearance to XML.
</notification>
<notification icon="notifytip.tga"
name="SnapshotToComputerFailed" type="notifytip">
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="PresetNotSaved"

View File

@ -165,8 +165,7 @@ support@secondlife.com.</string>
<string name="LoginFailedAcountSuspended">Your account is not accessible until
[TIME] Pacific Time.</string>
<string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
Please contact Second Life support for assistance at http://secondlife.com/support.
If you are unable to change your password, please call (866) 476-9763.</string>
Please contact Second Life support for assistance at http://support.secondlife.com.</string>
<string name="LoginFailedTransformError">Data inconsistency found during login.
Please contact support@secondlife.com.</string>
<string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.

View File

@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="modal container">
<floater.string name="loading_url">
data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wczytywanie: %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20korzystania%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wczytywanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
<check_box label="Zgadzam się na Warunki korzystania z Usług (Terms of Service) i Politykę Prywatności (Privacy Policy)" name="agree_chk"/>
<text name="tos_heading">
Proszę dokładnie przeczytać Warunki korzystania z Usług (Terms of Service) i Politykę Prywatności (Privacy Policy). Musisz je zaakceptować, aby kontynuować logowanie.
Proszę przeczytać Regulamin (Terms and Conditions), Politykę Prywatności (Privacy Policy) i Warunki korzystania z Usług (Terms of Service) wraz z wymaganiami potrzebnymi do uzyskania arbitrażu oraz zrzeczeniem się grupowych skarg w celu rozwiązywania sporów. Musisz je zaakceptować, aby kontynuować logowanie.
</text>
<text name="external_tos_required">
Aby kontynuować będziesz musiał/a zalogować się do https://my.secondlife.com i zaakceptować Warunki korzystania. Dziękujemy!
</text>
<check_box label="Przeczytałem/am i zgadzam się na" name="agree_chk" />
<text name="agree_list">
Regulamin (Terms and Conditions), Politykę Prywatności (Privacy Policy) i Warunki korzystania z Usług (Terms of Service) wraz z wymagamiani rozwiązywania sporów.
</text>
<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue" />
<button label="Anuluj" label_selected="Anuluj" name="Cancel" />
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Avatar Icon Menu">
<toggleable_menu name="Avatar Icon Menu">
<menu_item_call label="Profil" name="Show Profile"/>
<menu_item_call label="Czat/IM..." name="Send IM"/>
<menu_item_call label="Teleportuj do rezydenta" name="Teleport to"/>
@ -20,4 +20,10 @@
<menu_item_call label="Kopiuj URL do schowka" name="copy url"/>
<menu_item_check label="Blokuj głos" name="Block Unblock"/>
<menu_item_check label="Blokuj tekst" name="Mute Text"/>
</menu>
<context_menu label="Opcje moderatora" name="Moderator Options">
<menu_item_check label="Zezwól na czat tekstowy" name="AllowTextChat" />
<menu_item_call label="Wycisz tego rozmówcę" name="ModerateVoiceMuteSelected" />
<menu_item_call label="Odblokuj tego rozmówcę" name="ModerateVoiceUnMuteSelected" />
</context_menu>
<menu_item_call label="Zbanuj" name="BanMember" />
</toggleable_menu>

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<notifications>
<global name="skipnexttime">
Nie pokazuj tego następnym razem
Nie pokazuj tego ponownie
</global>
<global name="skipnexttimesessiononly">
Nie pokazuj tego ponownie
(dla obecnej sesji)
</global>
<global name="alwayschoose">
Zawsze wybieraj tą opcję
@ -275,7 +279,7 @@ Chcesz kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/>
</notification>
<notification name="JoinGroupNoCost">
Dołączasz do grupy [NAME].
Dołączasz do grupy &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
Czy chcesz kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/>
</notification>
@ -302,11 +306,11 @@ Zaproś kogoś w ciągu 48 godzin.
Przepraszamy, ale konta próbne nie mogą dołączać do grup.
</notification>
<notification name="JoinGroupMaxGroups">
Nie możesz dołączyć do '[group_name]':
Nie możesz dołączyć do &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
Jesteś już w [group_count] grupach, a maksymalny dozwolony limit to [max_groups]
</notification>
<notification name="JoinGroupClosedEnrollment">
Nie możesz dołączyć do '[group_name]':
Nie możesz dołączyć do &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
Grupa nie umożliwia już swobodnego dołączania.
</notification>
<notification name="JoinGroupSuccess">
@ -336,7 +340,7 @@ Cena wynosi [SALE_PRICE]L$, a sprzedaż będzie autoryzowana dla [NAME].
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="ReturnObjectsDeededToGroup">
Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie &apos;[NAME]&apos; na tej działce do szaf ich poprzednich właścicieli?
Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie &apos;&lt;nolink&gt;[NAME]&lt;/nolink&gt;&apos; na tej działce do szaf ich poprzednich właścicieli?
*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
@ -382,7 +386,7 @@ Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
Zwrócić obiekty z tej działki, które NIE są udostępnione grupie [NAME] do ich właścicieli?
Zwrócić obiekty z tej działki, które NIE są udostępnione grupie &lt;nolink&gt;[NAME]&lt;/nolink&gt; do ich właścicieli?
Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@ -430,7 +434,7 @@ W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z narzędzia
W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
</notification>
<notification name="MustAgreeToLogIn">
Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [CURRENT_GRID].
Musisz zaakceptować Regulamin (Terms and Conditions), Politykę Prywatności (Privacy Policy) i Warunki korzystania z Usług (Terms of Service) by kontynuować logowanie się do [CURRENT_GRID].
</notification>
<notification name="CouldNotPutOnOutfit">
Założenie stroju nie powiodło się.
@ -699,7 +703,7 @@ Nie będą mogły tymczasowo się poruszać, używać czatu (IM) lub oddziaływa
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć"/>
</notification>
<notification name="EjectAvatarFromGroup">
Wyrzuciłeś/aś [AVATAR_NAME] z grupy [GROUP_NAME]
Wyrzuciłeś/aś [AVATAR_NAME] z grupy &lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;.
</notification>
<notification name="AcquireErrorTooManyObjects">
BŁĄD OTRZYMYWANIA: Zbyt wiele wybranych obiektów.
@ -1301,7 +1305,7 @@ Wybierz mniejszy obszar i spróbuj jeszcze raz.
Po przekazaniu tej działki grupa będzie musiała mieć i utrzymywać wystarczający kredyt na używanie działki.
Cena zakupu działki nie jest zwracana właścicielowi. Jeżeli przekazana działka zostanie sprzedana, cena sprzedaży zostanie podzielona pomiędzy członków grupy.
Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="DeedLandToGroupWithContribution">
@ -1309,7 +1313,7 @@ Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos
Przekazanie będzie zawierać równoczesne przypisanie działki do grupy od &apos;[NAME]&apos;.
Cena zakupu działki nie jest zwracana właścicielowi. Jeżeli przekazana działka zostanie sprzedana, cena sprzedaży zostanie podzielona pomiędzy członków grupy.
Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="DisplaySetToSafe">
@ -1703,7 +1707,7 @@ Chcesz ją opuścić?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="GroupDepart">
Opuściłeś/aś grupę &apos;[group_name]&apos;.
Opuściłeś/aś grupę &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;.
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
Jesteś członkiem grupy &lt;nolink&gt;[GROUP]&lt;/nolink&gt;. Ponowne dołączenie będzie kosztować [AMOUNT] L$.
@ -2339,7 +2343,16 @@ Nie możesz tego cofnąć.
</notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Anuluj" />
<form name="form">
<ignore name="ignore" text="Potwierdź przed kasowaniem obiektów" />
<button name="No" text="Anuluj" />
</form>
</notification>
<notification name="DeleteFilteredItems">
Twoja Szafa jest obecnie filtrowana i nie wszystkie obiekty jakie masz zamiar usunąć są teraz widoczne.
Czy na pewno chcesz je skasować?
<usetemplate ignoretext="Potwierdź przed kasowaniem filtrowanych obiektów" name="okcancelignore" notext="Anuluj" />
</notification>
<notification name="ConfirmUnlink">
Na pewno chcesz rozłączyć zaznaczony obiekt?
@ -2800,7 +2813,7 @@ Zainstaluj wtyczki ponownie lub skontaktuj się z dostawcą, jeśli problem nada
Obiekty z działki należącej do Rezydenta [NAME] zostały zwrócone do jego Szafy.
</notification>
<notification name="GroupObjectsReturned">
Obiekty z wybranej działki przypisane do grupy [GROUPNAME] zostały zwrócone do szaf ich właścicieli.
Obiekty z wybranej działki przypisane do grupy &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; zostały zwrócone do szaf ich właścicieli.
Przekazywalne obiekty przekazane grupie zostały zwrócone do ich poprzednich właścicieli.
Nieprzekazywalne obiekty przekazane grupie zostały usunięte.
</notification>
@ -3249,7 +3262,7 @@ Aby ich udzielić prosimy zaktualizować przeglądarkę do najnowszej wersji z [
</form>
</notification>
<notification name="ScriptDialogGroup">
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; - [GROUPNAME]
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; - &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;
[MESSAGE]
<form name="form">
<button name="Client_Side_Mute" text="Blokuj"/>
@ -3297,7 +3310,7 @@ Wybierz Zablokuj żeby wyciszyć wszystkie wiadomości od tej osoby.
Zaoferowano [NAME] obiekty i ta osoba została automatycznie odblokowana.
</notification>
<notification name="VoiceInviteGroup">
[NAME] zaczyna rozmowę głosową z grupą [GROUP].
[NAME] zaczyna rozmowę głosową z grupą &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
<form name="form">
@ -3409,6 +3422,9 @@ Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
<notification name="AppearanceToXMLFailed">
Nie udało się zapisać wyglądu do XML.
</notification>
<notification name="SnapshotToComputerFailed">
Nie można zapisać zrzutu ekranu do [PATH]: Dysk jest pełny. Potrzeba [NEED_MEMORY]KB, ale wolnego jest [FREE_MEMORY]KB.
</notification>
<notification name="PresetNotSaved">
Błąd podczas zapisywania ustawienia [NAME].
</notification>

View File

@ -252,8 +252,7 @@ support@secondlife.com
</string>
<string name="LoginFailedAccountDisabled">
Nie jesteśmy w stanie na tą chwilę wykonać Twojego żądania.
Aby uzyskać pomoc skontaktuj się ze wsparciem: http://secondlife.com/support
Jeśli nie możesz zmienić swojego hasła zadzwoń pod numer (866) 476-9763.
Aby uzyskać pomoc skontaktuj się ze wsparciem: http://support.secondlife.com
</string>
<string name="LoginFailedTransformError">
Podczas logowania wykryto niespójność danych.