diff options
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 << "®ion=" << 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; } + + |