summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/indra_constants.h2
-rw-r--r--indra/llcommon/llstring.cpp58
-rw-r--r--indra/llcommon/llstring.h32
-rw-r--r--indra/llcommon/llsys.cpp77
-rw-r--r--indra/llcommon/llsys.h2
-rw-r--r--indra/llcommon/llversionviewer.h2
-rw-r--r--indra/llmath/llvolume.cpp32
-rw-r--r--indra/llmessage/llhttpclient.cpp5
-rw-r--r--indra/llmessage/llhttpclient.h1
-rw-r--r--indra/llmessage/lltemplatemessagereader.cpp6
-rw-r--r--indra/llmessage/llurlrequest.cpp7
-rw-r--r--indra/llmessage/llurlrequest.h1
-rw-r--r--indra/llui/llfloater.cpp23
-rw-r--r--indra/llui/llfloater.h3
-rw-r--r--indra/llvfs/lldir.cpp8
-rw-r--r--indra/llvfs/lldir.h3
-rw-r--r--indra/llwindow/llwindowwin32.cpp22
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp78
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist2
-rw-r--r--indra/newview/llappviewer.cpp174
-rw-r--r--indra/newview/llappviewer.h7
-rw-r--r--indra/newview/llfloaterland.cpp2
-rw-r--r--indra/newview/llfloaterreporter.cpp2
-rw-r--r--indra/newview/llfolderview.cpp31
-rw-r--r--indra/newview/llfolderview.h3
-rw-r--r--indra/newview/llinventorybridge.h1
-rw-r--r--indra/newview/llpanelavatar.cpp11
-rw-r--r--indra/newview/llpanelclassified.cpp62
-rw-r--r--indra/newview/llpanelclassified.h2
-rw-r--r--indra/newview/llpanellogin.cpp127
-rw-r--r--indra/newview/llpanellogin.h9
-rw-r--r--indra/newview/llselectmgr.cpp3
-rw-r--r--indra/newview/llstartup.cpp46
-rw-r--r--indra/newview/lltexturectrl.cpp6
-rw-r--r--indra/newview/llvieweraudio.cpp16
-rw-r--r--indra/newview/llviewermenu.cpp102
-rw-r--r--indra/newview/llviewermessage.cpp17
-rw-r--r--indra/newview/llviewernetwork.cpp28
-rw-r--r--indra/newview/llviewernetwork.h7
-rw-r--r--indra/newview/llviewerobject.cpp18
-rw-r--r--indra/newview/llviewerstats.cpp33
-rw-r--r--indra/newview/llviewerstats.h3
-rw-r--r--indra/newview/llviewertexteditor.cpp5
-rw-r--r--indra/newview/llviewerwindow.cpp73
-rw-r--r--indra/newview/llviewerwindow.h1
-rw-r--r--indra/newview/llvoavatar.cpp5
-rw-r--r--indra/newview/llvovolume.cpp3
-rw-r--r--indra/newview/llwindebug.cpp59
-rw-r--r--indra/test/llhttpclient_tut.cpp8
-rw-r--r--indra/win_crash_logger/StdAfx.h3
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp72
52 files changed, 943 insertions, 364 deletions
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index b7d35780ae..0195893b16 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -336,7 +336,7 @@ const U32 MAP_ITEM_CLASSIFIED = 0x08;
// Crash reporter behavior
const char* const CRASH_SETTINGS_FILE = "crash_settings.xml";
-const char* const CRASH_BEHAVIOR_SETTING = "CrashBehavior";
+const char* const CRASH_BEHAVIOR_SETTING = "CrashLogBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
const S32 CRASH_BEHAVIOR_NEVER_SEND = 2;
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 9895a684b2..a688bc1c6f 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -34,6 +34,13 @@
#include "llstring.h"
#include "llerror.h"
+#if LL_WINDOWS
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <windows.h>
+#include <winnls.h> // for WideCharToMultiByte
+#endif
+
std::string ll_safe_string(const char* in)
{
if(in) return std::string(in);
@@ -796,19 +803,7 @@ std::string utf8str_removeCRLF(const std::string& utf8str)
}
#if LL_WINDOWS
-/* If the size of the passed in buffer is not large enough to hold the string,
- * two bad things happen:
- * 1. resulting formatted string is NOT null terminated
- * 2. Depending on the platform, the return value could be a) the required
- * size of the buffer to copy the entire formatted string or b) -1.
- * On Windows with VS.Net 2003, it returns -1 e.g.
- *
- * safe_snprintf always adds a NULL terminator so that the caller does not
- * need to check for return value or need to add the NULL terminator.
- * It does not, however change the return value - to let the caller know
- * that the passed in buffer size was not large enough to hold the formatted string.
- *
- */
+// documentation moved to header. Phoenix 2007-11-27
int safe_snprintf(char *str, size_t size, const char *format, ...)
{
va_list args;
@@ -820,6 +815,43 @@ int safe_snprintf(char *str, size_t size, const char *format, ...)
str[size-1] = '\0'; // always null terminate
return num_written;
}
+
+std::string ll_convert_wide_to_string(const wchar_t* in)
+{
+ std::string out;
+ if(in)
+ {
+ int len_in = wcslen(in);
+ int len_out = WideCharToMultiByte(
+ CP_ACP,
+ 0,
+ in,
+ len_in,
+ NULL,
+ 0,
+ 0,
+ 0);
+ // We will need two more bytes for the double NULL ending
+ // created in WideCharToMultiByte().
+ char* pout = new char [len_out + 2];
+ memset(pout, 0, len_out + 2);
+ if(pout)
+ {
+ WideCharToMultiByte(
+ CP_ACP,
+ 0,
+ in,
+ len_in,
+ pout,
+ len_out,
+ 0,
+ 0);
+ out.assign(pout);
+ delete[] pout;
+ }
+ }
+ return out;
+}
#endif // LL_WINDOWS
S32 LLStringOps::collate(const llwchar* a, const llwchar* b)
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index e2f605db4f..88d7e88edc 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -494,7 +494,37 @@ std::ostream& operator<<(std::ostream &s, const LLStringBase<T> &str)
std::ostream& operator<<(std::ostream &s, const LLWString &wstr);
#if LL_WINDOWS
-int safe_snprintf(char *str, size_t size, const char *format, ...);
+/* @name Windows string helpers
+ */
+//@{
+
+/**
+ * @brief Implementation the expected snprintf interface.
+ *
+ * If the size of the passed in buffer is not large enough to hold the string,
+ * two bad things happen:
+ * 1. resulting formatted string is NOT null terminated
+ * 2. Depending on the platform, the return value could be a) the required
+ * size of the buffer to copy the entire formatted string or b) -1.
+ * On Windows with VS.Net 2003, it returns -1 e.g.
+ *
+ * safe_snprintf always adds a NULL terminator so that the caller does not
+ * need to check for return value or need to add the NULL terminator.
+ * It does not, however change the return value - to let the caller know
+ * that the passed in buffer size was not large enough to hold the
+ * formatted string.
+ *
+ */
+int safe_snprintf(char* str, size_t size, const char* format, ...);
+
+/**
+ * @brief Convert a wide string to std::string
+ *
+ * This replaces the unsafe W2A macro from ATL.
+ */
+std::string ll_convert_wide_to_string(const wchar_t* in);
+
+//@}
#endif // LL_WINDOWS
/**
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3b57db772c..7346b29fb1 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -65,8 +65,7 @@ static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
LLOSInfo::LLOSInfo() :
- mMajorVer(0), mMinorVer(0), mBuild(0),
- mOSString("")
+ mMajorVer(0), mMinorVer(0), mBuild(0)
{
#if LL_WINDOWS
@@ -94,27 +93,28 @@ LLOSInfo::LLOSInfo() :
// Test for the product.
if(osvi.dwMajorVersion <= 4)
{
- mOSString = "Microsoft Windows NT ";
+ mOSStringSimple = "Microsoft Windows NT ";
}
else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
{
- mOSString = "Microsoft Windows 2000 ";
+ mOSStringSimple = "Microsoft Windows 2000 ";
}
else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1)
{
- mOSString = "Microsoft Windows XP ";
+ mOSStringSimple = "Microsoft Windows XP ";
}
else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
{
if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSString = "Microsoft Windows XP x64 Edition ";
- else mOSString = "Microsoft Windows Server 2003 ";
+ mOSStringSimple = "Microsoft Windows XP x64 Edition ";
+ else
+ mOSStringSimple = "Microsoft Windows Server 2003 ";
}
else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
{
if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSString = "Microsoft Windows Vista ";
- else mOSString = "Microsoft Windows Vista Server ";
+ mOSStringSimple = "Microsoft Windows Vista ";
+ else mOSStringSimple = "Microsoft Windows Vista Server ";
}
else // Use the registry on early versions of Windows NT.
{
@@ -129,15 +129,15 @@ LLOSInfo::LLOSInfo() :
RegCloseKey( hKey );
if ( lstrcmpi( L"WINNT", szProductType) == 0 )
{
- mOSString += "Professional ";
+ mOSStringSimple += "Professional ";
}
else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 )
{
- mOSString += "Server ";
+ mOSStringSimple += "Server ";
}
else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 )
{
- mOSString += "Advanced Server ";
+ mOSStringSimple += "Advanced Server ";
}
}
@@ -164,7 +164,7 @@ LLOSInfo::LLOSInfo() :
csdversion.c_str(),
(osvi.dwBuildNumber & 0xffff));
}
- mOSString += tmp;
+ mOSString = mOSStringSimple + tmp;
}
break;
@@ -172,41 +172,65 @@ LLOSInfo::LLOSInfo() :
// Test for the Windows 95 product family.
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
{
- mOSString = "Microsoft Windows 95 ";
+ mOSStringSimple = "Microsoft Windows 95 ";
if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
{
- mOSString += "OSR2 ";
+ mOSStringSimple += "OSR2 ";
}
}
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
{
- mOSString = "Microsoft Windows 98 ";
+ mOSStringSimple = "Microsoft Windows 98 ";
if ( osvi.szCSDVersion[1] == 'A' )
{
- mOSString += "SE ";
+ mOSStringSimple += "SE ";
}
}
if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
{
- mOSString = "Microsoft Windows Millennium Edition ";
- }
+ mOSStringSimple = "Microsoft Windows Millennium Edition ";
+ }
+ mOSString = mOSStringSimple;
break;
}
#else
struct utsname un;
- if(uname(&un) != -1)
+ if(uname(&un) != -1)
{
- mOSString.append(un.sysname);
- mOSString.append(" ");
- mOSString.append(un.release);
+ mOSStringSimple.append(un.sysname);
+ mOSStringSimple.append(" ");
+ mOSStringSimple.append(un.release);
+
+ mOSString = mOSStringSimple;
mOSString.append(" ");
mOSString.append(un.version);
mOSString.append(" ");
mOSString.append(un.machine);
+
+ // Simplify 'Simple'
+ std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0));
+ if (ostype == "Darwin")
+ {
+ // Only care about major Darwin versions, truncate at first '.'
+ S32 idx1 = mOSStringSimple.find_first_of(".", 0);
+ std::string simple = mOSStringSimple.substr(0, idx1);
+ if (simple.length() > 0)
+ mOSStringSimple = simple;
+ }
+ else if (ostype == "Linux")
+ {
+ // Only care about major and minor Linux versions, truncate at second '.'
+ S32 idx1 = mOSStringSimple.find_first_of(".", 0);
+ S32 idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos;
+ std::string simple = mOSStringSimple.substr(0, idx2);
+ if (simple.length() > 0)
+ mOSStringSimple = simple;
+ }
}
else
{
- mOSString.append("Unable to collect OS info");
+ mOSStringSimple.append("Unable to collect OS info");
+ mOSString = mOSStringSimple;
}
#endif
@@ -255,6 +279,11 @@ const std::string& LLOSInfo::getOSString() const
return mOSString;
}
+const std::string& LLOSInfo::getOSStringSimple() const
+{
+ return mOSStringSimple;
+}
+
const S32 STATUS_SIZE = 8192;
//static
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index fc4e02763c..332d62c186 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -51,6 +51,7 @@ public:
void stream(std::ostream& s) const;
const std::string& getOSString() const;
+ const std::string& getOSStringSimple() const;
S32 mMajorVer;
S32 mMinorVer;
@@ -64,6 +65,7 @@ public:
static U32 getProcessResidentSizeKB();
private:
std::string mOSString;
+ std::string mOSStringSimple;
};
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index f9f3bf2087..e041bc52a9 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -35,7 +35,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 18;
const S32 LL_VERSION_PATCH = 6;
-const S32 LL_VERSION_BUILD = 0;
+const S32 LL_VERSION_BUILD = 2;
const char * const LL_CHANNEL = "Second Life Release";
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 7c8fe86d2b..037357c92e 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1659,6 +1659,8 @@ LLVolume::~LLVolume()
BOOL LLVolume::generate()
{
+ llassert_always(mProfilep);
+
//Added 10.03.05 Dave Parks
// Split is a parameter to LLProfile::generate that tesselates edges on the profile
// to prevent lighting and texture interpolation errors on triangles that are
@@ -1702,41 +1704,38 @@ BOOL LLVolume::generate()
mMesh.resize(mProfilep->mProfile.size() * mPathp->mPath.size());
sNumMeshPoints += mMesh.size();
- S32 s = 0, t=0;
S32 sizeS = mPathp->mPath.size();
S32 sizeT = mProfilep->mProfile.size();
- S32 line = 0;
//generate vertex positions
// Run along the path.
- while (s < sizeS)
+ for (S32 s = 0; s < sizeS; ++s)
{
LLVector2 scale = mPathp->mPath[s].mScale;
LLQuaternion rot = mPathp->mPath[s].mRot;
- t = 0;
// Run along the profile.
- while (t < sizeT)
+ for (S32 t = 0; t < sizeT; ++t)
{
- S32 i = t + line;
- Point& pt = mMesh[i];
+ S32 m = s*sizeT + t;
+ Point& pt = mMesh[m];
pt.mPos.mV[0] = mProfilep->mProfile[t].mV[0] * scale.mV[0];
pt.mPos.mV[1] = mProfilep->mProfile[t].mV[1] * scale.mV[1];
pt.mPos.mV[2] = 0.0f;
pt.mPos = pt.mPos * rot;
pt.mPos += mPathp->mPath[s].mPos;
- t++;
}
- line += sizeT;
- s++;
}
- for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++)
+ for (std::vector<LLProfile::Face>::iterator iter = mProfilep->mFaces.begin();
+ iter != mProfilep->mFaces.end(); ++iter)
{
- mFaceMask |= mProfilep->mFaces[i].mFaceID;
+ LLFaceID id = iter->mFaceID;
+ mFaceMask |= id;
}
+
return TRUE;
}
return FALSE;
@@ -1857,7 +1856,6 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
mPathp->generate(mDetail, 0, TRUE);
mProfilep->generate(mPathp->isOpen(), mDetail, 0, TRUE);
-
S32 sizeS = mPathp->mPath.size();
S32 sizeT = mProfilep->mProfile.size();
@@ -1871,6 +1869,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
if (!data_is_empty)
{
for (S32 s = 0; s < sizeS - 1; s++)
+ {
for (S32 t = 0; t < sizeT - 1; t++)
{
// first coordinate
@@ -1896,7 +1895,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
LLVector3 cross = (p1 - p2) % (p1 - p3);
area += cross.magVec();
}
-
+ }
if (area < SCULPT_MIN_AREA)
data_is_empty = TRUE;
}
@@ -1926,8 +1925,7 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
}
line += sizeT;
}
- }
-
+ }
else
{
S32 line = 0;
@@ -1986,8 +1984,6 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
}
}
-
-
U32 index = (x + y * sculpt_width) * sculpt_components;
pt.mPos = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]);
}
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index 7144f1313e..bf5fa4073d 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -325,6 +325,11 @@ static void request(
request(url, method, body_injector, responder, LLSD(), timeout);
}
+void LLHTTPClient::head(const std::string& url, ResponderPtr responder, const F32 timeout)
+{
+ request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout);
+}
+
void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout)
{
request(url, LLURLRequest::HTTP_GET, NULL, responder, headers, timeout);
diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h
index 8c2309ccca..6323defb76 100644
--- a/indra/llmessage/llhttpclient.h
+++ b/indra/llmessage/llhttpclient.h
@@ -89,6 +89,7 @@ public:
typedef boost::intrusive_ptr<Responder> ResponderPtr;
+ static void head(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
static void get(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
static void get(const std::string& url, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
static void get(const std::string& url, const LLSD& query, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp
index 114c312aea..f9b703b52a 100644
--- a/indra/llmessage/lltemplatemessagereader.cpp
+++ b/indra/llmessage/lltemplatemessagereader.cpp
@@ -753,9 +753,9 @@ BOOL LLTemplateMessageReader::validateMessage(const U8* buffer,
if(result)
{
mCurrentRMessageTemplate->mReceiveCount++;
- lldebugst(LLERR_MESSAGE) << "MessageRecvd:"
- << mCurrentRMessageTemplate->mName
- << " from " << sender << llendl;
+ //lldebugs << "MessageRecvd:"
+ // << mCurrentRMessageTemplate->mName
+ // << " from " << sender << llendl;
}
return result;
}
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index 6a09a8bbec..42a64bdede 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -428,6 +428,13 @@ bool LLURLRequest::configure()
NULL);
switch(mAction)
{
+ case HTTP_HEAD:
+ curl_easy_setopt(mDetail->mCurl, CURLOPT_HEADER, 1);
+ curl_easy_setopt(mDetail->mCurl, CURLOPT_NOBODY, 1);
+ curl_easy_setopt(mDetail->mCurl, CURLOPT_FOLLOWLOCATION, 1);
+ rv = true;
+ break;
+
case HTTP_GET:
curl_easy_setopt(mDetail->mCurl, CURLOPT_HTTPGET, 1);
curl_easy_setopt(mDetail->mCurl, CURLOPT_FOLLOWLOCATION, 1);
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index 7cb6b6a618..5bdb6a1e69 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -71,6 +71,7 @@ public:
enum ERequestAction
{
INVALID,
+ HTTP_HEAD,
HTTP_GET,
HTTP_PUT,
HTTP_POST,
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 59741a799a..76877c2dc4 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -843,7 +843,7 @@ void LLFloater::setMinimized(BOOL minimize)
LLView* viewp = *child_it;
if (!viewp->getVisible())
{
- mMinimizedHiddenChildren.push_back(viewp);
+ mMinimizedHiddenChildren.push_back(viewp->mViewHandle);
}
viewp->setVisible(FALSE);
}
@@ -906,11 +906,14 @@ void LLFloater::setMinimized(BOOL minimize)
viewp->setVisible(TRUE);
}
- std::vector<LLView*>::iterator itor = mMinimizedHiddenChildren.begin();
- while (itor != mMinimizedHiddenChildren.end())
+ std::vector<LLViewHandle>::iterator itor = mMinimizedHiddenChildren.begin();
+ for ( ; itor != mMinimizedHiddenChildren.end(); ++itor)
{
- (*itor)->setVisible(FALSE);
- ++itor;
+ LLView* viewp = LLView::getViewByHandle(*itor);
+ if(viewp)
+ {
+ viewp->setVisible(FALSE);
+ }
}
mMinimizedHiddenChildren.clear();
@@ -2275,14 +2278,22 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
S32 min_height;
floater->getResizeLimits( &min_width, &min_height );
+ // Make sure floater isn't already smaller than its min height/width?
S32 new_width = llmax( min_width, view_width );
S32 new_height = llmax( min_height, view_height );
- if( (new_width > screen_width) || (new_height > screen_height) )
+ if( !allow_partial_outside
+ && ( (new_width > screen_width)
+ || (new_height > screen_height) ) )
{
+ // We have to force this window to be inside the screen.
new_width = llmin(new_width, screen_width);
new_height = llmin(new_height, screen_height);
+ // Still respect minimum width/height
+ new_width = llmax(new_width, min_width);
+ new_height = llmax(new_height, min_height);
+
floater->reshape( new_width, new_height, TRUE );
// Make sure the damn thing is actually onscreen.
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index d0494ea6f0..1d88501b01 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -286,7 +286,7 @@ protected:
typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t;
static handle_map_t sFloaterMap;
- std::vector<LLView*> mMinimizedHiddenChildren;
+ std::vector<LLViewHandle> mMinimizedHiddenChildren;
BOOL mHasBeenDraggedWhileMinimized;
S32 mPreviousMinimizedBottom;
@@ -429,3 +429,4 @@ extern LLFloaterView* gFloaterView;
#endif // LL_FLOATER_H
+
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index a20b21f743..ae35b656d6 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -324,6 +324,14 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
prefix += "skins";
break;
+ case LL_PATH_HTML:
+ prefix = getAppRODataDir();
+ prefix += mDirDelimiter;
+ prefix += "skins";
+ prefix += mDirDelimiter;
+ prefix += "html";
+ break;
+
case LL_PATH_MOZILLA_PROFILE:
prefix = getOSUserAppDir();
prefix += mDirDelimiter;
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index b133b7db61..4426935e5c 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -49,7 +49,8 @@ typedef enum ELLPath
LL_PATH_CHAT_LOGS = 12,
LL_PATH_PER_ACCOUNT_CHAT_LOGS = 13,
LL_PATH_MOZILLA_PROFILE = 14,
- LL_PATH_COUNT = 15
+ LL_PATH_HTML = 15,
+ LL_PATH_COUNT = 16
} ELLPath;
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index b8fd9948e3..736ff9df97 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -3537,15 +3537,15 @@ void LLWindowWin32::fillCandidateForm(const LLCoordGL& caret, const LLRect& boun
// Put the IME window at the right place (near current text input). Point coordinates should be the top of the current text line.
void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
{
- if ( LLWinImm::isAvailable() )
- {
+ if (sLanguageTextInputAllowed && LLWinImm::isAvailable())
+ {
HIMC himc = LLWinImm::getContext(mWindowHandle);
LLCoordWindow win_pos;
convertCoords( position, &win_pos );
if ( win_pos.mX >= 0 && win_pos.mY >= 0 &&
- (win_pos.mX >= 0 != sWinIMEWindowPosition.mX ) || (win_pos.mY >= 0 != sWinIMEWindowPosition.mY ) )
+ (win_pos.mX != sWinIMEWindowPosition.mX) || (win_pos.mY != sWinIMEWindowPosition.mY) )
{
COMPOSITIONFORM ime_form;
memset( &ime_form, 0, sizeof(ime_form) );
@@ -3558,22 +3558,6 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY );
}
- // Input not allowed, make sure it's set to alpha numeric mode
- if ( !sLanguageTextInputAllowed )
-
- {
- if ( LLWinImm::getOpenStatus(himc) )
- {
- DWORD conversion_mode = 0;
- DWORD sentence_mode = 0;
- LLWinImm::getConversionStatus(himc, &conversion_mode, &sentence_mode);
- if ( conversion_mode != IME_CMODE_ALPHANUMERIC )
- { // Set to no-conversion mode instead of turning it off
- LLWinImm::setConversionStatus(himc, IME_CMODE_ALPHANUMERIC, IME_SMODE_NONE );
- }
- }
- }
-
LLWinImm::releaseContext(mWindowHandle, himc);
}
}
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index ba50af9d00..3d8abe5857 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -116,7 +116,8 @@ OSStatus dialogHandler(EventHandlerCallRef handler, EventRef event, void *userda
{
// Make sure the string is terminated.
buffer[size] = 0;
- //setUserText(buffer);
+ gUserNotes = buffer;
+
llinfos << buffer << llendl;
}
@@ -152,6 +153,8 @@ bool LLCrashLoggerMac::init(void)
{
bool ok = LLCrashLogger::init();
if(!ok) return false;
+ if(mCrashBehavior != CRASH_BEHAVIOR_ASK) return true;
+
// Real UI...
OSStatus err;
@@ -215,6 +218,7 @@ void LLCrashLoggerMac::gatherPlatformSpecificFiles()
{
struct stat dw_stat;
LLString mBuf;
+ bool isLeopard = false;
// Try the 10.3 path first...
LLString dw_file_name = LLString(path) + LLString("/CrashReporter/Second Life.crash.log");
int res = stat(dw_file_name.c_str(), &dw_stat);
@@ -225,7 +229,27 @@ void LLCrashLoggerMac::gatherPlatformSpecificFiles()
dw_file_name = LLString(path) + LLString("/Second Life.crash.log");
res = stat(dw_file_name.c_str(), &dw_stat);
}
-
+
+ if(res)
+ {
+ //10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up
+ //using asterisks. Get a directory listing, search for files starting with second life,
+ //use the last one found.
+ LLString old_file_name, current_file_name, pathname, mask;
+ pathname = LLString(path) + LLString("/CrashReporter/");
+ mask = "Second Life*";
+ while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false))
+ {
+ old_file_name = current_file_name;
+ }
+ if(old_file_name != "")
+ {
+ dw_file_name = pathname + old_file_name;
+ res=stat(dw_file_name.c_str(), &dw_stat);
+ isLeopard = true;
+ }
+ }
+
if (!res)
{
std::ifstream fp(dw_file_name.c_str());
@@ -234,29 +258,32 @@ void LLCrashLoggerMac::gatherPlatformSpecificFiles()
str << fp.rdbuf();
mBuf = str.str();
- // Crash logs consist of a number of entries, one per crash.
- // Each entry is preceeded by "**********" on a line by itself.
- // We want only the most recent (i.e. last) one.
- const char *sep = "**********";
- const char *start = mBuf.c_str();
- const char *cur = start;
- const char *temp = strstr(cur, sep);
-
- while(temp != NULL)
+ if(!isLeopard)
{
- // Skip past the marker we just found
- cur = temp + strlen(sep); /* Flawfinder: ignore */
-
- // and try to find another
- temp = strstr(cur, sep);
- }
+ // Crash logs consist of a number of entries, one per crash.
+ // Each entry is preceeded by "**********" on a line by itself.
+ // We want only the most recent (i.e. last) one.
+ const char *sep = "**********";
+ const char *start = mBuf.c_str();
+ const char *cur = start;
+ const char *temp = strstr(cur, sep);
- // If there's more than one entry in the log file, strip all but the last one.
- if(cur != start)
- {
- mBuf.erase(0, cur - start);
+ while(temp != NULL)
+ {
+ // Skip past the marker we just found
+ cur = temp + strlen(sep); /* Flawfinder: ignore */
+
+ // and try to find another
+ temp = strstr(cur, sep);
+ }
+
+ // If there's more than one entry in the log file, strip all but the last one.
+ if(cur != start)
+ {
+ mBuf.erase(0, cur - start);
+ }
}
- mDebugLog["CrashInfo"] = mBuf;
+ mCrashInfo["CrashLog"] = mBuf;
}
else
{
@@ -270,10 +297,14 @@ bool LLCrashLoggerMac::mainLoop()
{
OSStatus err = noErr;
- if(err == noErr)
+ if(err == noErr && mCrashBehavior == CRASH_BEHAVIOR_ASK)
{
RunAppModalLoopForWindow(gWindow);
}
+ else if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
+ {
+ gSendReport = true;
+ }
if(gRememberChoice)
{
@@ -283,6 +314,7 @@ bool LLCrashLoggerMac::mainLoop()
if(gSendReport)
{
+ setUserText(gUserNotes);
sendCrashLogs();
}
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 85f7e2530f..a4383ffbeb 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
/* Localized versions of Info.plist keys */
CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 1.18.6.0";
-CFBundleGetInfoString = "Second Life version 1.18.6.0, Copyright 2004-2007 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 1.18.6.2";
+CFBundleGetInfoString = "Second Life version 1.18.6.2, Copyright 2004-2007 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 59822a1e4c..c753469212 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
- <string>1.18.6.0</string>
+ <string>1.18.6.2</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 8b126b7597..be31d2481e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -108,22 +108,6 @@
#include "llsdserialize.h"
-#if LL_WINDOWS && LL_LCD_COMPILE
- #include "lllcd.h"
-#endif
-
-#if LL_QUICKTIME_ENABLED
- #if LL_DARWIN
- #include <QuickTime/QuickTime.h>
- #else
- // quicktime specific includes
- #include "MacTypes.h"
- #include "QTML.h"
- #include "Movies.h"
- #include "FixMath.h"
- #endif
-#endif
-
#include "llworld.h"
#include "llhudeffecttrail.h"
#include "llvectorperfoptions.h"
@@ -179,6 +163,28 @@ static char** gTempArgV;
#include "llviewernetwork.h"
// extern EGridInfo gGridChoice;
+
+////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
+//
+#if LL_WINDOWS && LL_LCD_COMPILE
+ #include "lllcd.h"
+#endif
+//
+#if LL_QUICKTIME_ENABLED
+ #if LL_DARWIN
+ #include <QuickTime/QuickTime.h>
+ #else
+ // quicktime specific includes
+ #include "MacTypes.h"
+ #include "QTML.h"
+ #include "Movies.h"
+ #include "FixMath.h"
+ #endif
+#endif
+//
+//////
+
+
//----------------------------------------------------------------------------
// viewer.cpp - these are only used in viewer, should be easily moved.
extern void disable_win_error_reporting();
@@ -226,7 +232,6 @@ extern BOOL gPeriodicSlowFrame;
void UnloadGStreamer();
#endif
-extern void send_stats();
////////////////////////////////////////////////////////////
// All from the last globals push...
bool gVerifySSLCert = true;
@@ -246,8 +251,6 @@ LLString gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle
BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
-BOOL gInProductionGrid = FALSE;
-
BOOL gAllowIdleAFK = TRUE;
F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT;
BOOL gShowObjectUpdates = FALSE;
@@ -366,6 +369,7 @@ static LLString gWindowTitle;
static char sWindowClass[] = "Second Life";
#endif
+std::string gLoginPage;
std::vector<std::string> gLoginURIs;
static std::string gHelperURI;
@@ -374,6 +378,7 @@ static const char USAGE[] = "\n"
"options:\n"
" -login <first> <last> <password> log in as a user\n"
" -autologin log in as last saved user\n"
+" -loginpage <URL> login authentication page to use\n"
" -loginuri <URI> login server and CGI script to use\n"
" -helperuri <URI> helper web CGI prefix to use\n"
" -settings <filename> specify the filename of a\n"
@@ -623,6 +628,41 @@ int parse_args(int argc, char **argv)
gGridChoice = GRID_INFO_UMA;
sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
}
+ else if (!strcmp(argv[j], "--mohini"))
+ {
+ gGridChoice = GRID_INFO_MOHINI;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--yami"))
+ {
+ gGridChoice = GRID_INFO_YAMI;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--nandi"))
+ {
+ gGridChoice = GRID_INFO_NANDI;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--mitra"))
+ {
+ gGridChoice = GRID_INFO_MITRA;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--radha"))
+ {
+ gGridChoice = GRID_INFO_RADHA;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--ravi"))
+ {
+ gGridChoice = GRID_INFO_RAVI;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
+ else if (!strcmp(argv[j], "--aruna"))
+ {
+ gGridChoice = GRID_INFO_ARUNA;
+ sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
+ }
else if (!strcmp(argv[j], "-user") && (++j < argc))
{
if (!strcmp(argv[j], "-"))
@@ -638,6 +678,10 @@ int parse_args(int argc, char **argv)
snprintf(gGridName, MAX_STRING, "%s", ip_string.c_str()); // Flawfinder: ignore
}
}
+ else if (!strcmp(argv[j], "-loginpage") && (++j < argc))
+ {
+ LLAppViewer::instance()->setLoginPage(utf8str_trim(argv[j]));
+ }
else if (!strcmp(argv[j], "-loginuri") && (++j < argc))
{
LLAppViewer::instance()->addLoginURI(utf8str_trim(argv[j]));
@@ -998,7 +1042,7 @@ bool LLAppViewer::init()
writeSystemInfo();
// Build a string representing the current version number.
- gCurrentVersion = llformat("%d.%d.%d", LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH );
+ gCurrentVersion = llformat("%s %d.%d.%d.%d", gChannelName.c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD );
//
// Load the feature tables
@@ -1864,6 +1908,34 @@ bool LLAppViewer::initEarlyConfiguration()
{
sprintf(gGridName,"%s", gGridInfo[GRID_INFO_UMA].mName);
}
+ else if (!strcmp(argv[j], "--mohini"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MOHINI].mName);
+ }
+ else if (!strcmp(argv[j], "--yami"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_YAMI].mName);
+ }
+ else if (!strcmp(argv[j], "--nandi"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_NANDI].mName);
+ }
+ else if (!strcmp(argv[j], "--mitra"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MITRA].mName);
+ }
+ else if (!strcmp(argv[j], "--radha"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RADHA].mName);
+ }
+ else if (!strcmp(argv[j], "--ravi"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RAVI].mName);
+ }
+ else if (!strcmp(argv[j], "--aruna"))
+ {
+ sprintf(gGridName,"%s", gGridInfo[GRID_INFO_ARUNA].mName);
+ }
else if (!strcmp(argv[j], "-user") && (++j < argc))
{
if (!strcmp(argv[j], "-"))
@@ -2290,11 +2362,6 @@ bool LLAppViewer::doConfigFromCommandLine()
removeMarkerFile();
return false;
}
-
- if (!strcmp(gGridName, gGridInfo[GRID_INFO_AGNI].mName))
- {
- gInProductionGrid = TRUE;
- }
return true;
}
@@ -2447,14 +2514,12 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2();
gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB());
- gDebugInfo["OSInfo"] = mSysOSInfo.getOSString().c_str();
+ gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
// Dump some debugging info
- llinfos << gSecondLife << " version "
- << LL_VERSION_MAJOR << "."
- << LL_VERSION_MINOR << "."
- << LL_VERSION_PATCH
- << llendl;
+ llinfos << gSecondLife
+ << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
+ << llendl;
// Dump the local time and time zone
time_t now;
@@ -2466,6 +2531,7 @@ void LLAppViewer::writeSystemInfo()
// query some system information
llinfos << "CPU info:\n" << gSysCPU << llendl;
llinfos << "Memory info:\n" << gSysMemory << llendl;
+ llinfos << "OS: " << getOSInfo().getOSStringSimple() << llendl;
llinfos << "OS info: " << getOSInfo() << llendl;
}
@@ -2539,7 +2605,7 @@ bool LLAppViewer::anotherInstanceRunning()
llinfos << "Checking marker file for lock..." << llendl;
// If file doesn't exist, we create it
- // If file does exist, try to get writing privilages
+ // If file does exist, try to get writing privileges
FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); // Flawfinder: ignore
if (fMarker != NULL)
{
@@ -2554,7 +2620,7 @@ bool LLAppViewer::anotherInstanceRunning()
// *FIX:Mani - rather than have this exception here,
// LLFile::fopen() have consistent behavior across platforms?
-#if LL_DARWIN
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
// Try to lock it. On Mac, this is the only way to test if it's actually locked.
if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
{
@@ -2600,7 +2666,7 @@ void LLAppViewer::initMarkerFile()
llinfos << "Marker file is locked." << llendl;
return;
}
-#if LL_DARWIN
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
// Try to lock it. On Mac, this is the only way to test if it's actually locked.
if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
{
@@ -3043,6 +3109,17 @@ void LLAppViewer::setHelperURI(const std::string& uri)
gHelperURI = uri;
}
+void LLAppViewer::setLoginPage(const std::string& login_page)
+{
+ gLoginPage = login_page;
+}
+
+const std::string& LLAppViewer::getLoginPage()
+{
+ return gLoginPage;
+}
+
+
// Callback from a dialog indicating user was logged out.
void finish_disconnect(S32 option, void* userdata)
{
@@ -3171,6 +3248,28 @@ void LLAppViewer::saveNameCache()
}
}
+bool LLAppViewer::isInProductionGrid()
+{
+ return (GRID_INFO_AGNI == gGridChoice);
+}
+
+
+/*! @brief This class is an LLFrameTimer that can be created with
+ an elapsed time that starts counting up from the given value
+ rather than 0.0.
+
+ Otherwise it behaves the same way as LLFrameTimer.
+*/
+class LLFrameStatsTimer : public LLFrameTimer
+{
+public:
+ LLFrameStatsTimer(F64 elapsed_already = 0.0)
+ : LLFrameTimer()
+ {
+ mStartTime -= elapsed_already;
+ }
+};
+
///////////////////////////////////////////////////////
// idle()
//
@@ -3278,12 +3377,15 @@ void LLAppViewer::idle()
//
{
- static LLFrameTimer viewer_stats_timer;
+ // Initialize the viewer_stats_timer with an already elapsed time
+ // of SEND_STATS_PERIOD so that the initial stats report will
+ // be sent immediately.
+ static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
reset_statistics();
// Update session stats every large chunk of time
// *FIX: (???) SAMANTHA
- if (viewer_stats_timer.getElapsedTimeF32() >= 300.f && !gDisconnected)
+ if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)
{
llinfos << "Transmitting sessions stats" << llendl;
send_stats();
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index e97aead955..32501b4642 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -101,6 +101,8 @@ public:
const std::vector<std::string>& getLoginURIs() const;
const std::string& getHelperURI() const;
void resetURIs() const;
+ void setLoginPage(const std::string& login_page);
+ const std::string& getLoginPage();
void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user.
void badNetworkHandler(); // Cause a crash state due to bad network packet.
@@ -111,6 +113,8 @@ public:
void loadNameCache();
void saveNameCache();
+ bool isInProductionGrid();
+
// LLAppViewer testing helpers.
// *NOTE: These will potentially crash the viewer. Only for debugging.
virtual void forceErrorLLError();
@@ -169,7 +173,7 @@ private:
// Thread objects.
static LLTextureCache* sTextureCache;
static LLWorkerThread* sImageDecodeThread;
- static LLTextureFetch* sTextureFetch;
+ static LLTextureFetch* sTextureFetch;
S32 mNumSessions;
@@ -196,7 +200,6 @@ extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & ll
extern BOOL gProbeHardware;
extern LLString gDisabledMessage; // llstartup
extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
-extern BOOL gInProductionGrid;
extern LLSD gDebugInfo;
extern BOOL gAllowIdleAFK;
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 2a352dfc3d..1e04d61a1f 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2767,7 +2767,7 @@ void LLPanelLandAccess::refresh_ui()
{
childSetToolTip("Only Allow", LLString());
}
- childSetEnabled("GroupCheck", FALSE);
+ childSetEnabled("GroupCheck", TRUE); // Should always be an option (overrides age, payment restrictions)
childSetEnabled("PassCheck", FALSE);
childSetEnabled("pass_combo", FALSE);
childSetEnabled("AccessList", FALSE);
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 9170e70ccd..6128909528 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -656,7 +656,7 @@ LLSD LLFloaterReporter::gatherReport()
mCopyrightWarningSeen = FALSE;
std::ostringstream summary;
- if (!gInProductionGrid)
+ if (!LLAppViewer::instance()->isInProductionGrid())
{
summary << "Preview ";
}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index deffca3b79..90df2284c5 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -108,6 +108,7 @@ LLColor4 LLFolderViewItem::sHighlightBgColor;
LLColor4 LLFolderViewItem::sHighlightFgColor;
LLColor4 LLFolderViewItem::sFilterBGColor;
LLColor4 LLFolderViewItem::sFilterTextColor;
+LLColor4 LLFolderViewItem::sLoadingMessageTextColor;
// Default constructor
LLFolderViewItem::LLFolderViewItem( const LLString& name, LLViewerImage* icon,
@@ -132,7 +133,8 @@ LLFolderViewItem::LLFolderViewItem( const LLString& name, LLViewerImage* icon,
mStringMatchOffset(LLString::npos),
mControlLabelRotation(0.f),
mRoot( root ),
- mDragAndDropTarget(FALSE)
+ mDragAndDropTarget(FALSE),
+ mIsLoading(FALSE)
{
setIcon(icon);
if( !LLFolderViewItem::sFont )
@@ -151,6 +153,7 @@ LLFolderViewItem::LLFolderViewItem( const LLString& name, LLViewerImage* icon,
LLFolderViewItem::sHighlightFgColor = gColors.getColor( "MenuItemHighlightFgColor" );
LLFolderViewItem::sFilterBGColor = gColors.getColor( "FilterBackgroundColor" );
LLFolderViewItem::sFilterTextColor = gColors.getColor( "FilterTextColor" );
+ LLFolderViewItem::sLoadingMessageTextColor = gColors.getColor( "FolderViewLoadingMessageTextColor" );
mArrowImage = gImageList.getImage(LLUUID(gViewerArt.getString("folder_arrow.tga")), MIPMAP_FALSE, TRUE);
mBoxImage = gImageList.getImage(LLUUID(gViewerArt.getString("rounded_square.tga")), MIPMAP_FALSE, TRUE);
@@ -933,6 +936,14 @@ void LLFolderViewItem::draw()
text_left = right_x;
}
+
+ if ( mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime") )
+ {
+ sFont->renderUTF8( "Loading... ", 0, text_left, y, sLoadingMessageTextColor,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle, S32_MAX, S32_MAX, &right_x, FALSE);
+ text_left = right_x;
+ }
+
sFont->renderUTF8( mLabel, 0, text_left, y, color,
LLFontGL::LEFT, LLFontGL::BOTTOM, mLabelStyle,
S32_MAX, S32_MAX, &right_x, FALSE );
@@ -2197,6 +2208,24 @@ void LLFolderViewFolder::draw()
mControlLabelRotation = lerp(mControlLabelRotation, 0.f, LLCriticalDamp::getInterpolant(0.025f));
}
+ bool possibly_has_children = false;
+ bool up_to_date = mListener && mListener->isUpToDate();
+ if(!up_to_date && mListener && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
+ {
+ possibly_has_children = true;
+ }
+
+
+ BOOL loading = ( mIsOpen && possibly_has_children && !up_to_date );
+
+ if ( loading && !mIsLoading )
+ {
+ // Measure how long we've been in the loading state
+ mTimeSinceRequestStart.reset();
+ }
+
+ mIsLoading = loading;
+
LLFolderViewItem::draw();
// draw children if root folder, or any other folder that is open or animating to closed state
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 9fcf94d802..37b9ee6c13 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -323,6 +323,7 @@ protected:
static LLColor4 sHighlightFgColor;
static LLColor4 sFilterBGColor;
static LLColor4 sFilterTextColor;
+ static LLColor4 sLoadingMessageTextColor;
LLString mLabel;
LLString mSearchableLabel;
@@ -349,6 +350,8 @@ protected:
BOOL mDragAndDropTarget;
LLPointer<LLViewerImage> mArrowImage;
LLPointer<LLViewerImage> mBoxImage;
+ BOOL mIsLoading;
+ LLTimer mTimeSinceRequestStart;
// This function clears the currently selected item, and records
// the specified selected item appropriately for display and use
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 8c2eb2b596..c61fa7f2b6 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -383,6 +383,7 @@ class LLLandmarkBridge : public LLItemBridge
{
friend class LLInvFVBridge;
public:
+ static const LLString& prefix() { return sPrefix; }
virtual const LLString& getPrefix() { return sPrefix; }
virtual void performAction(LLFolderView* folder, LLInventoryModel* model, LLString action);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 46af3ec74f..8058ab9595 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -1879,16 +1879,15 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
payment_text = "NoPaymentInfoOnFile";
}
args["[PAYMENTINFO]"] = self->mPanelSecondLife->childGetValue(payment_text).asString();
- LLString age_text = "NotAgeVerified";
- if(age_verified)
- {
- age_text = "AgeVerified";
- }
- args["[PAYMENTINFO]"] += self->mPanelSecondLife->childGetValue(age_text).asString();
+ LLString age_text = age_verified ? "AgeVerified" : "NotAgeVerified";
+ // Do not display age verification status at this time
+ //args["[AGEVERIFICATION]"] = self->mPanelSecondLife->childGetValue(age_text).asString();
+ args["[AGEVERIFICATION]"] = " ";
}
else
{
args["[PAYMENTINFO]"] = " ";
+ args["[AGEVERIFICATION]"] = " ";
}
LLString::format(caption_text, args);
}
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 7263b11d96..bc74562d6d 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -48,6 +48,7 @@
#include "llcheckboxctrl.h"
#include "llclassifiedflags.h"
#include "llclassifiedstatsresponder.h"
+#include "llcommandhandler.h" // for classified HTML detail page click tracking
#include "llviewercontrol.h"
#include "lllineeditor.h"
#include "llfloateravatarinfo.h"
@@ -58,6 +59,7 @@
#include "llviewertexteditor.h"
#include "lltexturectrl.h"
#include "lluiconstants.h"
+#include "llurldispatcher.h" // for classified HTML detail click teleports
#include "llvieweruictrlfactory.h"
#include "llviewerparcelmgr.h"
#include "llviewerwindow.h"
@@ -70,6 +72,9 @@
const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
+//static
+std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
+
// "classifiedclickthrough"
// strings[0] = classified_id
// strings[1] = teleport_clicks
@@ -96,11 +101,45 @@ public:
return true;
}
};
-
static LLDispatchClassifiedClickThrough sClassifiedClickThrough;
-//static
-std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
+
+// We need to count classified teleport clicks from the search HTML detail pages,
+// so we need have a teleport that also sends a click count message.
+class LLClassifiedTeleportHandler : public LLCommandHandler
+{
+public:
+ // Inform the system you handle commands starting
+ // with "foo"
+ LLClassifiedTeleportHandler() : LLCommandHandler("classifiedteleport") { }
+
+ bool handle(const LLSD& tokens, const LLSD& queryMap)
+ {
+ // Need at least classified id and region name, so 2 params
+ if (tokens.size() < 2) return false;
+ LLUUID classified_id = tokens[0].asUUID();
+ if (classified_id.isNull()) return false;
+ // *HACK: construct a SLURL to do the teleport
+ std::string url("secondlife:///app/teleport/");
+ // skip the uuid we took off above, rebuild URL
+ // separated by slashes.
+ for (S32 i = 1; i < tokens.size(); ++i)
+ {
+ url += tokens[i].asString();
+ url += "/";
+ }
+ llinfos << "classified teleport to " << url << llendl;
+ // *TODO: separately track old search, sidebar, and new search
+ // Right now detail HTML pages count as new search.
+ const bool from_search = true;
+ LLPanelClassified::sendClassifiedClickMessage(classified_id, "teleport", from_search);
+ // Invoke teleport
+ return LLURLDispatcher::dispatch(url);
+ }
+};
+// Creating the object registers with the dispatcher.
+LLClassifiedTeleportHandler gClassifiedTeleportHandler;
+
LLPanelClassified::LLPanelClassified(BOOL in_finder, bool from_search)
: LLPanel("Classified Panel"),
@@ -842,7 +881,7 @@ void LLPanelClassified::onClickTeleport(void* data)
gAgent.teleportViaLocation(self->mPosGlobal);
gFloaterWorldMap->trackLocation(self->mPosGlobal);
- self->sendClassifiedClickMessage("teleport");
+ sendClassifiedClickMessage(self->mClassifiedID, "teleport", self->mFromSearch);
}
}
@@ -854,7 +893,7 @@ void LLPanelClassified::onClickMap(void* data)
gFloaterWorldMap->trackLocation(self->mPosGlobal);
LLFloaterWorldMap::show(NULL, TRUE);
- self->sendClassifiedClickMessage("map");
+ sendClassifiedClickMessage(self->mClassifiedID, "map", self->mFromSearch);
}
// static
@@ -862,7 +901,7 @@ void LLPanelClassified::onClickProfile(void* data)
{
LLPanelClassified* self = (LLPanelClassified*)data;
LLFloaterAvatarInfo::showFromDirectory(self->mCreatorID);
- self->sendClassifiedClickMessage("profile");
+ sendClassifiedClickMessage(self->mClassifiedID, "profile", self->mFromSearch);
}
// static
@@ -936,20 +975,23 @@ void LLPanelClassified::onFocusReceived(LLFocusableElement* ctrl, void* data)
}
-void LLPanelClassified::sendClassifiedClickMessage(const char* type)
+// static
+void LLPanelClassified::sendClassifiedClickMessage(const LLUUID& classified_id,
+ const char* type,
+ bool from_search)
{
// You're allowed to click on your own ads to reassure yourself
// that the system is working.
std::vector<std::string> strings;
- strings.push_back(mClassifiedID.asString());
+ strings.push_back(classified_id.asString());
strings.push_back(type);
LLUUID no_invoice;
// New classified click-through handling
LLSD body;
body["type"] = type;
- body["from_search"] = mFromSearch;
- body["classified_id"] = mClassifiedID;
+ body["from_search"] = from_search;
+ body["classified_id"] = classified_id;
std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
// If the capability exists send to the new database, otherwise send to the old one.
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 8884d1a25e..89939f243f 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -101,6 +101,7 @@ public:
static void callbackGotPriceForListing(S32 option, LLString text, void* data);
static void callbackConfirmPublish(S32 option, void* data);
+ static void sendClassifiedClickMessage(const LLUUID& classified_id, const char* type, bool from_search);
protected:
static void saveCallback(S32 option, void* data);
@@ -114,7 +115,6 @@ protected:
static void onFocusReceived(LLFocusableElement* ctrl, void* data);
static void onCommitAny(LLUICtrl* ctrl, void* data);
- void sendClassifiedClickMessage(const char* type);
BOOL checkDirty(); // Update and return mDirty
protected:
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 74936dce0c..7e97622c8b 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -147,9 +147,46 @@ void LLLoginHandler::parse(const LLSD& queryMap)
{
gGridChoice = GRID_INFO_UMA;
}
+ else if (queryMap["grid"].asString() == "mohini")
+ {
+ gGridChoice = GRID_INFO_MOHINI;
+ }
+ else if (queryMap["grid"].asString() == "yami")
+ {
+ gGridChoice = GRID_INFO_YAMI;
+ }
+ else if (queryMap["grid"].asString() == "nandi")
+ {
+ gGridChoice = GRID_INFO_NANDI;
+ }
+ else if (queryMap["grid"].asString() == "mitra")
+ {
+ gGridChoice = GRID_INFO_MITRA;
+ }
+ else if (queryMap["grid"].asString() == "radha")
+ {
+ gGridChoice = GRID_INFO_RADHA;
+ }
+ else if (queryMap["grid"].asString() == "ravi")
+ {
+ gGridChoice = GRID_INFO_RAVI;
+ }
+ else if (queryMap["grid"].asString() == "aruna")
+ {
+ gGridChoice = GRID_INFO_ARUNA;
+ }
+#if !LL_RELEASE_FOR_DOWNLOAD
+ if (gGridChoice > GRID_INFO_NONE && gGridChoice < GRID_INFO_LOCAL)
+ {
+ gSavedSettings.setS32("ServerChoice", gGridChoice);
+ }
+#endif
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */
- LLAppViewer::instance()->resetURIs();
+ if (LLAppViewer::instance()->getLoginURIs().size() == 0)
+ {
+ snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */
+ LLAppViewer::instance()->resetURIs();
+ }
LLString startLocation = queryMap["location"].asString();
@@ -303,18 +340,12 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html");
if ( web_browser )
{
+ // observe browser events
+ web_browser->addObserver( this );
+
// don't make it a tab stop until SL-27594 is fixed
web_browser->setTabStop(FALSE);
-
- // painfully build the path to the loading screen
- std::string loading_path( gDirUtilp->getExpandedFilename( LL_PATH_SKINS, "" ) );
- loading_path.append( gDirUtilp->getDirDelimiter() );
- loading_path.append( "html" );
- loading_path.append( gDirUtilp->getDirDelimiter() );
- loading_path.append( "loading" );
- loading_path.append( gDirUtilp->getDirDelimiter() );
- loading_path.append( "loading.html" );
- web_browser->navigateTo( loading_path.c_str() );
+ web_browser->navigateToLocalPage( "loading", "loading.html" );
// make links open in external browser
web_browser->setOpenInExternalBrowser( true );
@@ -328,7 +359,12 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build( this );
- LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr );
+ std::string login_page = LLAppViewer::instance()->getLoginPage();
+ if (login_page.empty())
+ {
+ login_page = childGetValue( "real_url" ).asString();
+ }
+ LLHTTPClient::head( login_page, gResponsePtr );
};
#else
mHtmlAvailable = FALSE;
@@ -350,20 +386,19 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
// mark as available
mHtmlAvailable = TRUE;
- };
+ }
}
else
// the site is not available (missing page, server down, other badness)
{
if ( web_browser )
- {
- // hide browser control (revealing default one)
- web_browser->setVisible( FALSE );
+ {
+ web_browser->navigateToLocalPage( "loading-error" , "index.html" );
- // mark as unavailable
- mHtmlAvailable = FALSE;
- };
- };
+ // mark as available
+ mHtmlAvailable = TRUE;
+ }
+ }
#else
mHtmlAvailable = FALSE;
#endif
@@ -387,13 +422,6 @@ void LLPanelLogin::draw()
{
if (!getVisible()) return;
- BOOL target_fullscreen;
- S32 target_width;
- S32 target_height;
- gViewerWindow->getTargetWindow(target_fullscreen, target_width, target_height);
-
- childSetVisible("full_screen_text", target_fullscreen);
-
glPushMatrix();
{
F32 image_aspect = 1.333333f;
@@ -604,17 +632,36 @@ void LLPanelLogin::loadLoginPage()
char* curl_channel = curl_escape(gChannelName.c_str(), 0);
char* curl_version = curl_escape(version.c_str(), 0);
+ std::string login_page = LLAppViewer::instance()->getLoginPage();
+ if (login_page.empty())
+ {
+ login_page = sInstance->childGetValue( "real_url" ).asString();
+ }
- oStr << sInstance->childGetValue( "real_url" ).asString() << "&firstname=" << firstname <<
+ // Use the right delimeter depending on how LLURI parses the URL
+ LLURI login_page_uri = LLURI(login_page);
+ std::string first_query_delimiter = "&";
+ if (login_page_uri.queryMap().size() == 0)
+ {
+ first_query_delimiter = "?";
+ }
+ oStr << login_page << first_query_delimiter << "firstname=" << firstname <<
"&lastname=" << lastname << "&location=" << location << "&region=" << curl_region <<
"&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel <<
"&version=" << curl_version;
-
curl_free(curl_region);
curl_free(curl_channel);
curl_free(curl_version);
+ LLString language(gSavedSettings.getString("Language"));
+ if(language == "default")
+ {
+ language = gSavedSettings.getString("SystemLanguage");
+ }
+
+ oStr << "&lang=" << language;
+
if (!gCmdLinePassword.empty())
{
oStr << "&password=" << gCmdLinePassword;
@@ -637,12 +684,32 @@ void LLPanelLogin::loadLoginPage()
}
#ifndef LL_RELEASE_FOR_DOWNLOAD
oStr << "&show_grid=TRUE";
+#else
+ if (gSavedSettings.getBOOL("ForceShowGrid"))
+ oStr << "&show_grid=TRUE";
#endif
// navigate to the "real" page
web_browser->navigateTo( oStr.str() );
}
+#if LL_LIBXUL_ENABLED
+void LLPanelLogin::onNavigateComplete( const EventType& eventIn )
+{
+ LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
+ if (web_browser)
+ {
+ // *HACK HACK HACK HACK!
+ /* Stuff a Tab key into the browser now so that the first field will
+ ** get the focus! The embedded javascript on the page that properly
+ ** sets the initial focus in a real web browser is not working inside
+ ** the viewer, so this is an UGLY HACK WORKAROUND for now.
+ */
+ // Commented out as it's not reliable
+ //web_browser->handleKey(KEY_TAB, MASK_NONE, false);
+ }
+}
+#endif
//---------------------------------------------------------------------------
// Protected methods
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 191e88c25b..f2a58b7b5f 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -39,6 +39,7 @@
#include "llviewerimage.h"
#include "llstring.h"
#include "llmd5.h"
+#include "llwebbrowserctrl.h"
class LLTextBox;
class LLLineEditor;
@@ -64,6 +65,9 @@ extern LLLoginHandler gLoginHandler;
class LLPanelLogin
: public LLPanel
+#if LL_LIBXUL_ENABLED
+ , public LLWebBrowserCtrlObserver
+#endif
{
public:
LLPanelLogin(const LLRect &rect, BOOL show_server,
@@ -89,6 +93,11 @@ public:
private:
static void onClickQuit(void*);
static void onClickVersion(void*);
+
+#if LL_LIBXUL_ENABLED
+ // browser observer impls
+ virtual void onNavigateComplete( const EventType& eventIn );
+#endif
private:
LLPointer<LLViewerImage> mLogoImage;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index e2e076e364..ddd73fc0df 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -5829,7 +5829,8 @@ bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly)
iterator nextiter = iter++;
LLSelectNode* node = *nextiter;
LLViewerObject* object = (*nextiter)->getObject();
- for (S32 te = 0; te < object->getNumTEs(); ++te)
+ S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); // avatars have TEs but no faces
+ for (S32 te = 0; te < num_tes; ++te)
{
if (node->isTESelected(te))
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index b0b9fd33d1..21c97c2678 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -48,6 +48,7 @@
#include "audiosettings.h"
#include "llares.h"
#include "llcachename.h"
+#include "llcameraview.h"
#include "llviewercontrol.h"
#include "lldir.h"
#include "lleconomy.h"
@@ -61,6 +62,7 @@
#include "llmd5.h"
#include "llmemorystream.h"
#include "llmessageconfig.h"
+#include "llmoveview.h"
#include "llregionhandle.h"
#include "llsd.h"
#include "llsdserialize.h"
@@ -592,6 +594,7 @@ BOOL idle_startup()
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
codec << "]";
LLMozLib::getInstance()->setBrowserAgentId( codec.str() );
+ LLMozLib::getInstance()->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort") );
#endif
//-------------------------------------------------
@@ -736,6 +739,7 @@ BOOL idle_startup()
gViewerWindow->setNormalControlsVisible( FALSE );
gLoginMenuBarView->setVisible( TRUE );
+ gLoginMenuBarView->setEnabled( TRUE );
timeout.reset();
return do_normal_idle;
@@ -1009,6 +1013,10 @@ BOOL idle_startup()
if(STATE_LOGIN_NO_DATA_YET == LLStartUp::getStartupState())
{
//lldebugs << "STATE_LOGIN_NO_DATA_YET" << llendl;
+ // If we get here we have gotten past the potential stall
+ // in curl, so take "may appear frozen" out of progress bar. JC
+ auth_desc = "Logging in...";
+ set_startup_status(progress, auth_desc.c_str(), auth_message.c_str());
if (!gUserAuthp)
{
llerrs << "No userauth in STATE_LOGIN_NO_DATA_YET!" << llendl;
@@ -1552,9 +1560,19 @@ BOOL idle_startup()
gViewerWindow->setNormalControlsVisible( TRUE );
}
gLoginMenuBarView->setVisible( FALSE );
+ gLoginMenuBarView->setEnabled( FALSE );
gFloaterMap->setVisible( gSavedSettings.getBOOL("ShowMiniMap") );
+ if (gSavedSettings.getBOOL("ShowCameraControls"))
+ {
+ LLFloaterCamera::show(NULL);
+ }
+ if (gSavedSettings.getBOOL("ShowMovementControls"))
+ {
+ LLFloaterMove::show(NULL);
+ }
+
if (!gNoRender)
{
// Move the progress view in front of the UI
@@ -1736,10 +1754,33 @@ BOOL idle_startup()
}
else
{
- llinfos << ".. initialized successfully." << llendl;
- set_startup_status(0.57f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());
+ //llinfos << "######### QuickTime version (hex) is " << std::hex << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
+ //llinfos << "######### QuickTime version is " << std::dec << LLMediaEngine::getInstance()->getQuickTimeVersion() << llendl;
+ if ( LLMediaEngine::getInstance()->getQuickTimeVersion() < LL_MIN_QUICKTIME_VERSION )
+ {
+ // turn off QuickTime if version is less than required
+ LLMediaEngine::getInstance ()->setAvailable ( FALSE );
+
+ // display a message here explaining why we disabled QuickTime
+ gViewerWindow->alertXml("QuickTimeOutOfDate");
+ }
+ else
+ {
+ llinfos << ".. initialized successfully." << llendl;
+ set_startup_status(0.57f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());
+ };
};
+ #elif LL_DARWIN
+ if ( LLMediaEngine::getInstance()->getQuickTimeVersion() < LL_MIN_QUICKTIME_VERSION )
+ {
+ // turn off QuickTime if version is less than required
+ LLMediaEngine::getInstance ()->setAvailable ( FALSE );
+
+ // display a message here explaining why we disabled QuickTime
+ gViewerWindow->alertXml("QuickTimeOutOfDate");
+ }
#endif
+
EnterMovies ();
gQuickTimeInitialized = true;
}
@@ -3583,6 +3624,7 @@ void reset_login()
{ // Hide menus and normal buttons
gViewerWindow->setNormalControlsVisible( FALSE );
gLoginMenuBarView->setVisible( TRUE );
+ gLoginMenuBarView->setEnabled( TRUE );
}
// Hide any other stuff
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 706587abb0..c17f0007c2 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -351,12 +351,6 @@ void LLFloaterTexturePicker::updateImageStats()
{
mResolutionLabel->setTextArg("[DIMENSIONS]", LLString("[? x ?]"));
}
- if (gAgent.isGodlike())
- {
- LLString tstring = "Pick: ";
- tstring.append(mTexturep->getID().asString());
- setTitle(tstring);
- }
}
}
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 8e742bd655..bb71be1aa4 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -8,15 +8,16 @@
#include "llviewerprecompiledheaders.h"
-#include "llvieweraudio.h"
#include "audioengine.h"
-#include "llviewercontrol.h"
-#include "llmediaengine.h"
+#include "audiosettings.h"
#include "llagent.h"
#include "llappviewer.h"
-#include "llvoiceclient.h"
-#include "llviewerwindow.h"
+#include "llmediaengine.h"
+#include "llvieweraudio.h"
#include "llviewercamera.h"
+#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "llvoiceclient.h"
/////////////////////////////////////////////////////////
@@ -210,7 +211,10 @@ void audio_update_wind(bool force_update)
// don't use the setter setMaxWindGain() because we don't
// want to screw up the fade-in on startup by setting actual source gain
// outside the fade-in.
- gAudiop->mMaxWindGain = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient");
+ F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
+ gAudiop->mMaxWindGain = gSavedSettings.getBOOL("MuteAmbient")
+ ? 0.f
+ : ambient_volume * ambient_volume;
last_camera_water_height = camera_water_height;
gAudiop->updateWind(gRelativeWindVec, camera_water_height);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index fdc0047f95..54396d083e 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -677,7 +677,7 @@ void init_menus()
gPopupMenuView->setBackgroundColor( color );
// If we are not in production, use a different color to make it apparent.
- if (gInProductionGrid)
+ if (LLAppViewer::instance()->isInProductionGrid())
{
color = gColors.getColor( "MenuBarBgColor" );
}
@@ -694,6 +694,9 @@ void init_menus()
// menu holder appears on top of menu bar so you can see the menu title
// flash when an item is triggered (the flash occurs in the holder)
gViewerWindow->getRootView()->addChild(gMenuHolder);
+
+ gViewerWindow->setMenuBackgroundColor(false,
+ LLAppViewer::instance()->isInProductionGrid());
// *TODO:Get the cost info from the server
const LLString upload_cost("10");
@@ -944,7 +947,7 @@ void init_client_menu(LLMenuGL* menu)
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid)
+ if (!LLAppViewer::instance()->isInProductionGrid())
{
menu->append(new LLMenuItemCheckGL("Hacked Godmode",
&handle_toggle_hacked_godmode,
@@ -1070,7 +1073,7 @@ void init_client_menu(LLMenuGL* menu)
&menu_check_control,
(void*)"ShowConsoleWindow"));
- if(gQAMode && !gInProductionGrid)
+ if(gQAMode)
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Debugging");
@@ -2637,53 +2640,40 @@ void handle_leave_god_mode(void*)
void set_god_level(U8 god_level)
{
- U8 old_god_level = gAgent.getGodLevel();
- gAgent.setGodLevel( god_level );
- show_debug_menus();
- gIMMgr->refresh();
- gParcelMgr->notifyObservers();
+ U8 old_god_level = gAgent.getGodLevel();
+ gAgent.setGodLevel( god_level );
+ show_debug_menus();
+ gIMMgr->refresh();
+ gParcelMgr->notifyObservers();
- // Some classifieds change visibility on god mode
- LLFloaterDirectory::requestClassifieds();
+ // Some classifieds change visibility on god mode
+ LLFloaterDirectory::requestClassifieds();
- // God mode changes sim visibility
- gWorldMap->reset();
- gWorldMap->setCurrentLayer(0);
+ // God mode changes sim visibility
+ gWorldMap->reset();
+ gWorldMap->setCurrentLayer(0);
- // inventory in items may change in god mode
- gObjectList.dirtyAllObjectInventory();
+ // inventory in items may change in god mode
+ gObjectList.dirtyAllObjectInventory();
+
+ if(gViewerWindow)
+ {
+ gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT,
+ LLAppViewer::instance()->isInProductionGrid());
+ }
+
+ LLString::format_map_t args;
+ if(god_level > GOD_NOT)
+ {
+ args["[LEVEL]"] = llformat("%d",(S32)god_level);
+ LLNotifyBox::showXml("EnteringGodMode", args);
+ }
+ else
+ {
+ args["[LEVEL]"] = llformat("%d",(S32)old_god_level);
+ LLNotifyBox::showXml("LeavingGodMode", args);
+ }
- LLString::format_map_t args;
- if(god_level > GOD_NOT)
- {
- args["[LEVEL]"] = llformat("%d",(S32)god_level);
- if (gInProductionGrid)
- {
- gMenuBarView->setBackgroundColor( gColors.getColor( "MenuBarGodBgColor" ) );
- gStatusBar->setBackgroundColor( gColors.getColor( "MenuBarGodBgColor" ) );
- }
- else
- {
- gMenuBarView->setBackgroundColor( gColors.getColor( "MenuNonProductionGodBgColor" ) );
- gStatusBar->setBackgroundColor( gColors.getColor( "MenuNonProductionGodBgColor" ) );
- }
- LLNotifyBox::showXml("EnteringGodMode", args);
- }
- else
- {
- args["[LEVEL]"] = llformat("%d",(S32)old_god_level);
- if (gInProductionGrid)
- {
- gMenuBarView->setBackgroundColor( gColors.getColor( "MenuBarBgColor" ) );
- gStatusBar->setBackgroundColor( gColors.getColor( "MenuBarBgColor" ) );
- }
- else
- {
- gMenuBarView->setBackgroundColor( gColors.getColor( "MenuNonProductionBgColor" ) );
- gStatusBar->setBackgroundColor( gColors.getColor( "MenuNonProductionBgColor" ) );
- }
- LLNotifyBox::showXml("LeavingGodMode", args);
- }
}
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -3990,7 +3980,8 @@ BOOL enable_take()
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && gAgent.isGodlike())
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && gAgent.isGodlike())
{
return TRUE;
}
@@ -4549,7 +4540,8 @@ class LLObjectEnableDelete : public view_listener_t
TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- (!gInProductionGrid && gAgent.isGodlike()) ||
+ (!LLAppViewer::instance()->isInProductionGrid()
+ && gAgent.isGodlike()) ||
# endif
(gSelectMgr && gSelectMgr->canDoDelete());
#endif
@@ -6276,13 +6268,7 @@ void handle_selected_texture_info(void*)
S32 height = img->getHeight();
S32 width = img->getWidth();
S32 components = img->getComponents();
- std::string image_id_string;
- if (gAgent.isGodlike())
- {
- image_id_string = image_id.asString() + " ";
- }
- msg = llformat("%s%dx%d %s on face ",
- image_id_string.c_str(),
+ msg = llformat("%dx%d %s on face ",
width,
height,
(components == 4 ? "alpha" : "opaque"));
@@ -6466,7 +6452,8 @@ class LLToolsEnableTakeCopy : public view_listener_t
all_valid = true;
#ifndef HACKED_GODLIKE_VIEWER
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (gInProductionGrid || !gAgent.isGodlike())
+ if (LLAppViewer::instance()->isInProductionGrid()
+ || !gAgent.isGodlike())
# endif
{
struct f : public LLSelectedObjectFunctor
@@ -6571,7 +6558,8 @@ BOOL enable_save_into_inventory(void*)
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && gAgent.isGodlike())
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && gAgent.isGodlike())
{
return TRUE;
}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8a4cd16c08..dd786da4d3 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -279,11 +279,6 @@ void process_logout_reply(LLMessageSystem* msg, void**)
llinfos << "process_logout_reply item not found: " << item_id << llendl;
}
}
- if(!parents.empty())
- {
- gInventory.accountForUpdate(parents);
- gInventory.notifyObservers();
- }
LLAppViewer::instance()->forceQuit();
}
@@ -1348,7 +1343,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
S32 binary_bucket_size;
LLChat chat;
- //*TODO:translate - need to fix the full name to first/last (maybe)
+ // *TODO:translate - need to fix the full name to first/last (maybe)
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, from_id);
msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, from_group);
msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, to_id);
@@ -1885,6 +1880,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
case IM_GOTO_URL:
{
+ // n.b. this is for URLs sent by the system, not for
+ // URLs sent by scripts (i.e. llLoadURL)
if (binary_bucket_size <= 0)
{
llwarns << "bad binary_bucket_size: "
@@ -5081,7 +5078,7 @@ void callback_load_url_name(const LLUUID& id, const char* first, const char* las
owner_name += last;
}
- // TODO: Talk to james about using an id instead of a name for this.
+ // For legacy name-only mutes.
if (gMuteListp->isMuted(LLUUID::null, owner_name))
{
delete infop;
@@ -5116,8 +5113,12 @@ void process_load_url(LLMessageSystem* msg, void**)
// URL is safety checked in load_url above
// Check if object or owner is muted
- if (gMuteListp->isMuted(infop->mObjectID, infop->mObjectName))
+ if (gMuteListp &&
+ (gMuteListp->isMuted(infop->mObjectID, infop->mObjectName) ||
+ gMuteListp->isMuted(infop->mOwnerID))
+ )
{
+ llinfos<<"Ignoring load_url from muted object/owner."<<llendl;
delete infop;
infop = NULL;
return;
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index caa61d6418..ad0dacbd13 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -77,6 +77,34 @@ LLGridData gGridInfo[GRID_INFO_COUNT] =
"util.uma.lindenlab.com",
"https://login.uma.lindenlab.com/cgi-bin/login.cgi",
"http://uma-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Mohini",
+ "util.mohini.lindenlab.com",
+ "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
+ "http://mohini-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Yami",
+ "util.yami.lindenlab.com",
+ "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
+ "http://yami-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Nandi",
+ "util.nandi.lindenlab.com",
+ "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
+ "http://nandi-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Mitra",
+ "util.mitra.lindenlab.com",
+ "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
+ "http://mitra-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Radha",
+ "util.radha.lindenlab.com",
+ "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
+ "http://radha-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Ravi",
+ "util.ravi.lindenlab.com",
+ "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
+ "http://ravi-secondlife.webdev.lindenlab.com/helpers/" },
+ { "Aruna",
+ "util.aruna.lindenlab.com",
+ "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
+ "http://aruna-secondlife.webdev.lindenlab.com/helpers/" },
{ "Local",
"localhost",
"https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 118897aebc..dbeaf2c1cd 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -48,6 +48,13 @@ enum EGridInfo
GRID_INFO_GANGA,
GRID_INFO_VAAK,
GRID_INFO_UMA,
+ GRID_INFO_MOHINI,
+ GRID_INFO_YAMI,
+ GRID_INFO_NANDI,
+ GRID_INFO_MITRA,
+ GRID_INFO_RADHA,
+ GRID_INFO_RAVI,
+ GRID_INFO_ARUNA,
GRID_INFO_LOCAL,
GRID_INFO_OTHER, // IP address set via -user or other command line option
GRID_INFO_COUNT
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9243263794..f242b06d9b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4511,7 +4511,8 @@ BOOL LLViewerObject::permYouOwner() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
@@ -4547,7 +4548,8 @@ BOOL LLViewerObject::permOwnerModify() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
@@ -4570,7 +4572,8 @@ BOOL LLViewerObject::permModify() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
@@ -4593,7 +4596,8 @@ BOOL LLViewerObject::permCopy() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
@@ -4616,7 +4620,8 @@ BOOL LLViewerObject::permMove() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
@@ -4639,7 +4644,8 @@ BOOL LLViewerObject::permTransfer() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!gInProductionGrid && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+ if (!LLAppViewer::instance()->isInProductionGrid()
+ && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
}
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 9d5b301d26..ec4f66d681 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -47,6 +47,7 @@
#include "llvlmanager.h"
#include "llagent.h"
#include "llviewercontrol.h"
+#include "llfloaterdirectory.h"
#include "llfloatertools.h"
#include "lldebugview.h"
#include "llfasttimerview.h"
@@ -660,10 +661,27 @@ void send_stats()
F32 run_time = F32(LLFrameTimer::getElapsedSeconds());
agent["start_time"] = ltime - run_time;
- agent["run_time"] = run_time;
+
+ // The first stat set must have a 0 run time if it doesn't actually
+ // contain useful data in terms of FPS, etc. We use half the
+ // SEND_STATS_PERIOD seconds as the point at which these statistics become
+ // valid. Data warehouse uses a 0 value here to easily discard these
+ // records with non-useful FPS values etc.
+ if (run_time < (SEND_STATS_PERIOD / 2))
+ {
+ agent["run_time"] = 0.0f;
+ }
+ else
+ {
+ agent["run_time"] = run_time;
+ }
+
// send fps only for time app spends in foreground
agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32();
agent["version"] = gCurrentVersion;
+ LLString language(gSavedSettings.getString("Language"));
+ if(language == "default") language = gSavedSettings.getString("SystemLanguage");
+ agent["language"] = language;
agent["sim_fps"] = ((F32) gFrameCount - gSimFrames) /
(F32) (gRenderStartTime.getElapsedTimeF32() - gSimLastTime);
@@ -680,7 +698,7 @@ void send_stats()
LLSD &system = body["system"];
system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB();
- system["os"] = LLAppViewer::instance()->getOSInfo().getOSString();
+ system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
system["cpu"] = gSysCPU.getCPUString();
std::string gpu_desc = llformat(
@@ -725,6 +743,17 @@ void send_stats()
fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets;
fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;
+ // Misc stats, two strings and two ints
+ // These are not expecticed to persist across multiple releases
+ // Comment any changes with your name and the expected release revision
+ // If the current revision is recent, ping the previous author before overriding
+ LLSD &misc = body["stats"]["misc"];
+
+ // misc["string_1"] =
+ // misc["string_2"] =
+ misc["int_1"] = LLFloaterDirectory::sOldSearchCount; // Steve: 1.18.6
+ misc["int_2"] = LLFloaterDirectory::sNewSearchCount; // Steve: 1.18.6
+
gViewerStats->addToMessage(body);
LLHTTPClient::post(url, body, new ViewerStatsResponder());
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 4c2a741244..277bf44e48 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -187,10 +187,13 @@ private:
extern LLViewerStats *gViewerStats;
+static const F32 SEND_STATS_PERIOD = 300.0f;
+
// The following are from (older?) statistics code found in appviewer.
void reset_statistics();
void output_statistics(void*);
void update_statistics(U32 frame_count);
+void send_stats();
extern std::map<S32,LLFrameTimer> gDebugTimers;
#endif // LL_LLVIEWERSTATS_H
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 18f07efb44..5c613052ea 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -37,6 +37,7 @@
#include "llinventory.h"
#include "llinventorymodel.h"
#include "llinventoryview.h"
+#include "llinventorybridge.h" // for landmark prefix string
#include "llviewertexteditor.h"
@@ -1391,7 +1392,9 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item )
void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item )
{
- open_landmark((LLViewerInventoryItem*)item, " preview landmark", FALSE, item->getUUID(), TRUE);
+ LLString title =
+ LLString(" ") + LLLandmarkBridge::prefix() + item->getName();
+ open_landmark((LLViewerInventoryItem*)item, title, FALSE, item->getUUID(), TRUE);
}
void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, BOOL saved )
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 4c96083337..2a496f6698 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1849,16 +1849,6 @@ void LLViewerWindow::initWorldUI()
// keep onscreen
gFloaterView->adjustToFitScreen(gFloaterMap, FALSE);
-
- if (gSavedSettings.getBOOL("ShowCameraControls"))
- {
- LLFloaterCamera::show(NULL);
- }
-
- if (gSavedSettings.getBOOL("ShowMovementControls"))
- {
- LLFloaterMove::show(NULL);
- }
gIMMgr = LLIMMgr::getInstance();
@@ -2154,8 +2144,12 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )
{
gMenuBarView->setVisible( visible );
gMenuBarView->setEnabled( visible );
+
+ // ...and set the menu color appropriately.
+ setMenuBackgroundColor(gAgent.getGodLevel() > GOD_NOT,
+ LLAppViewer::instance()->isInProductionGrid());
}
-
+
if ( gStatusBar )
{
gStatusBar->setVisible( visible );
@@ -2163,8 +2157,38 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )
}
}
-
-
+void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
+{
+ LLString::format_map_t args;
+ LLColor4 new_bg_color;
+
+ if(god_mode && LLAppViewer::instance()->isInProductionGrid())
+ {
+ new_bg_color = gColors.getColor( "MenuBarGodBgColor" );
+ }
+ else if(god_mode && !LLAppViewer::instance()->isInProductionGrid())
+ {
+ new_bg_color = gColors.getColor( "MenuNonProductionGodBgColor" );
+ }
+ else if(!god_mode && !LLAppViewer::instance()->isInProductionGrid())
+ {
+ new_bg_color = gColors.getColor( "MenuNonProductionBgColor" );
+ }
+ else
+ {
+ new_bg_color = gColors.getColor( "MenuBarBgColor" );
+ }
+
+ if(gMenuBarView)
+ {
+ gMenuBarView->setBackgroundColor( new_bg_color );
+ }
+
+ if(gStatusBar)
+ {
+ gStatusBar->setBackgroundColor( new_bg_color );
+ }
+}
void LLViewerWindow::drawDebugText()
{
@@ -2369,6 +2393,18 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
toggle_debug_menus(NULL);
}
+ // Explicit hack for debug menu.
+ if ((mask == (MASK_SHIFT | MASK_CONTROL)) &&
+ ('G' == key || 'g' == key))
+ {
+ if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
+ {
+ BOOL visible = ! gSavedSettings.getBOOL("ForceShowGrid");
+ gSavedSettings.setBOOL("ForceShowGrid", visible);
+ LLPanelLogin::loadLoginPage();
+ }
+ }
+
// Example "bug" for bug reporter web page
if ((MASK_SHIFT & mask)
&& (MASK_ALT & mask)
@@ -2410,6 +2446,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
{
return TRUE;
}
+ // let menus handle navigation keys
+ if (gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE))
+ {
+ return TRUE;
+ }
// Traverses up the hierarchy
LLUICtrl* keyboard_focus = gFocusMgr.getKeyboardFocus();
@@ -2515,6 +2556,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
{
return TRUE;
}
+
+ // give menus a chance to handle keys
+ if (gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))
+ {
+ return TRUE;
+ }
// don't pass keys on to world when something in ui has focus
return gFocusMgr.childHasKeyboardFocus(mRootView)
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 36225cb7d3..612484e2dc 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -181,6 +181,7 @@ public:
// Hide normal UI when a logon fails, re-show everything when logon is attempted again
void setNormalControlsVisible( BOOL visible );
+ void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false);
// Handle the application becoming active (frontmost) or inactive
//BOOL handleActivate(BOOL activate);
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index c6a3ff192b..1e800a372e 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3426,7 +3426,10 @@ void LLVOAvatar::updateCharacter(LLAgent &agent)
// AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
// AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
- F32 gain = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : (.30f * gSavedSettings.getF32("AudioLevelAmbient"));
+ F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
+ F32 gain = gSavedSettings.getBOOL("MuteAmbient")
+ ? 0.f
+ : (.50f * ambient_volume * ambient_volume);
LLUUID& step_sound_id = getStepSound();
LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 6867cacfa4..70037d3c20 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -723,6 +723,7 @@ void LLVOVolume::sculpt()
S32 current_discard = getVolume()->getSculptLevel();
+ llassert_always(current_discard >= -2 && current_discard <= max_discard);
if (current_discard == discard_level) // no work to do here
return;
@@ -756,7 +757,7 @@ BOOL LLVOVolume::calcLOD()
S32 cur_detail = 0;
- F32 radius = mVolumep->mLODScaleBias.scaledVec(getScale()).magVec();
+ F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).magVec();
F32 distance = mDrawable->mDistanceWRTCamera;
distance *= sDistanceFactor;
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
index 13c5ac3bbb..949ea71c56 100644
--- a/indra/newview/llwindebug.cpp
+++ b/indra/newview/llwindebug.cpp
@@ -35,7 +35,6 @@
#include <tchar.h>
#include <tlhelp32.h>
-#include <atlbase.h>
#include "llappviewer.h"
#include "llwindebug.h"
#include "llviewercontrol.h"
@@ -56,11 +55,11 @@ LLSD Block for Windows Dump Information
<string></string>
<key>Module</key>
<string></string>
- <key>Date Modified</key>
+ <key>DateModified</key>
<string></string>
- <key>Exception Code</key>
+ <key>ExceptionCode</key>
<string></string>
- <key>Exception Read/Write Address</key>
+ <key>ExceptionRead/WriteAddress</key>
<string></string>
<key>Instruction</key>
<string></string>
@@ -75,11 +74,11 @@ LLSD Block for Windows Dump Information
<array>
<!-- One map per stack frame -->
<map>
- <key>Module Name</key>
+ <key>ModuleName</key>
<string></string>
- <key>Module Base Address</key>
+ <key>ModuleBaseAddress</key>
<string></string>
- <key>Module Offset Address</key>
+ <key>ModuleOffsetAddress</key>
<string></string>
<key>Parameters</key>
<array>
@@ -93,8 +92,6 @@ LLSD Block for Windows Dump Information
*/
-// From viewer.h
-extern BOOL gInProductionGrid;
extern void (*gCrashCallback)(void);
@@ -124,6 +121,9 @@ MODULE32_NEST Module32Next_;
#define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls
#define NL L"\r\n" //new line
+//Windows Call Stack Construction idea from
+//http://www.codeproject.com/tools/minidump.asp
+
//****************************************************************************************
BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr)
//****************************************************************************************
@@ -168,9 +168,6 @@ void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info)
// pException can be either GetExceptionInformation() or NULL.
// If pException = NULL - get current call stack.
{
-
- USES_CONVERSION;
-
LPWSTR Module_Name = new WCHAR[MAX_PATH];
PBYTE Module_Addr = 0;
@@ -210,9 +207,9 @@ void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info)
if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr))
{
// Save module's address and full path.
- info["Call Stack"][i]["Module Name"] = W2A(Module_Name);
- info["Call Stack"][i]["Module Address"] = (int)Module_Addr;
- info["Call Stack"][i]["Call Offset"] = (int)(Ebp->Ret_Addr - Module_Addr);
+ info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name);
+ info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr;
+ info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr);
LLSD params;
// Save 5 params of the call. We don't know the real number of params.
@@ -225,9 +222,9 @@ void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info)
params[j] = (int)Ebp->Param[j];
}
}
- info["Call Stack"][i]["Parameters"] = params;
+ info["CallStack"][i]["Parameters"] = params;
}
- info["Call Stack"][i]["Return Address"] = (int)Ebp->Ret_Addr;
+ info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr;
}
} //Get_Call_Stack
@@ -257,12 +254,10 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
//*************************************************************
// Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str.
{
- USES_CONVERSION;
-
LLSD info;
LPWSTR Str;
int Str_Len;
- int i;
+// int i;
LPWSTR Module_Name = new WCHAR[MAX_PATH];
PBYTE Module_Addr;
HANDLE hFile;
@@ -276,10 +271,9 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
return NULL;
Get_Version_Str(info);
-
GetModuleFileName(NULL, Str, MAX_PATH);
- info["Process"] = W2A(Str);
+ info["Process"] = ll_convert_wide_to_string(Str);
// If exception occurred.
if (pException)
@@ -290,7 +284,7 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
// If module with E.ExceptionAddress found - save its path and date.
if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr))
{
- info["Module"] = W2A(Module_Name);
+ info["Module"] = ll_convert_wide_to_string(Module_Name);
if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
@@ -300,17 +294,17 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time);
FileTimeToSystemTime(&Local_File_Time, &T);
- info["Date Modified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear);
+ info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear);
}
CloseHandle(hFile);
}
}
else
{
- info["Exception Addr"] = (int)E.ExceptionAddress;
+ info["ExceptionAddr"] = (int)E.ExceptionAddress;
}
- info["Exception Code"] = (int)E.ExceptionCode;
+ info["ExceptionCode"] = (int)E.ExceptionCode;
/*
//TODO: Fix this
@@ -326,11 +320,12 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
// Save instruction that caused exception.
- Str_Len = 0;
+ /*
+ LLString str;
for (i = 0; i < 16; i++)
- Str_Len += wsprintf(Str + Str_Len, L" %02X", PBYTE(E.ExceptionAddress)[i]);
- info["Instruction"] = W2A(Str);
-
+ str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]);
+ info["Instruction"] = str;
+ */
LLSD registers;
registers["EAX"] = (int)C.Eax;
registers["EBX"] = (int)C.Ebx;
@@ -348,10 +343,6 @@ LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
// Save call stack info.
Get_Call_Stack(pException, info);
- if (Str[0] == NL[0])
- lstrcpy(Str, Str + sizeof(NL) - 1);
-
-
return info;
} //Get_Exception_Info
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp
index b29caf91f4..21a0771d26 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/test/llhttpclient_tut.cpp
@@ -341,6 +341,14 @@ namespace tut
ensure_equals("echoed result matches", body.size(), expected.size());
}
+ template<> template<>
+ void HTTPClientTestObject::test<8>()
+ {
+ LLHTTPClient::head("http://www.secondlife.com/", newResult());
+ runThePump();
+ ensureStatusOK();
+ ensure("result object wasn't destroyed", mResultDeleted);
+ }
}
#endif // !LL_WINDOWS
diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h
index d954823c74..3d43115d42 100644
--- a/indra/win_crash_logger/StdAfx.h
+++ b/indra/win_crash_logger/StdAfx.h
@@ -51,9 +51,6 @@
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
-#include <tchar.h>
-#include <atlbase.h>
-
// Local Header Files
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 007e2b0ed5..ab8f6939f1 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -48,6 +48,7 @@
#include "llsdserialize.h"
#define MAX_LOADSTRING 100
+#define MAX_STRING 2048
const char* const SETTINGS_FILE_HEADER = "version";
const S32 SETTINGS_FILE_VERSION = 101;
@@ -58,12 +59,33 @@ HINSTANCE hInst= NULL; // current instance
TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
+LLString gProductName;
HWND gHwndReport = NULL; // Send/Don't Send dialog
HWND gHwndProgress = NULL; // Progress window
HCURSOR gCursorArrow = NULL;
HCURSOR gCursorWait = NULL;
BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog?
std::stringstream gDXInfo;
+bool gSendLogs = false;
+
+
+//Conversion from char* to wchar*
+//Replacement for ATL macros, doesn't allocate memory
+//For more info see: http://www.codeguru.com/forum/showthread.php?t=337247
+void ConvertLPCSTRToLPWSTR (const char* pCstring, WCHAR* outStr)
+{
+ if (pCstring != NULL)
+ {
+ int nInputStrLen = strlen (pCstring);
+ // Double NULL Termination
+ int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2;
+ if (outStr)
+ {
+ memset (outStr, 0x00, sizeof (WCHAR)*nOutputStrLen);
+ MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, outStr, nInputStrLen);
+ }
+ }
+}
void write_debug(const char *str)
{
@@ -116,27 +138,30 @@ void sleep_and_pump_messages( U32 seconds )
// Include product name in the window caption.
void LLCrashLoggerWindows::ProcessCaption(HWND hWnd)
{
- TCHAR templateText[1024]; /* Flawfinder: ignore */
- TCHAR finalText[2048]; /* Flawfinder: ignore */
+ TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */
+ TCHAR header[MAX_STRING];
+ std::string final;
GetWindowText(hWnd, templateText, sizeof(templateText));
- swprintf(finalText, sizeof(CA2T(mProductName.c_str())), templateText, CA2T(mProductName.c_str())); /* Flawfinder: ignore */
- SetWindowText(hWnd, finalText);
+ final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str());
+ ConvertLPCSTRToLPWSTR(final.c_str(), header);
+ SetWindowText(hWnd, header);
}
// Include product name in the diaog item text.
void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem)
{
- TCHAR templateText[1024]; /* Flawfinder: ignore */
- TCHAR finalText[2048]; /* Flawfinder: ignore */
+ TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */
+ TCHAR header[MAX_STRING];
+ std::string final;
GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText));
- swprintf(finalText, sizeof(CA2T(mProductName.c_str())), templateText, CA2T(mProductName.c_str())); /* Flawfinder: ignore */
- SetDlgItemText(hWnd, nIDDlgItem, finalText);
+ final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str());
+ ConvertLPCSTRToLPWSTR(final.c_str(), header);
+ SetDlgItemText(hWnd, nIDDlgItem, header);
}
bool handle_button_click(WORD button_id)
{
- USES_CONVERSION;
// Is this something other than Send or Don't Send?
if (button_id != IDOK
&& button_id != IDCANCEL)
@@ -166,13 +191,14 @@ bool handle_button_click(WORD button_id)
// Send the crash report if requested
if (button_id == IDOK)
{
+ gSendLogs = TRUE;
WCHAR wbuffer[20000];
GetDlgItemText(gHwndReport, // handle to dialog box
IDC_EDIT1, // control identifier
wbuffer, // pointer to buffer for text
20000 // maximum size of string
);
- LLString user_text(T2CA(wbuffer));
+ LLString user_text(ll_convert_wide_to_string(wbuffer));
// Activate and show the window.
ShowWindow(gHwndProgress, SW_SHOW);
// Try doing this second to make the progress window go frontmost.
@@ -276,11 +302,10 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
bool LLCrashLoggerWindows::mainLoop()
{
- USES_CONVERSION;
-
// Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
// win_crash_logger.rc has been edited by hand.
// Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass)
+ gProductName = mProductName;
gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL);
ProcessCaption(gHwndProgress);
@@ -294,22 +319,23 @@ bool LLCrashLoggerWindows::mainLoop()
else if (mCrashBehavior == CRASH_BEHAVIOR_ASK)
{
gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL);
-
+ LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 1, 0);
// Include the product name in the caption and various dialog items.
ProcessCaption(gHwndReport);
ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG);
// Update the header to include whether or not we crashed on the last run.
- TCHAR header[2048];
- CA2T product(mProductName.c_str());
+ std::string headerStr;
+ TCHAR header[MAX_STRING];
if (mCrashInPreviousExec)
{
- swprintf(header, _T("%s appears to have crashed or frozen the last time it ran."), product); /* Flawfinder: ignore */
+ headerStr = llformat("%s appears to have crashed or frozen the last time it ran.", mProductName.c_str());
}
else
{
- swprintf(header, _T("%s appears to have crashed."), product); /* Flawfinder: ignore */
+ headerStr = llformat("%s appears to have crashed.", mProductName.c_str());
}
+ ConvertLPCSTRToLPWSTR(headerStr.c_str(), header);
SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header);
ShowWindow(gHwndReport, SW_SHOW );
@@ -338,11 +364,15 @@ void LLCrashLoggerWindows::updateApplication(LLString message)
bool LLCrashLoggerWindows::cleanup()
{
- if(mSentCrashLogs) show_progress("Done");
- else show_progress("Could not connect to servers, logs not sent");
- sleep_and_pump_messages(3);
-
+ if(gSendLogs)
+ {
+ if(mSentCrashLogs) show_progress("Done");
+ else show_progress("Could not connect to servers, logs not sent");
+ sleep_and_pump_messages(3);
+ }
PostQuitMessage(0);
return true;
}
+
+